
function get(id) {
	if(typeof(id)=='object')
		return id;
	return document.getElementById(id);
}

function unid(obj) {
    if(typeof(obj)=='object') {
        if(!obj.id)
            obj.id = '_unid_'+Math.random();
        return obj.id;
    }
    else
        return obj;
}


function ajax_get_req() {
    var obj = null;
    try {
        obj = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
        try {
            obj = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
            obj = null;
        }
    }
    
    if (!obj && typeof XMLHttpRequest != "undefined") {
        obj = new XMLHttpRequest();
    }
    
    return obj;
}

// call a url
function ajax_get_url(url, async, func) {
    var obj = ajax_get_req();
    
    if(!obj)
        return;
    
    if(func) {
        obj.onreadystatechange = function() {
            if(obj.readyState==4)
            func(obj);
        };
    }
    obj.open("GET", url, async);
    obj.send(null);
}

function ajax_post_url(url, data, async, func)
{ 
    var obj = ajax_get_req();

    if (!obj)
        return;
    
    obj.open("POST", url, async);
    if(func) {
        obj.onreadystatechange = function() {
            if(obj.readyState==4) func(obj);
        };
    }
    obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var code = "";
    var sep = "";
    for(var i=0; i<data.length; i++) {
        code += sep + encodeURIComponent(data[i].name) + '=' + encodeURIComponent(data[i].value);
        sep = '&';
    }
    //alert(code);
    obj.send(code);
}

function ajax_get_form_data(form, submit_button) {
    var data = new Array();
    for(var i=0; i<form.elements.length; i++) {
        var e = form.elements[i];
        var val = null;
        switch(e.type) {
        case 'checkbox':
        case 'radio':
            if(e.checked) val = e.value;
            break;
        case 'select-one':
            if(e.options.length>0)
                val = e.options[e.selectedIndex].value;
            break;
        case 'button':
        case 'submit':
            if(e.name==submit_button)
                val = e.value;
            break;
        default:
            val = e.value;
        }
        if(val!=null)
            data.push({'name':e.name, 'value':val});
    }
    return data;

}

function ajax_url_encode_dict(dict)
{ 
        var result = "";
        var sep = '';
        for (var i=0; i<dict.length; i++) {
                result += sep + encodeURIComponent(dict[i].name) + "=" + encodeURIComponent(dict[i].value);
                sep = '&';
        }
        return result;
}

function ajax_get_form_url(form) {
    var data = ajax_get_form_data(form);
    return ajax_url_encode_dict(data);
}

function ajax_load(id, url, timer, func) {
    var b = get(id);
    id = unid(b);
    b.loading = true;
    if(timer) {
        //t = ajax_timer(id, 0);
        b.innerHTML = '<div style="color: #ff924d; font-weight: bold">Loading, please wait... <img src="/img/qrf_loading.gif"></div>';
    }
    var handler = function(obj) {
        var b = get(id);
        b.loading = false;
        b.innerHTML = obj.responseText;
        ajax_exec_js(obj.responseText);
        if(func) func(obj);
    }
    ajax_get_url(url, true, handler);
}

function ajax_exec_js(code) {
    var p;
    var start_tag = '<script type="text/javascript">';
    var end_tag = '</script>';
    var start_len = start_tag.length;
    var end_len = end_tag.length;
    
    while(0<=(p=code.indexOf(start_tag))) {
        p+=start_len;
        var r = code.indexOf(end_tag);
        var js_code = code.substring(p, r);
        eval(js_code);
        //alert(js_code);
        code = code.substring(r+end_len);
    }
    /*
    while(0<=(p=code.indexOf('<script'))) {
        var r = code.indexOf('</script>');
        var js_code = code.substring(p, r+9);
        alert(js_code);
        document.write('x');
        document.write(js_code);
        code = code.substring(r+end_len);
    }
    */
}

function ajax_timer(id, pos) {
    var b = get(id);
    if(b.loading) {
        var c = '|/-\\'.substr(pos, 1);
        get(id).innerHTML = "Loading... "+c;
        pos = (pos+1)%4;
        setTimeout("ajax_timer('"+id+"', "+pos+")", 500);
    }
}

function ajax_submit_form(form, func, submit_button_name) {
    var url = form.action? form.action: window.location.pathname;
    var data = ajax_get_form_data(form, submit_button_name);
    var method = form.method.toUpperCase();

    if(method=='POST') {
        ajax_post_url(url, data, true, func);   
    }
    else {
        ajax_get_url(url, true, func);
    }
}


