/*
* Tier set filtering code
* Copyright(c) WowJutsu.com
*/
var filter = {
    role: [],
    classId: [],
    bossId: [],
    quantity: []
};

function UpdateFilterURL() {
    var terms = [];
    if ( filter.role.length > 0 ) {
        terms[terms.length] = 'r=' + filter.role.join( ',' );
    }
    if ( filter.classId.length > 0 ) {
        terms[terms.length] = 'c=' + filter.classId.join( ',' );
    }
    if ( filter.quantity.length > 0 ) {
        for ( var i = 0; i < filter.quantity.length; ++i ) {
            terms[terms.length] = 'q=' + filter.quantity[i].op + ',' + filter.quantity[i].value;
        }
    }
    var url = document.location.pathname + '#';
    if ( terms.length > 0 ) {
        url += terms.join( ';' );
    } else {
        url += 'nop';
    }

    document.location.replace( url );
}

function ImportFilterURL() {
    // check if the URL has some settings to import...
    var count = 0;
    if ( document.location.hash.length > 0 ) {
        var parts = document.location.hash.substring( 1 ).split( ';' );
        if ( parts ) {
            for ( var i = 0; i < parts.length; ++i ) {
                var keyval = parts[i].split( '=' );
                if ( keyval && keyval.length == 2 ) {
                    switch ( keyval[0] ) {
                    case 'r':   // role
                        {
                            var roles = keyval[1].split(',');
                            if ( roles ) {
                                for ( var roleIndex in roles ) {
                                    var node = AddFilter( count++ == 0 );   // pass in true on first iteration which means don't show "Remove" next to filter
                                    node.find('select').val( 'role' ).trigger('change');
                                    node.find('.filter-details select').val( roles[roleIndex] );
                                }
                            }
                        }
                        break;
                    case 'c':   // class
                        {
                            var classes = keyval[1].split(',');
                            if ( classes ) {
                                for ( var classIndex in classes ) {
                                    var node = AddFilter( count++ == 0 );   // pass in true on first iteration which means don't show "Remove" next to filter
                                    node.find('select').val( 'class' ).trigger('change');
                                    node.find('.filter-details select').val( classes[classIndex] );
                                }
                            }
                        }
                        break;
                    case 'q':   // quantity
                        {
                            var opval = keyval[1].split(',');   // index 0 = operation, index 1 = value
                            if ( opval ) {
                                var node = AddFilter( count++ == 0 );   // pass in true on first iteration which means don't show "Remove" next to filter
                                node.find('select').val('quantity').trigger('change');
                                node.find('.filter-details select').val( opval[0] );
                                node.find('.filter-details input').val( opval[1] );
                            }
                        }
                        break;
                    }
                }
            }
        }
        
        if ( count > 0 ) {
            ApplyFilter( true );
        }
    }
    
    return count > 0;
}

function RemoveFilter( domNode ) {
    $(domNode).remove();
}

function ResetForm() {
    $('#filters').empty();
    AddFilter( true );
    ApplyFilter();
}

function ShowFilterDetails( domNode, filterType ) {
    var node = $(domNode);

    switch ( filterType ) {
    default:
        // clear the filter!
        node.find('.filter-details').empty();
        break;
        
    case 'role':
        {
            var html = '';
            html += "<select class='flt_role'>";
            html += "<option value=''></option>";
            html += "<option value='tank'>Tank</option>";
            html += "<option value='heal'>Heal</option>";
            html += "<option value='melee'>Physical DPS</option>";
            html += "<option value='cast'>Caster DPS</option>";
            html += "</select>";
            node.find('.filter-details').html( html );
        }
        break;
    
    case 'class':
        {
            var html = '';  
            html += "<select class='flt_class'>";
            html += "<option value=''></option>";
            html += "<option value='1'>Warrior</option>";
            html += "<option value='2'>Paladin</option>";
            html += "<option value='3'>Hunter</option>";
            html += "<option value='4'>Rogue</option>";
            html += "<option value='5'>Priest</option>";
            html += "<option value='7'>Shaman</option>";
            html += "<option value='8'>Mage</option>";
            html += "<option value='9'>Warlock</option>";
            html += "<option value='11'>Druid</option>";
            html += "</select>";
            node.find('.filter-details').html( html );
        }
        break;
    
    case 'quantity':
        {
            var html = '';
            html += "<div class='flt_quantity'>";
            html += "<select>";
            html += "<option value=''></option>";
            html += "<option value='gt'>&gt;</option>";
            html += "<option value='gte'>&gt;=</option>";
            html += "<option value='lt'>&lt;</option>";
            html += "<option value='lte'>&lt;=</option>";
            html += "<option value='eq'>=</option>";
            html += "</select>";
            html += "<input style='margin-left: 10px' class='flt_value' />";
            html += "</div>";

            node.find('.filter-details').html( html );
        }
        break;
    }
}

