/** decodes a query string into a "table" object where URL parameter names
 *  become object property names
 */
function createQueryStringTable(encodedLinkSearchString)
{
    //: extern function decodeURIComponent;
    var prefix = "?";
    var parameterDelim = "&";
    var parameterNameDelim = "=";
    var convertToLowerCase = true;
    var parameterTable;
    var delim;
    var encodedParameterList;
    var encodedParameterArray;
    var encodedParameterIndex;
    var encodedParameter;
    var encodedParameterName;
    var encodedParameterValue;
    var parameterName;
    var parameterValue;
    var startIndex;
    var foundIndex;
    
    parameterTable = new Object();
    
    encodedParameterList = encodedLinkSearchString;
    if (encodedParameterList)
    {
        if (encodedParameterList.substr(0, prefix.length) == prefix)
        {
            encodedParameterList = encodedParameterList.substr(prefix.length);
        }
        
        encodedParameterArray = encodedParameterList.split(parameterDelim);
    }
    if (encodedParameterArray)
    {
        delim = parameterNameDelim;
        for (encodedParameterIndex = 0;
            (encodedParameterIndex < encodedParameterArray.length);
            encodedParameterIndex++)
        {
            encodedParameter = encodedParameterArray[encodedParameterIndex];
            
            parameterName = null;
            parameterValue = null;
            
            encodedParameterName = null;
            encodedParameterValue = null;
            startIndex = 0;
            foundIndex = encodedParameter.indexOf(delim, startIndex);
            if (foundIndex < startIndex)
            {
                encodedParameterName = encodedParameter;
            }
            else
            {
                encodedParameterName = encodedParameter.substr(startIndex, foundIndex - startIndex);
                startIndex = foundIndex + delim.length;
                encodedParameterValue = encodedParameter.substr(startIndex);
            }
            
            if (encodedParameterName)
            {
                parameterName = decodeURIComponent(encodedParameterName);
                if (parameterName && convertToLowerCase)
                {
                    parameterName = parameterName.toLowerCase();
                }
            }
            if (encodedParameterValue)
            {
                parameterValue = decodeURIComponent(encodedParameterValue);
            }
            
            if (parameterName && parameterName.length > 0)
            {
                parameterTable[parameterName] = parameterValue;
            }
        }
    }
    
    return parameterTable;
}

/** get the total size of the client area of the browser window */
function getWindowSize()
{
    var sizeObject = new Object();
    
    sizeObject.width = window.innerWidth;
    if (!sizeObject.width || sizeObject.width < 1)
    {
        sizeObject.width = document.documentElement.clientWidth;
    }
    if (!sizeObject.width || sizeObject.width < 1)
    {
        sizeObject.width = document.body.clientWidth;
    }
    
    sizeObject.height = window.innerHeight;
    if (!sizeObject.height || sizeObject.height < 1)
    {
        sizeObject.height = document.documentElement.clientHeight;
    }
    if (!sizeObject.height || sizeObject.height < 1)
    {
        sizeObject.height = document.body.clientHeight;
    }
    
    return sizeObject;
}

/** get an object that provides the width and height of a DOM element */
function getElementSize(elementNode)
{
    var sizeObject = new Object();
    
    if (elementNode)
    {
        sizeObject.width = elementNode.offsetWidth;
        sizeObject.height = elementNode.offsetHeight;
    }
    
    return sizeObject;
}

/** set the width and height of a DOM element */
function setElementSize(elementNode, width, height)
{
    if (elementNode && elementNode.style)
    {
        if (width)
        {
            elementNode.style.width = toPixelUnitStyle(width);
        }
        if (height)
        {
            elementNode.style.height = toPixelUnitStyle(height);
        }
    }
}

/** conversion method to convert a pixel measurement to a pixel 
 *  unit CSS style value */
function toPixelUnitStyle(pixelCount)
{
    var pixelUnitStyle;
    
    pixelUnitStyle = pixelCount.toString() + "px";
    
    return pixelUnitStyle;
}

