
function clField()
{
	this.sKey   = null
	this.sValue = null
}

function clURLDecoder()
{
	this.m_arFields = new Array()
}

clURLDecoder.prototype.AddField = function( sKey, sValue )
{
	var field = new clField()
	field.sKey   = sKey
	field.sValue = sValue

	this.m_arFields[this.m_arFields.length] = field
}

clURLDecoder.prototype.Decode = function( qs )
{
	// Empty the field array
	this.m_arFields.splice(0)

	// Strip the leading question mark (if present)
	if ( qs.charAt(0) == '?' )
		qs = qs.slice(1)

	// Tokenize the query string
	var arPairs = qs.split('&')
	for ( var i = 0; i < arPairs.length; i++ )
	{
		var sPair = arPairs[i]
		var nLoc = sPair.indexOf('=')

		var field = new clField()
		if ( nLoc >= 0 )
		{
			this.AddField( unescape(sPair.slice(0, nLoc)),
			               unescape(sPair.slice(nLoc+1)) )
		}
		else
		{
			this.AddField( unescape(sPair), '' )
		}
	}
}

clURLDecoder.prototype.FindField = function( sKey )
{
	var nNumFields = this.m_arFields.length;
	for ( var i = 0; i < nNumFields; i++ )
	{
		var field = this.m_arFields[i]
		if ( field.sKey == sKey )
			return i
	}

	return -1
}

clURLDecoder.prototype.FindFieldIC = function( sKey )
{
	var nNumFields = this.m_arFields.length;
	for ( var i = 0; i < nNumFields; i++ )
	{
		var field = this.m_arFields[i]
		if ( field.sKey.toLowerCase() == sKey )
			return i
	}

	return -1
}

clURLDecoder.prototype.GetField = function( sKey )
{
	var i = this.FindField( sKey )
	if ( i < 0 )
		return null
	else
		return this.m_arFields[i]
}

clURLDecoder.prototype.GetFieldIC = function( sKey )
{
	var i = this.FindFieldIC( sKey )
	if ( i < 0 )
		return null
	else
		return this.m_arFields[i]
}

clURLDecoder.prototype.RemoveField = function( sKey )
{
	var i = this.FindField( sKey )
	if ( i >= 0 )
		this.m_arFields.splice(i, 1)
}

clURLDecoder.prototype.RemoveFieldIC = function( sKey )
{
	var i = this.FindFieldIC( sKey )
	if ( i >= 0 )
		this.m_arFields.splice(i, 1)
}

clURLDecoder.prototype.GetNumFields = function()
{
	return this.m_arFields.length
}

clURLDecoder.prototype.GetQueryString = function()
{
	var qs = ''
	var nNumFields = this.m_arFields.length;
	for ( var i = 0; i < nNumFields; i++ )
	{
		var field = this.m_arFields[i]
		qs += escape(field.sKey) + '=' + escape(field.sValue) + '&'
	}

	return qs.slice(0, qs.length-1)
}
