
//global vars
function GroupListSettings()
{
    this.Category= null; //empty string is All Groups
    this.PageSize= 0;
    this.PageNumber= 0;
    this.Sort= '';
}

var g_Settings= new GroupListSettings();
var g_InitialSettings= new GroupListSettings();

var g_CurrentSubCategories= [];
var g_CurrentTopCategories= [];
var g_AllGroupCount= 0;
var g_CurrentIsMyGroups= 0;
var g_AllGroupsName = "All Groups";
var g_CategoriesName = "Categories";

var g_IsStartup= true;

//history / hash
$(function() { 
    $.historyInit(pageload);
});

function pageload(hash) 
{
    if (g_IsStartup)
        return;

    var currentCategory= g_Settings.Category;

    if (hash)
    {
        var hashSettings= GetSettingsFromString(hash);
        
        if (hashSettings.PageNumber > 0)
            g_Settings.PageNumber= hashSettings.PageNumber;  
        else if (g_Settings.PageNumber != g_InitialSettings.PageNumber)
            g_Settings.PageNumber= g_InitialSettings.PageNumber;        
        
        if (hashSettings.PageSize > 0)
            g_Settings.PageSize= hashSettings.PageSize;  
        else if (g_Settings.PageSize != g_InitialSettings.PageSize)
            g_Settings.PageSize= g_InitialSettings.PageSize; 
         
        if (hashSettings.Sort.length > 0)
            g_Settings.Sort= hashSettings.Sort;     
        else if (g_Settings.Sort != g_InitialSettings.Sort)
            g_Settings.Sort= g_InitialSettings.Sort;            
                    
        if (hashSettings.Category != null)
            g_Settings.Category= hashSettings.Category;
        else if (g_Settings.Category != g_InitialSettings.Category)
            g_Settings.Category= g_InitialSettings.Category;      
    }   
    else //no hash, set from initial
    {
        g_Settings.PageNumber= g_InitialSettings.PageNumber;
        g_Settings.PageSize= g_InitialSettings.PageSize;
        g_Settings.Sort= g_InitialSettings.Sort;
        g_Settings.Category= g_InitialSettings.Category;  
    }          
    
    if (g_CurrentIsMyGroups == 0 && g_Settings.Category != currentCategory)
        ShowGroupViewAll(false);
    else
        ShowGroups(true);   
}

function GetSettingsFromString(s)
{
    var settings= new GroupListSettings();  
    var arr= s.split('&');
    
    for (var i = 0; i < arr.length; i++)
    {           
        var arrKeyVal= arr[i].split('=');
        
        if (arrKeyVal.length != 2)
            continue;
            
        switch (arrKeyVal[0])
        {
            case 'sort': settings.Sort= arrKeyVal[1]; break;
            case 'pn': settings.PageNumber= arrKeyVal[1]; break;
            case 'ps': settings.PageSize= arrKeyVal[1]; break;
            case 'categoryid': settings.Category= arrKeyVal[1]; break;
            case 'all': 
                if (arrKeyVal[1] == '1')
                    settings.Category='';
                break;
        }
    }
    
    return settings;
}

function SetHistory()
{
    var h='';
    
    if (g_Settings.PageNumber > 0 && g_Settings.PageNumber != g_InitialSettings.PageNumber)
        h= AddQueryArg(h,"pn=" + g_Settings.PageNumber);    
    if (g_Settings.PageSize > 0 && g_Settings.PageSize != g_InitialSettings.PageSize)
        h= AddQueryArg(h,"ps=" + g_Settings.PageSize);    
    if (g_Settings.Sort.length > 0 && g_Settings.Sort != g_InitialSettings.Sort)
        h= AddQueryArg(h,"sort=" + g_Settings.Sort);
    if (g_Settings.Category !=  null && g_Settings.Category != g_InitialSettings.Category)
        h= AddQueryArg(h,(g_Settings.Category.length == 0) ? "all=1" : "categoryid=" + g_Settings.Category);

    if (h.length == 0)
        h= 'a'; //if empty, set it to something so it doesn't send to top
    
    $.historyLoad(h);
}

function AddQueryArg(q,add)
{
    if (q.length > 0) q+= "&";
    q+= add;
    return q;
}

