﻿function AjaxArea(divContainerID)
{
    var divContainer = document.getElementById(divContainerID);
    
    var m_NavHandler = null;    
    var m_Request = null;
    var m_Src = "";
    
    function construct()
    {
        m_NavHandler = Nav.CreateHandler("Details", NavCallback);
    }
    
    // Creates a string to send as data in POST requests based
    // on the values of all form fields within the container.
    function FormDataString(element)
    {
        if(!element)
            element = divContainer;
            
        if(!element.getElementsByTagName)
            return null;
            
        var data = "";

        // handle input elements
        var inputs = element.getElementsByTagName("input");
        for(var i = 0; i < inputs.length; i++) {
            var input = inputs[i];
            var type = input.type.toLowerCase();
            
            if(type == "hidden" || type == "text" || (type == "radio" && input.checked))
                data += "&" + escape(input.name) + "=" + escape(input.value);
            else if(type == "checkbox")
                data += "&" + escape(input.name) + "=" + (input.checked ? "on" : "off");
        }
        
        // handle textarea elements
        inputs = element.getElementsByTagName("textarea");
        for(var i = 0; i < inputs.length; i++) {
            var input = inputs[i];
            data += "&" + escape(input.name) + "=" + escape(input.value);
        }
        
        // handle select elements
        inputs = element.getElementsByTagName("select");
        for(var i = 0; i < inputs.length; i++) {
            var input = inputs[i];
            data += "&" + escape(input.name) + "=" + escape(input.options[input.selectedIndex].value);
        }
        
        if(data.length > 0)
            data = data.substring(1, data.length);
        
        return data;
    }
    
    function CreateXMLHttpRequestObject()
    {
		var tmp;
		
		if(window.XMLHttpRequest) {
			tmp = new XMLHttpRequest();
			if(tmp.overrideMimeType)
				tmp.overrideMimeType("text/plain");
		} else if(window.ActiveXObject) {
			try {
				tmp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					tmp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e2) {}
			}
		}
		
		return tmp;
	}
	
	function HandleResponse()
	{
	    if(m_Request.readyState != 4 || m_Request.status != 200)
	        return;
	        
	    var html = m_Request.responseText;
	    html = html.substring(html.indexOf("<!--CONTENTSTART-->"), html.lastIndexOf("<!--CONTENTEND-->") - 1);
	    divContainer.innerHTML = html;
	    
	    m_NavHandler.SetParamValue("Src", m_Src);
	    m_NavHandler.SaveParamList();
	    Nav.UpdateHash();

        // set the onclick function of any submit buttons to the Post function
        var inputs = divContainer.getElementsByTagName("input");
        for(var i = 0; i < inputs.length; i++) {
            if(inputs[i].type.toLowerCase() == "submit") {
                inputs[i].type = "button";
                inputs[i].onclick = Post;
            }
        }
	}
	
	function NavCallback()
	{
	    Update(m_NavHandler.GetParamValue("Src"));
	}
	
	function Update(src, data)
	{
	    m_Src = src;
	    
	    if(src == null) {
	        m_NavHandler.SetParamValue("Src", null);
	        divContainer.innerHTML = "";
	        return;
	    }
	    
	    m_Request = CreateXMLHttpRequestObject();
	    if(!m_Request)
	        return;
	        
	    // add time parameter to query string to prevent caching
	    if(src.indexOf("&time=") == -1 && src.indexOf("?time=") == -1) {
	        if(src.indexOf('?') > 0)
	            src += "&";
	        else
	            src += "?";
	        var d = new Date();
	        src += "time=" + d.getTime();
	    }

        m_Request.onreadystatechange = HandleResponse;
        
        // if there's data, send a POST request; otherwise, use GET
	    if(data != null) {
	        m_Request.open("POST", src, true);
	        m_Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	        m_Request.setRequestHeader("Content-Length", data.length);
	    } else {
	        m_Request.open("GET", src, true);
	    }
	    m_Request.send(data);
	}
	
	function Post()
	{
	    Update(m_Src, FormDataString());
	}
	
	this.Update = function(src, data)
	{
	    Update(src, data);
	}
	
	this.Post = function()
	{
	    Post();
	}
	
	construct();
}
