function FilterBlock_MakePrefix(blockID)
{
    return "F" + blockID + "_" ;
}

function FilterBlock_Submit(blockID)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) ; 
    var allInputs = document.getElementsByTagName("INPUT") ;
    
    var additionalArgs = "" ;
    var newQueryString = "" ;
    for (var ii=0 ; ii<allInputs.length ; ++ii)
    {
        var myId = allInputs[ii].id ;
    
        if (allInputs[ii].type == "hidden" &&             // it might be a page number
            myId.indexOf(blockPrefix) != 0 &&             // it is not ours so we might want to keep it
            myId.indexOf("_PageNum") == (myId.length - 8) // yes, it is a page number
           )            
            additionalArgs += (additionalArgs?"&":"") + myId + "=" + allInputs[ii].value ;
        else if (allInputs[ii].type == "checkbox" &&   // may be a filter checkbox
                 allInputs[ii].checked &&              // it is checked
                 myId.indexOf(blockPrefix) == 0)       // and it is mine, all mine
            newQueryString += myId + "!" ;
        else if (allInputs[ii].type == "checkbox" &&   // may be a filter checkbox  
                 allInputs[ii].defaultChecked &&       // it was checked when we entered
                 myId.indexOf(blockPrefix) == -1 &&    // it isn't mine
                 (/^F\d*_C\d*_A\d*$/).test(myId)      // but it is definitely a filter checkbox
                )
            newQueryString += myId + "!" ;      
    }
    
    location.search = "?FB_Values=" + newQueryString + (additionalArgs?"&":"") + additionalArgs ;
}

function FilterBlock_CheckAll(ctl, blockID, classID)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) + "C" + classID + "_" ; 
    var allInputs = document.getElementsByTagName("INPUT") ;
    for (var ii=0 ; ii<allInputs.length ; ++ii)    
    {
        if (allInputs[ii].type == "checkbox" &&
            allInputs[ii].id.indexOf(blockPrefix) == 0)
            allInputs[ii].checked = ctl.checked ;            
    }    
}

function FilterBlock_UncheckAll(allID)
{
    var ctl = document.getElementById(allID) ; 
    if (ctl)
        ctl.checked = false ;
}

function DisplaySideUpload_Expand(dataArea, link)
{
    if (document.getElementById(dataArea).style.display == "block")
    {
        document.getElementById(dataArea).style.display = "none" ;
        document.getElementById(link).innerHTML = "Upload File" ;
    }
    else
    {
        document.getElementById(dataArea).style.display = "block" ;
        document.getElementById(link).innerHTML = "Hide Upload Data" ;
    }
}

function DisplaySideUpload_Upload(btnCtl, baseID)
{
    btnCtl.disabled = true ;
    window.setTimeout("document.forms[0].submit()", 0) ;
}

var RadDisplayServiceWrapper = 
{
    gCallbackQueue:
        new Array(),
        
        
    WebServiceCallComplete:
        function(responseAsJSON, responseAsXsl, responseAsText)
        {
            var callInfo = RadDisplayServiceWrapper.gCallbackQueue.shift() ;
            if (!callInfo)
                return ; // can't happen, but....

            var matchesExist = false ;
            for (var ii=0 ; ii<RadDisplayServiceWrapper.gCallbackQueue.length ; ++ii)
                if (RadDisplayServiceWrapper.gCallbackQueue[ii].name == callInfo.name)
                {
                    matchesExist = true ; 
                    break ;
                }
                
            if (!matchesExist)   
            {
                var args = callInfo.postOpArgs ;
                args[args.length] = responseAsJSON ;
                args[args.length] = responseAsXsl ;
                args[args.length] = responseAsText ;
                callInfo.postOp.apply(window, args) ;
            }                
                
            if (RadDisplayServiceWrapper.gCallbackQueue.length)
                RadDisplayServiceWrapper.ActualAsyncCall() ;                                           
        },      
    WebServiceErrorFunction:
        function(myArgs)
        {
            window.alert("Error: " + myArgs.ErrorText + " " + myArgs.Text) ;
        },          
    
    MakeWebServiceCall:
        function(name, webServiceFunction, arrayOfArgs, postOpFunction, postOpArguments, canSkip)
        {
            arrayOfArgs[arrayOfArgs.length] = RadDisplayServiceWrapper.WebServiceCallComplete ;
            arrayOfArgs[arrayOfArgs.length] = RadDisplayServiceWrapper.WebServiceErrorFunction ;

            var newQueueItem = {name: name, callName: webServiceFunction, args: arrayOfArgs, postOp: postOpFunction, postOpArgs: postOpArguments} ;
            if (canSkip)
            {   // look for a queued up copy of this one and replace it
                for (var ii=1/*skip the active item*/; ii<RadDisplayServiceWrapper.gCallbackQueue.length ; ++ii)
                    if (RadDisplayServiceWrapper.gCallbackQueue[ii].name == name)
                    {
                        RadDisplayServiceWrapper.gCallbackQueue[ii] = newQueueItem ;
                        return ; // We're done....the queue has an active item
                    }
            }                            
            
            RadDisplayServiceWrapper.gCallbackQueue.push(newQueueItem) ;
            if (RadDisplayServiceWrapper.gCallbackQueue.length == 1)
                RadDisplayServiceWrapper.ActualAsyncCall() ;                        
        },    
        
    ActualAsyncCall:
        function()
        {
            if (RadDisplayServiceWrapper.gCallbackQueue.length == 0)
                return ; // can't happen, but...
                
            var callInfo = RadDisplayServiceWrapper.gCallbackQueue[0] ;
            callInfo.callName.apply(window, callInfo.args) ;
        }                          
} ;