function FilterBlock_MakePrefix(blockID)
{
    return "F" + blockID + "_" ;
}

function FilterBlock_Pager(blockID, pageID)
{
}

function FilterBlock_Submit(blockID, pageID)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) ; 
    
    /* 
        If we are ajaxEnabled, we're pageing so use the current checkbox information,
        If we are not ajaxEnabled and the new page num is not the current page num
            then we're paging and we should be using the original checkbox state
     */
    var useCheck ;
    if (FilterBlock_AjaxEnabled(blockPrefix))
        useCheck = true ; // Need current state of checkboxes and pageID is valid
    else if (pageID == -1)
    { // We have a submit action and we will return to page 1 with the current check
      // state
        useCheck = true ;
        pageID = 1 ;
    }
    else
        useCheck = false ; // Paging so grab the old state.
    
    var allInputs = document.getElementsByTagName("INPUT") ;
    
    var additionalArgs = new StringBuilder() ;
    var newQueryString = new StringBuilder() ;
    
    additionalArgs.Append(blockPrefix + "PageNum=", pageID) ;
    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.Append((additionalArgs.IsEmpty()?"":"&"), myId, "=", allInputs[ii].value) ;
        else if (allInputs[ii].type == "text" &&
                 myId.indexOf(blockPrefix) == 0
                 && useCheck)
            additionalArgs.Append((additionalArgs.IsEmpty()?"":"&"), myId, "=", allInputs[ii].value) ;            
        else if (allInputs[ii].type == "text" &&
                 myId.indexOf(blockPrefix) == 0
                 && !useCheck)
            additionalArgs.Append((additionalArgs.IsEmpty()?"":"&"), myId, "=", allInputs[ii].defaultValue) ;            
        else if (allInputs[ii].type == "checkbox" &&   // may be a filter checkbox
                 useCheck && allInputs[ii].checked &&  // it is checked
                 myId.indexOf(blockPrefix) == 0)       // and it is mine, all mine
            newQueryString.Append(myId, "!") ;
        else if (allInputs[ii].type == "checkbox" &&          // may be a filter checkbox
                 !useCheck && allInputs[ii].defaultChecked && // it was checked
                 myId.indexOf(blockPrefix) == 0)              // and it is mine, all mine
            newQueryString.Append(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.Append(myId, "!") ;      
    }
    
    location.search = "?FB_Values=" + newQueryString.ReturnAndEmpty() + (additionalArgs.IsEmpty()?"":"&") + additionalArgs.ReturnAndEmpty() ;
}

function FilterBlock_FormatClassifications(blockPrefix)
{
    var allInputs = document.getElementsByTagName("INPUT") ;
    
    var checkBoxes = new StringBuilder() ;
    for (var ii=0 ; ii<allInputs.length ; ++ii)
    {
        var myId = allInputs[ii].id ;
    
        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
            checkBoxes.Append(myId, "!") ;
    }
    
    return checkBoxes.ReturnAndEmpty() ;
}

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_KeywordFilter(blockID)
{
    FilterBlock_ClassificationCheck(blockID) ;
}

function FilterBlock_AjaxEnabled(blockPrefix)
{
    return (document.getElementById(blockPrefix + "ajaxEnabled") && document.getElementById(blockPrefix + "ajaxEnabled").value == 1) ;
}

function FilterBlock_ClassificationCheck(blockID)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) ; 
    if (!FilterBlock_AjaxEnabled(blockPrefix))
        return ;

    var ajaxArgs = new Array() ;
    ajaxArgs[ajaxArgs.length] = document.getElementById(blockPrefix + "DocID").value ;
    ajaxArgs[ajaxArgs.length] = blockID ;
    if (document.getElementById(blockPrefix + "keywordFilter"))
        ajaxArgs[ajaxArgs.length] = document.getElementById(blockPrefix + "keywordFilter").value ;
    else
        ajaxArgs[ajaxArgs.length] = "" ;
    ajaxArgs[ajaxArgs.length] = FilterBlock_FormatClassifications(blockPrefix) ;
    
    document.getElementById(blockPrefix + "ResultsDiv").className += " waiting" ;
    RadDisplayServiceWrapper.MakeWebServiceCall("FilterBlock_" + blockID, AggregationV2Ajax.GetResultsData, ajaxArgs, FilterBlock_AjaxComplete, [blockID], true) ;
}

function FilterBlock_AjaxComplete(blockID, responseAsJSON, responseAsXml, responseAsText)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) ; 
    var resultsArea = document.getElementById(blockPrefix + "ResultsDiv") ;
    if (!resultsArea)
        return window.alert("Lost results") ;
        
    resultsArea.className = "AggregationResults" ;
    
    resultsArea.innerHTML = responseAsJSON ;        
} 

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) ;
        }                          
} ;