
/**
 * @param {object} data {token_id:int, votes:int, points:int, rating:long, voting_enabled:string}
 */
function render_token_rating(data)
{
    // console.log(data);
    
    data.votes  = parseInt(data.votes);
    data.rating = parseFloat(data.rating).toFixed(3).toString();
    var $this   = $(sprintf('.nft_ratings_container[data-token-id="%s"]', data.token_id));
    
    var voting_enabled = data.voting_enabled == 'true';
    if( $this.hasClass('inactive') ) voting_enabled = false;
    // if( $this.hasClass('active') )   voting_enabled = true;
    
    var already_processed = $this.attr('already_processed');
    if( typeof already_processed == 'undefined' ) already_processed = 'false';
    
    if( already_processed == 'true' ) return;
    
    var int_part = data.rating, dec_part = 0;
    var parts = data.rating.split('.');
    if( parts.length == 2 )
    {
        int_part = parseInt(parts[0]);
        dec_part = parseInt(parts[1]);
    }
    
    var star_count     = parseInt(int_part);
    var has_half_part  = false;
    if(      dec_part >   0 && dec_part <= 400 ) { has_half_part = false; }
    else if( dec_part > 400 && dec_part <= 800 ) { has_half_part = true; }
    else if( dec_part > 800 )                    { has_half_part = false; star_count++; }
    
    if( ! voting_enabled )
    {
        var returning_html = '';
        for( var c = 1; c <= star_count; c++ )
            returning_html = returning_html + '<i class="fa fa-star" oclass="fa-star"></i>';
        if( has_half_part )
            returning_html = returning_html + '<i class="fa fa-star-half-o" oclass="fa-star-half-o"></i>';
        var next_start = (star_count < 5 && ! has_half_part) ? star_count + 1 :
                         (star_count < 4 && has_half_part)   ? star_count + 2 :
                         0;
        if( next_start > 0 )
            for( c = next_start; c <= 5; c++ )
                returning_html = returning_html + '<i class="fa fa-star-o" oclass="fa-star-o"></i>';
        $this.addClass('inactive').attr('already_processed', 'true').find('.stars').html(returning_html);
    }
    else
    {
        returning_html = '';
        for( c = 1; c <= star_count; c++ )
            returning_html = returning_html
                           + sprintf('<i value="%s" class="fa fa-star" oclass="fa-star" ' +
                                     'onmouseover="token_rating_hover(this)" ' +
                                     'onmouseout="token_rating_hout(this)" ' +
                                     'onclick="token_rating_click(this)"></i>', c);
        if( has_half_part )
            returning_html = returning_html
                           + sprintf('<i value="%s" class="fa fa-star-half-o" oclass="fa-star-half-o" ' +
                                     'onmouseover="token_rating_hover(this)" ' +
                                     'onmouseout="token_rating_hout(this)" ' +
                                     'onclick="token_rating_click(this)"></i>', c);
        next_start = (star_count < 5 && ! has_half_part) ? star_count + 1 :
                     (star_count < 4 && has_half_part)   ? star_count + 2 :
                     0;
        if( next_start > 0 )
            for( c = next_start; c <= 5; c++ )
                returning_html = returning_html
                               + sprintf('<i value="%s" class="fa fa-star-o" oclass="fa-star-o" ' +
                                         'onmouseover="token_rating_hover(this)" ' +
                                         'onmouseout="token_rating_hout(this)" ' +
                                         'onclick="token_rating_click(this)"></i>', c);
        $this.attr('already_processed', 'true').find('.stars').html(returning_html);
    }
    
    var $messages = $('#nft_rating_messages');
    var message;
    
    if( data.votes == 0 )
    {
        message = $messages.find('.zero_votes').text();
    }
    else
    {
        message = voting_enabled ? $messages.find('.not_voted').text() : $messages.find('.already_voted').text();
        message = message.replace('{$votes}', data.votes);
    }
    
    if( $this.find('.voting').length > 0 )
        $this.find('.voting').html(message);
    else
        $this.attr('title', message);
    
    if( $this.find('.stats').length > 0 )
    {
        message = $messages.find('.results').text();
        message = message.replace('{$points}', data.points);
        message = message.replace('{$rating}', data.rating);
        $this.find('.stats').html(message);
    }
}

function token_rating_hover(element)
{
    var element_value = $(element).attr('value');
    $(element).closest('.stars').find('i').each( function()
    {
        if( $(this).attr('value') <= element_value )
        {
            var oclass = $(this).attr('oclass');
            $(this).removeClass(oclass).addClass('fa-star hovered');
        }
    });
}

function token_rating_hout(element)
{
    $(element).closest('.stars').find('i').each(function()
    {
        var oclass = $(this).attr('oclass');
        $(this).removeClass('fa-star hovered').addClass(oclass);
    });
}

function token_rating_click(element)
{
    var $container   = $(element).closest('.nft_ratings_container');
    var $parent_span = $(element).closest('.token_rating_target');
    var token_id     = $container.attr('data-token-id');
    var user_vote    = $(element).attr('value');
    
    var url = $_FULL_ROOT_PATH + '/nft_ratings/register_vote.php'
            + '?token_id='     + encodeURI(token_id)
            + '&user_vote='    + encodeURI(user_vote)
            + '&wasuuup='      + wasuuup()
        ;
    
    $parent_span.block(blockUI_smallest_params);
    $.getJSON( url, function( data )
    {
        if( data.message.indexOf('OK') < 0 )
        {
            alert( data.message );
            $parent_span.unblock();
            
            return;
        }
        
        $parent_span.unblock();
        $container.attr('already_processed', '');
        render_token_rating(data.data);
    });
}

function delete_vote(entry_id)
{
    var $container = $('#nft_rating_vote_details');
    var $tr        = $container.find('tr[data-id="' + entry_id + '"]');
    
    var url    = $_FULL_ROOT_PATH + '/nft_ratings/delete_vote.php';
    var params = {
        id:      entry_id,
        wasuuup: wasuuup()
    };
    
    $tr.block(blockUI_smallest_params);
    $.get(url, params, function(response)
    {
        if( response != 'OK' )
        {
            alert( response );
            $tr.unblock();
            
            return;
        }
        
        $tr.unblock();
        $tr.fadeOut('fast', function() { $(this).remove(); });
    });
}
