

/**
 * Return an Array of Array as in
 * 
 *  Array(Array(name0, value0),
 *        Array(name1, value1),
 *        ...)
 *
 *  The URL param may be either a complete URL (of which the part before
 *  the ? will be discarded) or just the parameter part after the ?.
 */
function param_array_from_url(url)
{
    var parts;
    var rest;

    parts = url.split("?");

    // No '?' present? 
    if (parts.length != 2)
    {
        rest = url;        
    }
    else
    {
        rest = parts[1];
    }

    if (rest == "")
    {
        return Array();
    }
    else
    {
        // Split the parameter list
        var ret = Array();
        
        parts = rest.split("&");
        
        for (var a = 0; a < parts.length; a++)
        {
            var part = parts[a];
            var pair = part.split("=");
            
            if (pair.length == 2)
            {
                var name = pair[0];
                var value = pair[1];
                
                ret.push(Array(name, value));
            }
        }
        
        return ret;
    }
}

/* Return an associative array as param_name: value to a url param string
 */
function url_params(values)
{
    var params = Array();
    for (var name in values)
    {
        var value = values[name];
        value = encodeURI(value);
        value = value.replace("&", "%26");
        value = value.replace("+", "%2B");
        
        params.push(name + "=" + value);
    }

    var url_params = params.join("&");

    return url_params;
}


/**
 * Split URL in a url and a parameter part. Always returns a two element
 * array of strings.
 */
function split_url(url)
{
    var ret = url.split("?");

    // Make sure the array we return as two elements.
    if (ret.length != 2)
    {
        ret.push("");
    }

    return ret;
}


/**
 * Return a copy of PARAM_ARRAY width PARAM set to VALUE.
 */
function set_param_in_array(param_array, param, new_value)
{
    var new_param_array = Array();
    for(var a = 0; a < param_array.length; a++)
    {
        var name = param_array[a][0];
        var value = param_array[a][1];
            
        if ( name != param && value != null)
        {
            new_param_array.push(param_array[a]);
        }
    }

    if (new_value != null)
    {
        new_param_array.push(Array(param, "" + new_value));
    }
    
    return new_param_array;
}

/**
 * Take BASE (url part without params) and a PARAM_ARRAY and return
 * a complete url. No parameter escaping is performed.
 */
function url_from_param_array(base, param_array)
{
    ret = Array();

    ret.push(base);
    
    var params = Array();
    for (var a = 0; a < param_array.length; a++)
    {
        if (param_array[a][1] != null)
        {    
            var param = param_array[a].join("=");
            params.push(param);
        }
    }

    if (params.length > 0)
    {
        ret.push("?");
        ret.push(params.join("&"));
    }

    return ret.join("");
}


/**
 * Set PARAM to VALUE in url and return the new url.
 */
function set_param(url, param, value)
{
    var parts = split_url(url);    
    var base = parts[0];

    var param_array = param_array_from_url(parts[1]);
    param_array = set_param_in_array(param_array, param, value);

    return url_from_param_array(base, param_array);
}

/**********************************************************************/
/* Some basic AJAX stuff                                              */
/**********************************************************************/

function xml_request()
{
	if ( window.XMLHttpRequest && (!window.ActiveXObject))
	{
		return new XMLHttpRequest();
	}
	else
	{
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}

function get_response_text(url)
{
    var xmlhttp = xml_request();
	var ret = null;

    xmlhttp.open("GET", url, false);
    
    /* Send the POST request */
    xmlhttp.setRequestHeader('Content-Type',
                             'application/x-www-form-urlencoded');
    xmlhttp.send("");

	ret = xmlhttp.responseText;

	return ret;
}

    /* The callback function */
    /*xmlhttp.onreadystatechange = function() {
		alert("state=" + xmlhttp.readyState);
		
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200)
            {
				alert("got: " + xmlhttp.responseText);
                ret = xmlhttp.responseText;
            }
            else
            {
                alert("HTTP ERROR!! " + xmlhttp.status + " " + url);
            }
        }
		}*/
    

function replace_element_content_from_url(element, url, async, callback)
{
    var xmlhttp =  xml_request();
    xmlhttp.open("GET", url, async);

	if ( async )
	{
		/* The callback function */
		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200)
				{
					/* For Mozilla it's important that the CGI that
					   serves the HTML sets the ContentType to
					   text/html, rather than text/xml or
					   something. text/plain won't work at all.
					   Safari is more flexible and just works. */
					element.innerHTML = xmlhttp.responseText;					
					if (callback != null) callback(); 
				}
				else
				{
					alert("HTTP ERROR!! " + xmlhttp.status + " " + url);
				}
			}			
        }		
    }
    
    /* Send the POST request */
    xmlhttp.setRequestHeader('Content-Type',
                             'application/x-www-form-urlencoded');
    xmlhttp.send(null);

	if ( !async )
	{
		/* The same stuff applies as for the innerHTML assignment above. */
		element.innerHTML = xmlhttp.responseText;						
		if (callback != null) callback();
	}
			
}

/**********************************************************************/
/* XML                                                                */
/**********************************************************************/

/**
 * Load the XML file, parse it and call CALLBACK with the parsed
 * representation as only parameter.
 */
 
function load_xml_from_url(url, callback)
{
	var xmlDoc;

	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = function () {
			callback(xmlDoc);
		}
	}
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4)
			{
				callback(xmlDoc);
			}
		};
 	}
	else
	{
		alert("Your browser can't handle this script");
		return;
	}
	
	xmlDoc.load(url);
}

function xml_from_string(s)
{
	var xmlDoc;

	if (document.implementation && document.implementation.createDocument)
	{
		parser = new DOMParser();
		xmlDoc = parser.parseFromString(s, "text/xml");
	}
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.loadXML(s);
 	}
	else
	{
		alert("Your browser can't handle this script");
		return;
	}

	return xmlDoc;	
}

/**********************************************************************/
/* Form functions                                                     */
/**********************************************************************/

function get_input_value(input_name) {
	var result = document.getElementsByName(input_name);
	var input = result[0];
	return input.value;
}

function get_selected(select_name) {
	var result = document.getElementsByName(select_name);
	var select = result[0];
	return select.options[select.selectedIndex].value;
}

function get_checked(checkbox_name) {
	var result = document.getElementsByName(checkbox_name);
	var ret = Array();

	for ( var a = 0; a < result.length; a++ )
	{
		var checkbox = result[a];
		
		if ( checkbox.checked )
		{
			ret.push( checkbox.value );
		}
	}

	return ret;
}	



/**********************************************************************/
/* Misc                                                               */
/**********************************************************************/

function ask_link(question, href)
{
    if (window.confirm(question))
    {
		window.location.href = href;
    }
}


