Bio = function(name) {
    this.initialize(name);
}

$.extend(Bio.prototype, {
    initialize: function(name) {
        this.name = name;
        this.apiUser = "web";
        this.apiUserKey = "web";
        this.apiUrl = "/api/?username="+this.apiUser+"&key="+this.apiUserKey;
    },

    addCategoriesListener: function() {
        $('#categoriesUl').find('.category').click(
            function() {
                $(this).siblings().find('.title').removeClass('expanded');
                $(this).siblings('.categorySubcategoriesLi').hide();

                if($(this).find('.title').hasClass('expanded')) {
                    $(this).find('.title').removeClass('expanded');
                    $(this).next('.categorySubcategoriesLi').hide();
                }
                else {
                    $(this).find('.title').addClass('expanded');
                    $(this).next('.categorySubcategoriesLi').show();
                }

            }
            );
    },

    loadComparatorValues: function(comparatorValues, activeDomain) {
        // Sort the values by PageMass descending
        var scoreArray = new Array();
        for(key in comparatorValues) {
            scoreArray.push(comparatorValues[key])
        }
        scoreArray.sort()
        var comparatorSortedValues = {};
        for(var i = scoreArray.length - 1; i >= 0; i--) {
            for(key in comparatorValues) {
                if(scoreArray[i] == comparatorValues[key]) {
                    comparatorSortedValues[key] = scoreArray[i];
                    comparatorValues[key] = null;
                }
            }
        }

        // Manipulate the DOM
        var barCount = 0;
        var inputValueCount = 0;
        for(key in comparatorSortedValues) {

            $($('.comparatorBar' + (barCount + 1)).find('.comparatorBarNumber')).html(comparatorSortedValues[key]);
            $($('.comparatorBar' + (barCount + 1)).find('.comparatorBarDomain')).html(key.replace(/\.[A-Za-z0-9]+$/, ''));

            if(key == activeDomain) {
                $($('.comparatorBar' + (barCount + 1)).find('.comparatorBarBlock').get(0)).removeClass('comparatorBarBlockSecondary').addClass('comparatorBarBlockPrimary');
            }
            else {
                $($('.comparatorBar' + (barCount + 1)).find('.comparatorBarBlock').get(0)).removeClass('comparatorBarBlockPrimary').addClass('comparatorBarBlockSecondary');
            }

            // Animate the growth of the bar
            $('.comparatorBar' + (barCount + 1)).find('.comparatorBarBlock').each(function(index, value) {
                $(value).unbind()
                .bind('mouseenter', {pageMass: comparatorSortedValues[key], currentDomain: key, active: activeDomain}, function(event) {
                    var sphereColor = 'orange';
                    if(event.data.currentDomain != event.data.active) {
                        $('.delta').hide();
                        $('.deltaDescription').text(event.data.currentDomain.replace(/\.[A-Za-z0-9]+$/, '').substr(0, 19)).addClass('deltaDescriptionWithMargin');
                        sphereColor = 'blue';
                    }
                    else {
                        $('.delta').show();
                        $('.deltaDescription').text(event.data.active.replace(/\.[A-Za-z0-9]+$/, '').substr(0, 19)).removeClass('deltaDescriptionWithMargin');
                    }

                    $('#sphere').find('img').attr('src', '/bio/images/pagemass-spheres/'+sphereColor+'/'+sphereColor+'-sphere-' + event.data.pageMass + '.jpg');
                    $('.bioPageMass').find('span').text(event.data.pageMass);

                })
                .animate({
                    height: comparatorSortedValues[key] + 'px'
                }, 1000)
                .append('<a style="display: block; height: 100%" href="http://dev.pagemass.com/bio/url/'+key+'"></a>')
                .parent().parent().bind('mouseleave', {pageMass: comparatorSortedValues[activeDomain], active: activeDomain}, function(event) {
                    $('#sphere').find('img').attr('src', '/bio/images/pagemass-spheres/orange/orange-sphere-' + event.data.pageMass + '.jpg');
                    $('.bioPageMass').find('span').text(event.data.pageMass);
                    $('.delta').show();
                    $('.deltaDescription').text(event.data.active.replace(/\.[A-Za-z0-9]+$/, '').substr(0, 19)).removeClass('deltaDescriptionWithMargin');
                });
            });

            if(key != activeDomain) {
                $('#comparatorSite' + (inputValueCount + 1)).val(key);
                inputValueCount++
            }

            barCount++;
            if(barCount >= 5) {
                break;
            }
        }
    },

    drawPageMassSphere: function(pageMass) {
        var ctx = utility.constructCanvas($('#sphere')).getContext('2d');
        this.drawSphere(ctx, pageMass);
    },

    drawSphere: function(ctx, x) {
        if(x < 1) {
            x = 1;
        }

        //var baseColors = Array('#0013CC', '#1311B9', '#2510A7', '#380E94', '#4A0C82', '#5D0A6F', '#82074A', '#940538', '#A70325', '#B90213', '#CC0000', '#CC1100', '#CC3400', '#CC4500', '#CC5600', '#CC6800', '#CC7900', '#CC8A00', '#CCAD00', '#CCBE00', '#FFFFFF');
        var baseColors = Array('#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000', '#000000');
        var baseColorIndex = Math.ceil(x / 5) - 1;
        var baseColor = baseColors[baseColorIndex];
        var baseColorObject = utility.parseColor(baseColor);
        var baseColorHsv = utility.rgbToHsv(baseColorObject.r, baseColorObject.g, baseColorObject.b);
        var highlightColor = utility.hsvToRgb(baseColorHsv[0], baseColorHsv[1], baseColorHsv[2] + 60);
        var highlight = new utility.Color(highlightColor[0], highlightColor[1], highlightColor[2]).toString();

        // Draw a circle
        ctx.beginPath();
        ctx.arc(50, 50, x / 2, 0, Math.PI * 2, true);
        ctx.fillStyle = baseColor;
        ctx.fill();

        // Create gradients
        var radgrad = ctx.createRadialGradient(50 - (x / 50) * 7, 50 - (x / 50) * 7, x / 3.8, 50, 50, x / 2);
        radgrad.addColorStop(0, highlight);
        radgrad.addColorStop(0.9, baseColor);
        radgrad.addColorStop(1, 'rgba(75,75,75,0)');

        // draw shapes
        ctx.fillStyle = radgrad;
        ctx.fillRect(0, 0, 100, 100);
    },

    showAlert: function(message) {
        $('#alertMessage').html('<span style="font-weight: bold">Bio Alert:</span> ' + message);

        if($('#alert').is(':visible')) {
            $('#alert').animate({
                opacity: 0.8
            }, 750 )
            .animate({
                opacity: 1
            }, 750);
        }
        else {
            $('#alert').slideDown();
        }
    },

    updatePageMass: function() {
        this.show()
    }
});

bio = new Bio("bio");