﻿
/* Generic AJAX div contents update from http_request */
function updateContents(http_request, div_id) 
{
	if (http_request.readyState == 4) 
	{
		if (http_request.status == 200) 
		{
			var html = http_request.responseText + '<img src="images/spacer.gif" id="image_'+div_id+'">';
			document.getElementById(div_id).innerHTML=(html);
		} 
		else if (http_request.status != 0) 
		{
			var msg = 'There was a problem with the request:'+http_request.status;

			document.getElementById(div_id).innerHTML=msg;
			
		}
	}
}

/* Generic AJAX for populating a div with content from a URL */
    function makeRequest(url, div_id) {
        var http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/html');
                // See note below about this line
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        re = new RegExp("[?]")
        if (re.exec(url))
			qsChar="&";
		else
			qsChar="?";
        
//        alert(qsChar);
        
        http_request.onreadystatechange = function() { updateContents(http_request, div_id); };
        http_request.open('GET', url + qsChar + "live=" + new Date().getTime(), true);
        http_request.send(null);

    }

/* Generic AJAX for populating a div with content posted from a form */   
function makePOSTRequest(url, div_id, parameters) {
	http_request = false;
	if (window.XMLHttpRequest) 
	{ // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) 
		{
			http_request.overrideMimeType('text/html');
		}
	} 
	else if (window.ActiveXObject) 
	{ // IE
		try 
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) 
		{
			try 
			{
			   http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) 
	{
		alert('Cannot create XMLHTTP instance');
		return false;
	}

	http_request.onreadystatechange = function() { updateContents(http_request, div_id); }
	http_request.open('POST', url, true);
	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http_request.setRequestHeader("Content-length", parameters.length);
	http_request.setRequestHeader("Connection", "close");
	http_request.send(parameters);
}

//just a shortcut to set the innerHTML cuz who can ever remember how javascript capitalizes that
function hardcodeContents(txt, div_id)
{
	document.getElementById(div_id).innerHTML=(txt);
}

//submit a form on a page to a div to be populated through AJAX
//give it the form id, the target to submit to from AJAX and the id of that div to populate with the AJAX page results
function submitFormToDiv(form_id, target, div_id)
{
	var form = document.getElementById(form_id);
	var query = buildQueryString(form);
	makePOSTRequest(target, div_id, query);
}

//builds query string from form items
//give it the form id, returns a query string
//used for form submission
function buildQueryString(form) {
    var str = "";
    var element, i = 0;
    while ((element = form.elements[i++]) != null) {
        var qc = toQueryComponent(element);
        if (qc != "") str += "&" + qc;
    }
    return str.substring(1);
}
//builds query component from a form input
//give it the form element, returns a query string component
//used for form submission
function toQueryComponent(input) {
    if (!input.name || input.disabled)
        return "";

    var n = urlencode(input.name);

    switch (input.type) {
    case "text":
    case "password":
    case "submit":
    case "hidden":
        return n + "=" + urlencode(input.value);
    case "textarea":
        // normalize line breaks as CR LF pairs as per RFC 1866
        var v = input.value.split(/\r\n|\r|\n/).join("\r\n");
        return n + "=" + urlencode(v);
    case "checkbox":
    case "radio":
        if (!input.checked)
            return "";
        var v = getRealValue(input);
        if (v === null) v = "on";
        return n + "=" + urlencode(v);
    case "select-one":
    case "select-multiple":
        var nvp = [];
        var opt, i = 0;
        while ((opt = input.options[i++]) != null) {
            if (opt.selected) {
                var v = getRealValue(opt);
                if (v === null) v = opt.text;
                // older versions of IE do not support Array.push
                nvp[nvp.length] = n + "=" + urlencode(v);
            }
        }
        return nvp.join("&");
    default:
        // input types reset, button, image, and file not implemented
        return "";
    }
}

//javascript url encode
function urlencode(str) {
    var v;
    try { v = encodeURIComponent(str); } catch (e) { v = escape(str); }
    return v.replace(/%20/g,"+");
}

//for the toQueryComponent function
function getRealValue(input) {
    var attr = input.getAttributeNode("value");
    return (attr && attr.specified) ? input.getAttribute("value") : null;
}