function execOnSuccess(stateChangeCallback)
{
        return function(xmlHttpReq)
                {
                        if (xmlHttpReq.readyState == 4 &&
                                        xmlHttpReq.status == 200)
                                stateChangeCallback(xmlHttpReq);
                        //alert(xmlHttpReq + " " + xmlHttpReq.readyState + " " + xmlHttpReq.status);
                };
}


function postFormByForm(form, async, successCallback) {
        var formVars = new Array();
        for (var i = 0; i < form.elements.length; i++)
        {
                var formElement = form.elements[i];
                
                // Special handling for checkboxes (we need an array of selected checkboxes..)!
                if(formElement.type=='checkbox' && !formElement.checked) {
                        continue;
                } 
                var v=new Object;
                v.name=formElement.name;
                v.value=formElement.value;
                formVars.push(v);               
        } 
        postUrl(form.action, urlEncodeDict(formVars), async, execOnSuccess(successCallback));
}

function postForm(formName, async, successCallback)
{
        // postFormByName
        var form = document.forms[formName];
        return postFormByForm(form, async, successCallback);
}

function replaceDivContents(xmlHttpRequest, dstDivId)
{
        var dstDiv = document.getElementById(dstDivId);
        dstDiv.innerHTML = xmlHttpRequest.responseText;
}


function getUrlXMLResponseCallback(xmlHttpReq) {
        if(xmlHttpReq.responseXML == null) {
                alert("Error while processing your request.");
                return;
        }
        var root_node = getRootNode(xmlHttpReq);
        var return_code = getNodeValue(root_node, 'return_code');
        //alert("return code " + return_code);

        if(return_code == 0) {
                redirect_val = getNodeValue(root_node, 'redirect_on_success');
                if(redirect_val != null) {
                        window.location=redirect_val;
                } else {
                        success_message = getNodeValue(root_node, 'success_message');
                        if (success_message != null) {
                                alert(success_message);
                        }
                        if(this.successCallback != null) {
                                this.successCallback(xmlHttpReq);
                        }
                }
        } else {
                var error_msg = getNodeValue(root_node, 'error_message');
                if (error_msg == null || error_msg.length == 0) {
                        if(return_code==2) {
                                error_msg = "You must be logged in to perform this operation.";
                        } else {
                                error_msg = "An error occured while performing this operation.";
                        }
                }
                alert(error_msg)
        }
}

function getUrlXMLResponseCallbackFillDiv(xmlHttpReq) {
        getUrlXMLResponseCallback(xmlHttpReq);
        document.getElementById(this.div_id).innerHTML=getNodeValue(xmlHttpReq.responseXML, "html_content");
}

function getNodeValue(obj,tag)
{
        node=obj.getElementsByTagName(tag);
        if(node!=null && node.length>0) {
                return node[0].firstChild.nodeValue;
        } else {
                return null;
        }
}

function getRootNode(xmlHttpReq) {
        return xmlHttpReq.responseXML.getElementsByTagName('root')[0];
}

function getUrlXMLResponse(url, successCallback) {
        this.successCallback = successCallback;
        this.urlResponseCallback = getUrlXMLResponseCallback;
        getUrl(url, true, execOnSuccess(this.urlResponseCallback)) 
}

function getUrlXMLResponseAndFillDiv(url, div_id, successCallback) {
        this.successCallback = successCallback;
        this.urlResponseCallback = getUrlXMLResponseCallbackFillDiv;
        this.div_id = div_id;
        getUrl(url, true, execOnSuccess(this.urlResponseCallback)) 
}

function postUrlXMLResponse(url, data, successCallback) {
        this.successCallback = successCallback;
        this.urlResponseCallback = getUrlXMLResponseCallback;
        postUrl(url, data, true, execOnSuccess(this.urlResponseCallback))
}

function confirmAndPostUrlXMLResponse(url, confirmMessage, data, successCallback) {
        if (confirm(confirmMessage)) {
                postUrlXMLResponse(url, data, successCallback);
        }
}

function postFormXMLResponse(formName, successCallback) {
        this.successCallback = successCallback;
        postForm(formName, true, execOnSuccess(getUrlXMLResponseCallback))
}


