/* ParseQueryString v1.0.1
   
   Changes since v1.0.0
     * bugfix for Netscape v4.79 browsers
   
   Copyright (c) 2004, Jeff Mott. All rights reserved.
   This is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License.
   <http://www.gnu.org/licenses/gpl.txt> */

Object.prototype.clone = function()
{
    var o = {};
    var property;
    
    for (property in this) {
        if (typeof this[property] == "object")
            o[property] = this[property].clone();
        else
            o[property] = this[property];
    }
    
    return o;
}

Array.prototype.clone = function()
{
    var i;
    var a = [];
    
    for (i = 0; i < this.length; ++i) {
        if (typeof this[i] == "object")
            a[i] = this[i].clone();
        else
            a[i] = this[i];
    }
    
    return a;
}

String.prototype.decodeURL = function() {
    /* unescape has been deprecated in JavaScript 1.5 and later
       this line may need to be changed in a future version */
    return unescape(this.replace(/\+/g, " "));
}

function ParseQueryString()
{
    var parameters = {};
    var parameterNames = [];
    
    function init()
    {
        var i;
        var pair, pairs;
        var name, value;
        
        if (location.search.length < 2)
            return;
        
        pairs = location.search.substr(1).split(/[&;]/);
        
        for (i = 0; i < pairs.length; ++i)
        {
            pair = pairs[i].split(/=/);
            
            name = pair[0].decodeURL();
            if (pair[1] == undefined)
                continue;
            else
                value = pair[1].decodeURL();
            
            if (parameters[name] == undefined) {
                parameters[name] = [value];
                parameterNames.push(name);
            }
            else
                parameters[name].push(value);
        }
    }
    init();
    
    var scalarParamIndex = 0;
    
    this.param = function(name) {
        if (arguments.length)
            if (parameters[name] == undefined)
                return undefined;
            else
                return parameters[name][0];
        else {
            if (scalarParamIndex == parameterNames.length) {
                scalarParamIndex = 0;
                return undefined;
            }
            else
                return parameterNames[scalarParamIndex++];
        }
    }
    
    this.params = function(name) {
        if (arguments.length)
            if (parameters[name] == undefined)
                return null;
            else
                return parameters[name].clone();
        else
            return parameterNames.clone();
    }
}