//<SCRIPT RUNAT=server LANGUAGE="JScript">   to force the colors in the development tool

function NameValues(arg)
{
   // methods
   this.Marshal = NameValues_Marshal;
   this.UnmarshalFrom = NameValues_UnmarshalFrom;
   this.Add = NameValues_Add;
   this.Append = NameValues_Append;

   // attributes
   this.args = new Array();
 
   // initialize
   if (typeof(arg) != 'undefined')
	this.UnmarshalFrom(arg);
}

function NameValues_Add(strArgName, strArgValue)
{
    this.args[strArgName] = strArgValue;
}

function NameValues_Encode(str)
{
    if (typeof(str) == "string") {
        str = str.replace(/=/g, "&eq;")
        str = str.replace(/\|/g, "&bar;")
    }
    return str;
}

function NameValues_Decode(str)
{
    if (typeof(str) == "string") {
        str = str.replace(/&eq;/g, "=")
        str = str.replace(/&bar;/g, "|")
    }
    return str;
}

function NameValues_Marshal()
{
    var strReturn = "";
    var blnFirstTime = true;
    for (strKey in this.args) {
	    if (!blnFirstTime) strReturn += "|";
        strReturn += strKey + "=" + NameValues_Encode(this.args[strKey]);
	    blnFirstTime = false;
    }
    return strReturn;
}

function NameValues_UnmarshalFrom(astrNV)
{
    var aNVs = astrNV.split("|");
    for (i = 0; i < aNVs.length; i++) {
        var aNV = aNVs[i].split("=");
	    if (aNV.length != 2) continue;
        this.args[aNV[0]] = NameValues_Decode(aNV[1]);
    }
}

function NameValues_Append(strVal)
{
    this.args[this.args.length] = strVal;
}

//********** Testing *****************
//var gArguments = new NameValues("");
//gArguments.Add("foo", "bar");
//WScript.Echo(typeof(gArguments.args["oo"]))

//gArguments.Append("boo");
//gArguments.Append("boo");
//WScript.Echo(gArguments.Marshal());

// Encoding decoding
//var enc = NameValues_Encode("a=bas|k=le");
//var dec = NameValues_Decode(enc)
//WScript.Echo(enc)
//WScript.Echo(dec)