    
        var points = 30;
        
        var offense_points = 0;
        var defense_points = 0;
        var utility_points = 0;
        
        var highest_req_points = 0;
        var ttl_points_below_highest = 0;
        var ttl_points_at_highest = 0;
        var has_children = false;
        
        var tooltip_obj = undefined;
        
        $(document).ready(function() {
           masteriesInitialise();
        });
        
        function masteriesInitialise() {
         
            $('.masteries_icon_box .masteries_point_box').each(function() {
               
                if ($.browser.msie) {
                    
                    $(this).addClass('masteries_point_box_ie');
                    
                }
                
                if ($.browser.opera) {
                    
                    $(this).addClass('masteries_point_box_opera');
                    
                }
                 
            });
            
            $('.masteries_icon').each(function() {
                
                $(this).mTooltipReset();
                $(this).mTooltip({ ajax: MasteriesMakeTooltip($(this)), className:'itemToolTip', ajaxRefresh: true, delay: 1000});
                
            });
                
            $('.masteries_icon').click(function(e) {
                
                if (e.shiftKey) {
                    
                    // remove point
                    masteryRemove($(this));
                    
                } else {
                 
                    masteryClick($(this));
                    
                }
                
                $(this).mTooltipReset();
                $(this).mTooltip({ ajax: MasteriesMakeTooltip($(this)), className:'itemToolTip', ajaxRefresh: true, delay: 1000});
                
            });
            
            $('.masteries_icon').rightClick( function (e) {
               
                // remove point
                masteryRemove($(this));
                
                $(this).mTooltipReset();
                $(this).mTooltip({ ajax: MasteriesMakeTooltip($(this)), className:'itemToolTip', ajaxRefresh: true, delay: 1000});
                 
            });
            
   
        }
        
        function activateBox(obj, parent, id) {
            
            obj.removeClass('point_box_inactive');
            obj.addClass('point_box_active');
            obj.parent().find('img').removeClass('icon_inactive');
            obj.parent().find('img').addClass('icon_active');
            obj.parent().find('img').attr('src', 'images/icons/masteries/active/' + obj.parent().attr('id') + '.png');

            if (parent != undefined) {
                
                obj = parent.parent().parent().parent().find('.masteries_tree_spacer').each(function() {
                    
                    if ($(this).attr('id') == id) {
                            
                        $(this).removeClass('masteries_tree_linker_inactive');
                        $(this).addClass('masteries_tree_linker_active');
                        
                    }
                
                });
                    
            }
                        
        }
        
        function deactivateBox(obj, parent, id) {
            
            obj.removeClass('point_box_active');
            obj.addClass('point_box_inactive');
            obj.parent().find('img').removeClass('icon_active');
            obj.parent().find('img').addClass('icon_inactive');
            obj.parent().find('img').attr('src', 'images/icons/masteries/inactive/' + obj.parent().attr('id') + '.png');
            
            if (parent != undefined) {
                
                obj = parent.parent().parent().parent().find('.masteries_tree_spacer').each(function() {
                    
                    if ($(this).attr('id') == id) {
                            
                        $(this).removeClass('masteries_tree_linker_active');
                        $(this).addClass('masteries_tree_linker_inactive');
                        
                    }
                
                });
                    
            }
                  
        }
        
        function treeCheck(area, area_points) {
                     
            $('.point_box_maxed').each(function() {
               
                if ($(this).attr('current') == $(this).attr('max')) {
                    
                    icon = $(this).parent().find('img');
                    
                    icon.removeClass('icon_inactive');
                    icon.removeClass('icon_active');
                    icon.addClass('icon_maxed');
                    
                    $(this).removeClass('point_box_inactive');
                    $(this).removeClass('point_box_active');
                    $(this).addClass('point_box_maxed');
                    
                } else {
                    
                    icon = $(this).parent().find('img');
                    
                    icon.removeClass('icon_maxed');
                    icon.addClass('icon_active');
                    
                    $(this).removeClass('point_box_maxed');
                    $(this).addClass('point_box_active');
                    
                }
                         
            });
            
            $('.masteries_point_box').each(function() {
                
                if (parseInt($(this).attr('required')) <= area_points && $(this).parent().parent().parent().parent().parent().parent().attr('id') == area) {
                    
                    if ($(this).attr('prereq') != undefined) {
                        
                        obj = $('#'+area+' #' + $(this).attr('prereq'));
                        
                        if (obj != undefined && obj.find('.masteries_point_box').attr('current') == obj.find('.masteries_point_box').attr('max')) {
                         
                            activateBox($(this), obj, $(this).attr('prereq'));
                               
                        }
                        
                    } else {
                            
                        activateBox($(this));
                        
                    }
                    
                } else if (parseInt($(this).attr('required')) > area_points && $(this).parent().parent().parent().parent().parent().parent().attr('id') == area) {
                    
                    if ($(this).attr('prereq') != undefined) {
                        
                        obj = $('#'+area+' #' + $(this).attr('prereq'));
                        
                        if (obj != undefined) {
                         
                            deactivateBox($(this), obj, $(this).attr('prereq'));
                               
                        }
                        
                    } else {
                        
                        deactivateBox($(this));
                        
                    }
                    
                }
                    
            });
            
            $('.masteries_point_box').each(function() {
                
                if (parseInt($(this).attr('current')) == 0 && points == 0) {
                    
                    // disable any active boxes when run out of points
                    if ($(this).attr('prereq') != undefined) {
                        
                        obj = $('#'+area+' #' + $(this).attr('prereq'));
                        
                        if (obj != undefined) {
                         
                            deactivateBox($(this), obj, $(this).attr('prereq'));
                               
                        }
                        
                    } else {
                        
                        deactivateBox($(this));
                        
                    }
                    
                } else if (parseInt($(this).attr('current')) == 0) {
                    
                    // disable any trees when not enough required points
                    if ($(this).attr('prereq') != undefined) {
                        
                        obj = $('#'+area+' #' + $(this).attr('prereq'));
                        
                        if (obj != undefined && (obj.find('.masteries_point_box').attr('current')) != obj.find('.masteries_point_box').attr('max')) {
                         
                            deactivateBox($(this), obj, $(this).attr('prereq'));
                               
                        }
                        
                    }
                    
                }
                
            });
            
            $('#'+area+' .masteries_tree_total_box').html(area_points);
               
        }
        
        function masteryClick(xObj, val) {
         
            obj         = xObj.parent();
            
            id          = obj.attr('id');
            area        = obj.parent().parent().parent().parent().parent().attr('id');
            
            if (points > 0) {
             
                tmp = obj.find('.masteries_point_box');
                
                if (tmp.attr('prereq') != undefined) {
                        
                    var parent = $('#'+area+' #' + tmp.attr('prereq'));
                    
                    if (parent != undefined) {
                        
                        if (parent.find('.masteries_point_box').attr('current') != parent.find('.masteries_point_box').attr('max')) {
                         
                            return false;
                               
                        }
                        
                    } 
                
                }
                
                if (parseInt(tmp.attr('current')) < parseInt(tmp.attr('max'))) {
                        
                    area_points = 0;
                    safe = true;
                    
                    switch(area) {
                     
                        case 'masteries_offense_box':
                        
                            area_points = offense_points;
                            if (parseInt(tmp.attr('required')) > area_points) {
                                
                                safe = false;
                                
                            } else {
                             
                                if (val == undefined) {
                                    
                                    offense_points++;   
                                    
                                } else {
                                 
                                    offense_points = offense_points + parseInt(val);
                                       
                                }
                    
                            }
                        
                        break;
                        
                        case 'masteries_defense_box':
                        
                            area_points = defense_points;
                            if (parseInt(tmp.attr('required')) > area_points) {
                                
                                safe = false;
                                
                            } else {
                             
                                if (val == undefined) {
                                    
                                    defense_points++;   
                                    
                                } else {
                                 
                                    defense_points = defense_points + parseInt(val);
                                       
                                }
                    
                            }
                        
                        break;
                        
                        case 'masteries_utility_box':
                        
                            area_points = utility_points;
                            if (parseInt(tmp.attr('required')) > area_points) {
                                
                                safe = false;
                                
                            } else {
                             
                                if (val == undefined) {
                                    
                                    utility_points++;   
                                    
                                } else {
                                 
                                    utility_points = utility_points + parseInt(val);
                                       
                                }
                    
                            }
                    
                        break;
                           
                    }
                    
                    
                    if (safe) {
                        
                        if (val != undefined && parseInt(val) <= parseInt(tmp.attr('max'))) {
                            
                            tmp.attr('current', parseInt(tmp.attr('current')) + parseInt(val));
                            
                        } else {
                            
                            tmp.attr('current', parseInt(tmp.attr('current')) + 1);
                            
                        }
                        
                        tmp.html(tmp.attr('current') + '/' + tmp.attr('max'));
                        
                        if (tmp.attr('current') == tmp.attr('max')) {
                            
                            icon = obj.find('img');
                            
                            icon.removeClass('icon_inactive');
                            icon.removeClass('icon_active');
                            icon.addClass('icon_maxed');
                            
                            tmp.removeClass('point_box_inactive');
                            tmp.removeClass('point_box_active');
                            tmp.addClass('point_box_maxed');
                            
                        }
                        
                        if (val == undefined) {
                            
                            points--;
                            
                        } else {
                         
                            points = points - parseInt(val);
                               
                        }
                        
                        $('#masteries_offense_points').html(offense_points);
                        $('#masteries_defense_points').html(defense_points);
                        $('#masteries_utility_points').html(utility_points);
                        $('#masteries_remaining_points').html(points);
                        
                    }
                        
                            
                }
                   
            }
            
            treeCheck('masteries_offense_box', offense_points);
            treeCheck('masteries_defense_box', defense_points);
            treeCheck('masteries_utility_box', utility_points);
            
                   
        }
        
        function findNeededInformation(obj) {
         
            highest_req_points = 0;
            ttl_points_at_highest = 0;
            ttl_points_below_highest = 0;
            
            has_children = false;
            
            area        = obj.parent().parent().parent().parent().parent().attr('id');
            
            $('#'+ area + ' .masteries_point_box').each(function() {
                
                if (parseInt($(this).attr('current')) >= 1 && parseInt($(this).attr('required')) > highest_req_points) {
                 
                    highest_req_points = $(this).attr('required');
                    ttl_points_at_highest = $(this).attr('current');
                       
                } else if (parseInt($(this).attr('current')) >= 1 && parseInt($(this).attr('required')) == highest_req_points) {
                    
                    ttl_points_at_highest = ttl_points_at_highest + parseInt($(this).attr('current'));
                    
                }
                                       
            });
        
            $('#'+ area + ' .masteries_point_box').each(function() {
                
                if (parseInt($(this).attr('current')) >= 1 && parseInt($(this).attr('required')) < highest_req_points) {
                 
                    ttl_points_below_highest = (ttl_points_below_highest + parseInt($(this).attr('current')));
                                           
                }
                
                if (parseInt($(this).attr('current')) >= 1) {
                    
                    id = $(this).attr('prereq');
                    
                    if (id != undefined && obj.attr('id') == id) {
                    
                        has_children = true;
                            
                    }                 
                    
                }
                
            });
                
                            
        }
        
        function masteryRemove(xObj) {
            
            obj         = xObj.parent();
            
            id          = obj.attr('id');
            area        = obj.parent().parent().parent().parent().parent().attr('id');
            
            if (points < 30) {
             
                tmp = obj.find('.masteries_point_box');
                findNeededInformation(obj);
                
                if (parseInt(tmp.attr('current')) >= 1 && has_children == false) {
                    
                    safe = true;
                    
                    area_points = 0;
                    
                    switch(area) {
                     
                        case 'masteries_offense_box':
                        
                            area_points = offense_points;
                            
                            if ((parseInt(highest_req_points) + 1) > parseInt(ttl_points_below_highest) && parseInt(tmp.attr('required')) < parseInt(highest_req_points)) {
                                
                                safe = false;
                                
                            } else {
                             
                                offense_points--;  
                    
                            }
                        
                        
                        break;
                        
                        case 'masteries_defense_box':
                        
                            area_points = defense_points;
                            if ((parseInt(highest_req_points) + 1) > parseInt(ttl_points_below_highest) && parseInt(tmp.attr('required')) < parseInt(highest_req_points)) {
                                
                                safe = false;
                                
                            } else {
                             
                                defense_points--;   
                    
                            }
                        
                        break;
                        
                        case 'masteries_utility_box':
                        
                            area_points = utility_points;
                            if ((parseInt(highest_req_points) + 1) > parseInt(ttl_points_below_highest) && parseInt(tmp.attr('required')) < parseInt(highest_req_points)) {
                                
                                safe = false;
                                
                            } else {
                             
                                utility_points--;
                    
                            }
                    
                        break;
                           
                    }
                    
                    if (safe) {
                        
                        tmp.attr('current', parseInt(tmp.attr('current')) - 1);
                        tmp.html(tmp.attr('current') + '/' + tmp.attr('max'));
                        
                        points++;
                        
                        $('#masteries_offense_points').html(offense_points);
                        $('#masteries_defense_points').html(defense_points);
                        $('#masteries_utility_points').html(utility_points);
                        $('#masteries_remaining_points').html(points);
                        
                    }
                        
                            
                }
                   
            }
            
            treeCheck('masteries_offense_box', offense_points);
            treeCheck('masteries_defense_box', defense_points);
            treeCheck('masteries_utility_box', utility_points);
            
        }
        
        function MasteriesResetPoints() {
            
            points = 30;
            
            offense_points = 0;
            defense_points = 0;
            utility_points = 0;
        
            $('.masteries_point_box').each(function() {
               
                $(this).attr('current', 0);
                $(this).html($(this).attr('current') + '/' + $(this).attr('max'));
                 
            });
            
            $('#masteries_offense_points').html(offense_points);
            $('#masteries_defense_points').html(defense_points);
            $('#masteries_utility_points').html(utility_points);
            $('#masteries_remaining_points').html(points);
                        
            treeCheck('masteries_offense_box', offense_points);
            treeCheck('masteries_defense_box', defense_points);
            treeCheck('masteries_utility_box', utility_points);
            
        }
        
        function MasteriesMakeTooltip(obj) {
            
            info = obj.parent().find('.masteries_point_box');
            
            return 'masteries/tooltip/'+obj.attr('id')+'/'+info.attr('current');
               
        }
        
        function MasteriesForumulateURI() {
            
            masteries_uri = '';
            
            $('.masteries_point_box').each(function() {
                
                masteries_uri = masteries_uri + $(this).attr('current');
                
            });
            
            return masteries_uri;
            
        }
        
        function MasteriesMakeLink() {
            
            window.location = $('base').attr('href') + 'masteries/'+ MasteriesForumulateURI();
            
        }
        
        function MasteriesSimulateClick(id, val) {
            
            $('.masteries_icon').each(function() {
                
                if ($(this).attr('id') == id) {
                    
                    masteryClick($(this), val);
                       
                }
                
            });
            
        }
        
        