﻿if (!window.XMLHttpRequest)
{
    window.XMLHttpRequest = function()
    {
        var progIDs = [ 'Mxsml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP' ];
        
        for (var i = 0, l = progIDs.length; i < l; i++)
        {
            try
            {
                return new ActiveXObject(progIDs[i]);
            }
            catch (ex) { }
        }
        
        return null;
    }
}

window.mvcAjax = {};

window.mvcAjax.xhr = null;
window.mvcAjax.panels = null;

mvcAjax.get = function(data, e)
{
    var xhr = window.mvcAjax.xhr = new XMLHttpRequest();
    xhr.onreadystatechange = mvcAjax.onReadyStateChange;
    xhr.open("GET", mvcAjax._getUrl(data), true);
    xhr.setRequestHeader("MvcAjax_AvailablePanels", mvcAjax._getAllAreaIds());
    xhr.send(null);
    
    return mvcAjax._preventDefault(e);
}

mvcAjax.post = function(data, e)
{
    var xhr = window.mvcAjax.xhr = new XMLHttpRequest();
    xhr.onreadystatechange = mvcAjax.onReadyStateChange;
    xhr.open("POST", mvcAjax._getUrl(data), true);
    xhr.setRequestHeader("MvcAjax_AvailablePanels", mvcAjax._getAllAreaIds());
    xhr.send(null);
    
    return mvcAjax._preventDefault(e);
}

mvcAjax._getAllAreaIds = function()
{
    var array = [];
    for (var id in window.mvcAjax.panels)
    {
        array.push(id);
    }
    
    return array.join(";");
}

mvcAjax._getUrl = function(data)
{
    if ((typeof data) == "string")
    {
        return data;
    }
    else if (data.action)
    {
        return data.action;
    }
    else if (data.href)
    {
        return data.href;
    }
}

mvcAjax.submit = function(element, e)
{
    var form = element;
    while (form.tagName != "FORM") form = form.parentNode;    
    
    var formBodyBuilder = [];
    
    var count = form.elements.length;
    for (var i = 0; i < count; i++)
    {
        var element = form.elements[i];
        var name = element.name;
        
        if (typeof(name) === "undefined" || (name === null) || (name.length === 0))
        {
            continue;
        }

        var tagName = element.tagName;

        if (tagName === 'INPUT')
        {
            var type = element.type;
            
            if ((type === 'text') ||
                (type === 'password') ||
                (type === 'hidden') ||
                (((type === 'checkbox') || (type === 'radio')) && element.checked)) {
                
                formBodyBuilder.push(encodeURIComponent(name));
                formBodyBuilder.push('=');
                formBodyBuilder.push(encodeURIComponent(element.value));
                formBodyBuilder.push("&");
            }
        }
        else if (tagName === 'SELECT')
        {
            var optionCount = element.options.length;
            for (var j = 0; j < optionCount; j++)
            {
                var option = element.options[j];
                if (option.selected)
                {
                    formBodyBuilder.push(encodeURIComponent(name));
                    formBodyBuilder.push('=');
                    formBodyBuilder.push(encodeURIComponent(option.value));
                    formBodyBuilder.push("&");
                }
            }
        }
        else if (tagName === 'TEXTAREA')
        {
            formBodyBuilder.push(encodeURIComponent(name));
            formBodyBuilder.push('=');
            formBodyBuilder.push(encodeURIComponent(element.value));
            formBodyBuilder.push("&");
        }
    }
    
    var xhr = window.mvcAjax.xhr = new XMLHttpRequest();
    xhr.onreadystatechange = mvcAjax.onReadyStateChange;
    xhr.open("POST", form.action, true);
    xhr.setRequestHeader("MvcAjax_AvailablePanels", window.mvcAjax._getAllAreaIds());
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;  charset=utf-8');
    
    var formBody = formBodyBuilder.join("");
    xhr.send(formBody.substring(0, formBody.length - 1));
    
    return mvcAjax._preventDefault(e);
}

mvcAjax._preventDefault = function(e)
{
    if (e)
    {
        if (e.preventDefault)
        {
            e.preventDefault();
        }
        else
        {
            e.returnValue = false;
        }
    }
    
    return false;
}

mvcAjax.onReadyStateChange = function()
{
    var xhr = window.mvcAjax.xhr;
    if (xhr.readyState === 4)
    {
        var updates = eval("(" + xhr.responseText + ")");
        for (var id in updates)
        {
            if (mvcAjax.panels[id])
            {
                mvcAjax.panels[id].innerHTML = updates[id];
            }
            // document.getElementById(id).innerHTML = updates[id];
        }
    }
}