function AddFilter( skipRemove ) {
    var html = '';
    
    html += "<div style='clear: both'>";
    html += "<select onchange='ShowFilterDetails(this.parentNode, this.options[this.selectedIndex].value)' style='float: left'>";
    html += "<option value=''></option>";
    html += "<optgroup label='Filter By...'>";
    html += "<option value='role'>Item Set Type</option>";
    html += "<option value='class'>Items Usable by Class</option>";
    html += "<option value='quantity'>Number of Set Items</option>";
    html += "</optgroup>";
    html += "</select> ";
    html += "<div class='filter-details' style='float: left; padding-left: 10px'></div> "
    
    if ( !skipRemove ) {
        html += "<a href='javascript:;' onclick='RemoveFilter(this.parentNode)' style='float: left; padding-left: 10px'>remove</a>";
    } else {
        html += "&nbsp;";
    }
    
    html += "</div>";
    
    var node = $(html);
    
    $('#filters').append( node );
    
    return node;
}

// add 1 filter by default
$(function () {
    if ( !ImportFilterURL() ) {
        AddFilter( true );
    }
} );

/**
 Updates the filter from the set fields
 */
function UpdateFilter() {
    filter.role = [];
    $('.flt_role').each(
        function () {
            filter.role[filter.role.length] = $(this).val();
        }
    );
    
    filter.classId = [];
    $('.flt_class').each(
        function () {
            filter.classId[filter.classId.length] = $(this).val();
        }
    );
    
    filter.quantity = [];
    $('.flt_quantity').each(
        function () {
            var op = $(this).find( 'select' );
            var value = $(this).find( 'input' );
            filter.quantity[filter.quantity.length] = { 'op': $(op).val(), 'value': parseInt($(value).val()) };
        }
    );
}

function ToggleRow( node )
{
    var n = $(node);
    if ( node.wjOff ) {
        n.html( "<img src='/i/plusc.gif' style='border: 0' />" );
        n.parent().parent().siblings().hide();
    } else {
        n.html( "<img src='/i/minusc.gif' style='border: 0' />" );
        n.parent().parent().siblings().show();
    }
    node.wjOff = !node.wjOff;
}

function DisplayResults( filteredMembers ) {
    var overallHtml = '';
    var displayMemberIndex = 0; // increments with each unfiltered member
    for ( var memberIndex in filteredMembers ) {
        var member = filteredMembers[memberIndex];
        var zebraClass = '';
        var html = '';
        
        if ( ( displayMemberIndex % 2 ) == 1 ) {
            zebraClass = 'member-alt-row';
        }

        html += "<tbody class='member-row " + zebraClass + "'>";
        var displayTierIndex = 0;   // increments with each unfiltered tier
        for ( var tierIndex in member.filteredTierData ) {
            var tier = member.filteredTierData[tierIndex];

            var borderstyle = '';
            if ( member.filteredTierData.length > 1 && tierIndex != member.filteredTierData.length - 1 ) {
                borderstyle = 'border: 0';
            }

            var expand = ( member.filteredTierData.length > 1 && tierIndex == 0 );

            html += "<tr class='tierset member-" + member.iMemberID + " role-" + tier.role + " class-" + member.iClassID + "' " + ( ( member.filteredTierData.length > 1 && tierIndex != 0 ) ? "style='display: none'" : "" ) + ">";
            html += "<td align='center' style='" + borderstyle + "'>";

            if ( expand ) {
                html += "<a href='javascript:;' onclick='ToggleRow(this)' class='hide-filtered'><img src='/i/plusc.gif' style='border: 0' /></a>";
            }
            
            html += "</td>";
            html += "<td align='left' style='" + borderstyle + "' class='" + member.clsText + "'>";
            
            if ( displayTierIndex == 0 ) {
                html += "<a name='" + member.vcMemberName + "'></a>";
                //html += "<div id='r" + member.iRaceID + "-" + member.iGender + "' onmouseover='htt(\"" + member.vcRaceName + " " + member.vcGenderName + "\")' onmouseout='nd()'></div>";
                html += "<div id='c" + member.iClassID + "' onmouseover='htt(\"" + member.vcClassName + "\")' onmouseout='nd()'></div>";

                if ( member.iTalentSpec != -1 ) {
                    html += "<div id='t" + member.iClassID + "-" + member.iTalentSpec + "' onmouseover='htt(\"" + member.vcSpecName + "\")' onmouseout='nd()'></div>";
                } else {
                    html += "<div id='t-hybrid' onmouseover='htt(\"" + member.vcSpecName + "\")' onmouseout='nd()'></div>";
                }
                
                html += "<span style='padding-top: 4px; padding-left: 6px; float: left;'>";
                html += "<a href='" + guild.url + "/roster#" + member.vcMemberName + "'>" + member.vcMemberName + "</a>";
                html += "</span>";
            }
            
            html += "</td>";
            html += "<td align='center' style='" + borderstyle + "'>";
            html += "<img alt='" + tier.roleTitle + "' src='/i/classrole/icon_" + tier.role + ".png' />";
            html += "</td>";
            html += "<td align='left' style='" + borderstyle + "'>";
            
            for ( var itemIndex in tier.items ) {
                html += itemIcons[tier.items[itemIndex]] + " ";
            }
            
            html += "</td>";
            html += "<td align='left' style='" + borderstyle + "'>";
            
            for ( var bossIndex in tier.bosses ) {
                html += bossIcons[tier.bosses[bossIndex]] + " ";
            }
            
            html += "</td>";
            html += "</tr>";
            
            displayTierIndex++;
        }
        html += "</tbody>";
        
        // if any part of the member was shown then we are going to display it
        if ( displayTierIndex > 0 ) {
            displayMemberIndex++;
            overallHtml += html;
        }
    }
    
    if ( filteredMembers.length == 0 ) {
        overallHtml = "<tbody><tr><td class='member-row' colspan='5' align='center'>No members match filter</td></tr></tbody>";
    }
    
    // get rid of all the old content
    $('#tier-set-table').find( 'tbody' ).remove();
    $('#tier-set-table').append( overallHtml );
}

