function addOptionsWithOptgroup(ele, data, valuerev, textprop, optgroup)
{
    var orig = ele;
    ele = $(ele);
    if (ele == null)
    {
        alert("addOptionsWithOptgroup() can't find an element with id: " + orig + ".");
        return;
    }

    // Function works only with options
    if (!DWRUtil._isHTMLElement(ele, "select"))
    {
        alert("addOptionsWithOptgroup() can only be used with select elements. Attempt to use: " + DWRUtil._detailedTypeOf(ele));
        return;
    }

    // Bail if we have no data
    if (data == null)
    {
        return;
    }

    var text;
    var value;
    var opt;
    var group;
    var currentGroup;
    var groupObj = null;
    var optObj = null;

    if (DWRUtil._isArray(data))
    {
        // Loop through the data that we do have
        for (var i = 0; i < data.length; i++)
        {
             currentGroup = data[i][optgroup];
             if (currentGroup != group) {
                 groupObj = document.createElement('optgroup');
                 groupObj.label = currentGroup;
                 ele.appendChild(groupObj);
                 group = currentGroup;
             }
                
             if (valuerev != null) {
                 if (textprop != null) {
                     text = data[i][textprop];
                     value = data[i][valuerev];
                 } else {
                     value = data[i][valuerev];
                     text = value;
                 }
             }
                else
                {
                    if (textprop != null)
                    {
                        text = data[i][textprop];
                        value = text;
                    }
                    else
                    {
                        text = "" + data[i];
                        value = text;
                    }
                }

                optObj = document.createElement('option');
                optObj.value = value;
                optObj.innerHTML = text;
                
                if (groupObj != null) {
                	groupObj.appendChild(optObj);
                } else {
	                ele.appendChild(optObj);
                }
        }
    }
    else
    {
        for (var prop in data)
        {
            if (valuerev)
            {
                text = prop;
                value = data[prop];
            }
            else
            {
                text = data[prop];
                value = prop;
            }

            opt = new Option(text, value);
            ele.options[ele.options.length] = opt;
        }
    }
}


function removeAllOptions (ele)
{
    var orig = ele;
    ele = $(ele);
    if (ele == null)
    {
        alert("removeAllOptions() can't find an element with id: " + orig + ".");
        return;
    }

    var useOptions = DWRUtil._isHTMLElement(ele, "select");
    var useLi = DWRUtil._isHTMLElement(ele, ["ul", "ol"]);

    if (!useOptions && !useLi)
    {
        alert("removeAllOptions() can only be used with select, ol and ul elements. Attempt to use: " + DWRUtil._detailedTypeOf(ele));
        return;
    }

    if (useOptions)
    {
        // Empty the list
        ele.options.length = 0;
        if (ele.hasChildNodes()) {
            while (ele.childNodes.length >= 1) {
                ele.removeChild(ele.firstChild);       
            } 
         }
    }
    else
    {
        while (ele.childNodes.length > 0)
        {
            ele.removeChild(ele.firstChild);
        }
    }
};