function SetInitialSettings(sort,pageSize,catID)
{
    g_InitialSettings.Category= catID;
    g_InitialSettings.PageNumber= 1;
    g_InitialSettings.PageSize= pageSize;
    g_InitialSettings.Sort= sort;
    
    if (location.hash.length > 0)
    {
        var hashSettings= GetSettingsFromString(location.hash.replace(/^#/, ''));        
        
        if (hashSettings.PageNumber > 0)
            g_InitialSettings.PageNumber= hashSettings.PageNumber;    
        if (hashSettings.PageSize > 0)
            g_InitialSettings.PageSize= hashSettings.PageSize;  
        if (hashSettings.Sort.length > 0)
            g_InitialSettings.Sort= hashSettings.Sort;       
        if (hashSettings.Category != null)
            g_InitialSettings.Category= hashSettings.Category;   
    }
    
    g_Settings.Category= g_InitialSettings.Category;
    g_Settings.Sort= g_InitialSettings.Sort;
    g_Settings.PageSize= g_InitialSettings.PageSize;
    g_Settings.PageNumber= g_InitialSettings.PageNumber;
}

//group list filters
function PageSizeGroups(ddl)
{
    g_Settings.PageSize= ddl.options[ddl.selectedIndex].value;
    g_Settings.PageNumber= 1;
    SetHistory();
    ShowGroups(true);
}

function SortGroups(ddl)
{
    g_Settings.PageNumber= 1;
    g_Settings.Sort= ddl.options[ddl.selectedIndex].value;
    SetHistory();
    ShowGroups(true);
}

function PageGroups(num,lnk)
{
    g_Settings.PageNumber= num;
    SetHistory();
    ShowGroups(true);
}

//show groups, for both pages
function ShowGroups(disableList,onGroupRetrieveCallBack)
{
    var ResponseContainer = "ajaxresponse";        
    if (disableList) DisableGroups();
                
    $.post("group_get.aspx", { CategoryID: g_Settings.Category, PageNumber: g_Settings.PageNumber, PageSize: g_Settings.PageSize, SortType: g_Settings.Sort, IsMyGroups: g_CurrentIsMyGroups }, function(response)
    {                                   
        if (response.indexOf(ResponseContainer) < 0)
            return;
                                    
        if (disableList) EnableGroups();
        $("#group-list").html(response);   
        if (onGroupRetrieveCallBack) onGroupRetrieveCallBack();        
    });      
}

//My Groups
function LoadMyGroups(sort,pageSize)
{
    SetInitialSettings(sort,pageSize,'');
    g_CurrentIsMyGroups= 1;           
            
    ShowGroups(false,function() 
    { 
        $("#group-list-waiting").hide();
        g_IsStartup= false;
    });
}

//Group View All. Categories
function TopCategoryList() { return $("ul.top-category-list"); }
function SubCategoryList() { return $("ul.sub-category-list"); }

function LoadGroupViewAll(allGroupCount,catID,sort,pageSize)
{ 
    SetInitialSettings(sort,pageSize,catID);    
    g_AllGroupCount= allGroupCount;    
    ShowGroupViewAll(true);
}

function ShowGroupViewAll(isStartup)
{
    if (g_Settings.Category == '')
    {
        ShowGroupViewAll_Category(isStartup,[]);
        return;
    }    

    //Get top categories
    GetCategories({ ChildID: g_Settings.Category}, function(arr)
    {
        if (arr.length == 0) //set to All Groups
            g_Settings.Category= '';
        
        ShowGroupViewAll_Category(isStartup,arr);
    });
}

function ShowGroupViewAll_Category(isStartup,topCats)
{
    g_CurrentTopCategories= topCats;
    var topDisplay= GetTopCatListDisplay(topCats);   
    
    GetCategories({ ParentID: g_Settings.Category}, function(arr)
    {   
        g_CurrentSubCategories= arr;   
        var subDisplay= GetSubCatListDisplay(arr);  
        
        ShowGroups(!isStartup,function() 
        { 
            if (isStartup)
                $("#group-list-waiting").hide();
            
            if (g_CurrentSubCategories.length > 0 || g_CurrentTopCategories.length > 0) 
            {
                TopCategoryList().html(topDisplay);
                SubCategoryList().html(subDisplay);      
                $("div.category-menu").show();
            }
            else
                $("div.category-menu").hide();
            
            g_IsStartup= false;
        });
    }); 
}

function ShowCat(catID,lnk)
{        
    g_Settings.Category= catID;
    g_Settings.PageNumber= 1;
    SetHistory();
    
    GetCategories({ ParentID: g_Settings.Category}, function(arr)
    {      
        ShowGroups(true,function() 
        { 
            if ($(lnk).parents("ul.sub-category-list").length > 0) //from sub-categories. Add to 
            {
                var subIndex= $(lnk).parent("li").prevAll("li").length; //num links before it
                var subCat= g_CurrentSubCategories[subIndex];                
                g_CurrentTopCategories.push(subCat);
                
            }
            else if (!$(lnk).is(".current-crumb")) //top cat. only change if not currently selected
            {          
                $(lnk).parent("li").nextAll("li").remove();      
                var arrLabels= TopCategoryList().find("a.browser-label");
                var newLength= arrLabels.length - 1;
                
                while (g_CurrentTopCategories.length > 0 && g_CurrentTopCategories.length > newLength)
                {
                    g_CurrentTopCategories.pop();
                }
            }            
                       
            g_CurrentSubCategories= arr;                 
            var subDisplay= GetSubCatListDisplay(arr); 
            var topDisplay= GetTopCatListDisplay(g_CurrentTopCategories);
            TopCategoryList().html(topDisplay);
            SubCategoryList().html(subDisplay); 
        });
    }); 
}

function GetCategories(queryArgs, catArrayCallBack)
{
    $.post("groups/category_get.aspx", queryArgs, function(response)
    {                 
        var arr;                     
        try { arr= eval(response); }
        catch (e) { return; }
            
        catArrayCallBack(arr);
    });   
}

function GetTopCatListDisplay(arr)
{
    var topDisplay= "<li><a class=\"browser-label\">"+g_CategoriesName+":</a></li>";
    
    if (arr && arr.length > 0)
    {        
        topDisplay+= GetCategoryLink('',g_AllGroupsName,g_AllGroupCount);
        
        topDisplay+= $.map(arr, function(cat,i) {
        
                        return (i == (arr.length - 1))
                                ? "<li><a class=\"last-browser-label\">&#187;</a></li>" +GetSelectedTopLink(cat.ID,cat.Name,cat.GroupCount)
                                : "<li><a class=\"browser-label\">&#187;</a></li>" + GetCategoryLink(cat.ID,cat.Name,cat.GroupCount);
        
                     }).join('');
    }
    else
    {
        topDisplay+= GetSelectedTopLink('',g_AllGroupsName,g_AllGroupCount);
    }
    
    return topDisplay;
}

function GetSubCatListDisplay(arr) 
{
    return $.map(arr, function (cat) {
                        return GetCategoryLink(cat.ID,cat.Name,cat.GroupCount);
                   }).join('');
}

function GetSelectedTopLink(id,name,groupCount)
{
    return "<li class=\"current-li\"><a class=\"current-crumb browser-label\" href=\"#\" onclick=\"ShowCat('"+ id +"',this); return false;\">"+ name +"<span class=\"group-counter\">("+ groupCount +")</span></a></li>";
}

function GetCategoryLink(id,name,groupCount)
{    
    return "<li><a href=\"#\" onclick=\"ShowCat('"+ id +"',this); return false;\">"+ name +"</a><span class=\"group-counter\">("+ groupCount +")</span></li>";
}

//util methods
function ShowLastMessage(lnk)
{
    $(lnk).parent().next("div.popup-description-wrapper").show(); 
}

function HideLastMessage(lnk) 
{
    $(lnk).parent().next("div.popup-description-wrapper").hide(); 
}

function EnableGroups()
{
    $("#group-results").unblock();
}

function DisableGroups()
{    
    $("#group-results").block({ css: { border: '0px', backgroundColor:'', width: '16px',  top: '50px', cursor: 'auto' }, 
                             message: '<img src="./images/loading.gif"/>',
                             overlayCSS:  { backgroundColor: '#fff', opacity: 0.5, cursor: 'auto' },
                             fadeIn: 0, fadeOut: 0, centerY: false });
}