function ApplyFilter( skipUpdateURL ) {
    UpdateFilter();

    var filteredMembers = [];
    for ( var memberIndex in members ) {
        var member = members[memberIndex];
        var filterMember = false;

        member.filteredTierData = [];
        
        //
        // Filter based on Class
        //
        if ( filter.classId.length > 0 ) {
            var filterIndex = 0;
            
            while ( filterIndex < filter.classId.length ) {
                if ( filter.classId[filterIndex] && filter.classId[filterIndex] == member.iClassID ) {
                    break;
                }
                filterIndex++;
            }

            // didn't match any filters - skip this one
            if ( filterIndex == filter.classId.length ) {
                filterMember = true;
            }
        }
            
        for ( var tierIndex in member.tierData ) {
            var tier = member.tierData[tierIndex];
            var filterTier = false;
               
            //
            // Filter based on Roles
            //
            if ( filter.role.length > 0 ) {
                var filterIndex = 0;
                
                while ( filterIndex < filter.role.length ) {
                    if ( filter.role[filterIndex] && filter.role[filterIndex] == tier.role ) {
                        break;
                    }
                    filterIndex++;
                }
                
                // didn't match any filters - skip this one
                if ( filterIndex == filter.role.length ) {
                    filterTier = true;
                }
            }
            
            //
            // Filter based on Quantity
            //
            if ( filter.quantity.length > 0 ) {
                var filterIndex = 0;
                while ( !filterTier && filterIndex < filter.quantity.length ) {
                    var filterVal = filter.quantity[filterIndex].value;
                    
                    var shouldInclude = true;
                    switch ( filter.quantity[filterIndex].op ) {
                        case 'lt':  // only where there is less than...
                            shouldInclude = tier.quan < filterVal;
                            break;
                        case 'lte': // only include where there is less than or equal to...
                            shouldInclude = tier.quan <= filterVal;
                            break;
                        case 'gt':  // only include where there is greater than...
                            shouldInclude = tier.quan > filterVal;
                            break;
                        case 'gte': // only include where there is greater than or equal to...
                            shouldInclude = tier.quan >= filterVal;
                            break;
                        case 'eq':  // only include where the values are equal
                            shouldInclude = tier.quan == filterVal;
                            break;
                        case 'ne':  // only include where the values aren't equal
                            shouldInclude = tier.quan != filterVal;
                            break;
                    }
                    if ( !shouldInclude ) {
                        filterTier = true;
                    }
                    filterIndex++;
                }
            }
            
            if ( !filterTier ) {
                member.filteredTierData[member.filteredTierData.length] = tier;
            }
        }
        
        // if the member themself hasn't been filtered and all their gear hasn't been filtered...
        if ( !filterMember && member.filteredTierData.length > 0 ) {
            member.filteredTierData.sort(
                function ( a, b ) {
                    if ( a.quan > b.quan ) {
                        return -1;
                    } else if ( a.quan < b.quan ) {
                        return 1;
                    } else {
                        return 0;
                    }
                }
            );
            filteredMembers[filteredMembers.length] =  member;
        }
    }
    
    // filter all the members based on the amount of tier gear they have
    filteredMembers.sort(
        function ( a, b ) {
            var aFilters = a.filteredTierData.length;
            var bFilters = b.filteredTierData.length;
            if ( aFilters != 0 && bFilters == 0 ) {
                return 1;
            } else if ( ( aFilters == 0 && bFilters != 0 ) || ( aFilters == 0 && bFilters == 0 ) ) {
                return -1;
            } else {
                if ( a.filteredTierData[0].quan > b.filteredTierData[0].quan ) {
                    return -1;
                } else if ( a.filteredTierData[0].quan < b.filteredTierData[0].quan ) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }
    );
    
    //
    // Render the list
    //
    DisplayResults( filteredMembers );

    if ( !skipUpdateURL ) {
        UpdateFilterURL();
    }
}
