/**
 *  Progress Bar 1.3.1.0
 *  Copyright 2007-2010 Infernus' Group,
 *  Fl?vio Toribio (flavio_toribio@hotmail.com)
 */

#if defined _progress_included
    #endinput
#endif

#if !defined _samp_included
    #tryinclude <a_samp>
    #if !defined _samp_included
        #error could not locate a_samp.inc file, please check your server includes
    #endif
#endif

#tryinclude <foreach>

#define _progress_included
#define _progress_version    0x1310

#define MAX_BARS                (MAX_TEXT_DRAWS / 3)
#define INVALID_BAR_VALUE        (Float:0xFFFFFFFF)
#define INVALID_BAR_ID            (Bar:-1)
#define pb_percent(%1,%2,%3,%4)    ((%1 - 6.0) + ((((%1 + 6.0 + %2 - 2.0) - %1) / %3) * %4))
//pb_percent(x, width, max, value)

/* Pawno/Infernus Pawn Editor function list
native Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0);
native DestroyProgressBar(Bar:barid);
native ShowProgressBarForPlayer(playerid, Bar:barid);
native HideProgressBarForPlayer(playerid, Bar:barid);
native ShowProgressBarForAll(Bar:barid);
native HideProgressBarForAll(Bar:barid);
native SetProgressBarValue(Bar:barid, Float:value);
native Float:GetProgressBarValue(Bar:barid);
native SetProgressBarMaxValue(Bar:barid, Float:max);
native SetProgressBarColor(Bar:barid, color);
native UpdateProgressBar(Bar:barid, playerid=INVALID_PLAYER_ID);
*/

forward Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0);
forward Float:GetProgressBarValue(Bar:barid);

enum e_bar
{
    Float:pb_x,
    Float:pb_y,
    Float:pb_w,
    Float:pb_h,
    Float:pb_m,
    Float:pb_v,
    Text:pb_t1,
    Text:pb_t2,
    Text:pb_t3,
    pb_color,
    bool:pb_created
}

static Bars[MAX_BARS][e_bar];

stock Bar:CreateProgressBar(Float:x, Float:y, Float:width=55.5, Float:height=3.2, color, Float:max=100.0)
{
    new
        barid;

    for(barid = 0; barid < sizeof Bars; ++barid)
        if(!Bars[barid][pb_created]) break;

    if(Bars[barid][pb_created] || barid == sizeof Bars)
        return INVALID_BAR_ID;

    new Text:in_t = Bars[barid][pb_t1] = TextDrawCreate(x, y, "_");
    TextDrawUseBox        (in_t, 1);
    TextDrawTextSize    (in_t, x + width, 0.0);
    TextDrawLetterSize    (in_t, 1.0, height / 10);
    TextDrawBoxColor    (in_t, 0x00000000 | (color & 0x000000FF));

    in_t = Bars[barid][pb_t2] = TextDrawCreate(x + 1.2, y + 2.15, "_");
    TextDrawUseBox        (in_t, 1);
    TextDrawTextSize    (in_t, x + width - 2.0, 0.0);
    TextDrawLetterSize    (in_t, 1.0, height / 10 - 0.35);
    TextDrawBoxColor    (in_t, (color & 0xFFFFFF00) | (0x66 & ((color & 0x000000FF) / 2)));

    in_t = Bars[barid][pb_t3] = TextDrawCreate(x + 1.2, y + 2.15, "_");
    TextDrawTextSize    (in_t, pb_percent(x, width, max, 1.0), 0.0);
    TextDrawLetterSize    (in_t, 1.0, height / 10 - 0.35);
    TextDrawBoxColor    (in_t, color);

    Bars[barid][pb_x] = x;
    Bars[barid][pb_y] = y;
    Bars[barid][pb_w] = width;
    Bars[barid][pb_h] = height;
    Bars[barid][pb_m] = max;
    Bars[barid][pb_color] = color;
    Bars[barid][pb_created] = true;
    return Bar:barid;
}

stock DestroyProgressBar(Bar:barid)
{
    if(barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
    {
        if(!Bars[_:barid][pb_created])
            return 0;

        TextDrawDestroy(Bars[_:barid][pb_t1]);
        TextDrawDestroy(Bars[_:barid][pb_t2]);
        TextDrawDestroy(Bars[_:barid][pb_t3]);

        Bars[_:barid][pb_t1] = Text:0;       
        Bars[_:barid][pb_t2] = Text:0;       
        Bars[_:barid][pb_t3] = Text:0;
        Bars[_:barid][pb_x] = 0.0;
        Bars[_:barid][pb_y] = 0.0;
        Bars[_:barid][pb_w] = 0.0;
        Bars[_:barid][pb_h] = 0.0;
        Bars[_:barid][pb_m] = 0.0;
        Bars[_:barid][pb_v] = 0.0;
        Bars[_:barid][pb_color] = 0;
        Bars[_:barid][pb_created] = false;
        return 1;
    }
    return 0;
}

stock ShowProgressBarForPlayer(playerid, Bar:barid)
{
    if(IsPlayerConnected(playerid) && barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
    {
        if(!Bars[_:barid][pb_created])
            return 0;

        TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t1]);
        TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t2]);
        TextDrawShowForPlayer(playerid, Bars[_:barid][pb_t3]);
        return 1;
    }
    return 0;
}

stock HideProgressBarForPlayer(playerid, Bar:barid)
{
    if(IsPlayerConnected(playerid) && barid != INVALID_BAR_ID && Bar:-1 < barid < Bar:MAX_BARS)
    {
        if(!Bars[_:barid][pb_created])
            return 0;

        TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t1]);
        TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t2]);
        TextDrawHideForPlayer(playerid, Bars[_:barid][pb_t3]);
        return 1;
    }
    return 0;
}

stock SetProgressBarValue(Bar:barid, Float:value)
{
    if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
        return 0;

    if(Bars[_:barid][pb_created])
    {
        value =
            (value < 0.0) ? (0.0) : (value > Bars[_:barid][pb_m]) ? (Bars[_:barid][pb_m]) : (value);

        TextDrawUseBox(Bars[_:barid][pb_t3], value > 0.0);

        Bars[_:barid][pb_v] = value;

        TextDrawTextSize(Bars[_:barid][pb_t3],
            pb_percent(Bars[_:barid][pb_x], Bars[_:barid][pb_w], Bars[_:barid][pb_m], value), 0.0);

        return 1;
    }
    return 0;
}

stock Float:GetProgressBarValue(Bar:barid)
{
    if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
        return INVALID_BAR_VALUE;

    if(Bars[_:barid][pb_created])
        return Bars[_:barid][pb_v];

    return INVALID_BAR_VALUE; 
}

stock SetProgressBarMaxValue(Bar:barid, Float:max)
{
    if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
        return 0;

    if(Bars[_:barid][pb_created])
    {
        Bars[_:barid][pb_m] = max;
        SetProgressBarValue(barid, Bars[_:barid][pb_v]);
        return 1;
    }
    return 0;
}

stock SetProgressBarColor(Bar:barid, color)
{
    if(barid == INVALID_BAR_ID || Bar:MAX_BARS < barid < Bar:-1)
        return 0;

    if(Bars[_:barid][pb_created])
    {    
        Bars[_:barid][pb_color] = color;
        TextDrawBoxColor(Bars[_:barid][pb_t1], 0x00000000 | (color & 0x000000FF));

        TextDrawBoxColor(Bars[_:barid][pb_t2],
            (color & 0xFFFFFF00) | (0x66 & ((color & 0x000000FF) / 2)));

        TextDrawBoxColor(Bars[_:barid][pb_t3], color);
        return 1;
    }
    return 0;
}

stock ShowProgressBarForAll(Bar:barid)
{
    #if defined _foreach_included
    foreach(Player, i)
    #else
    for(new i = 0; i < MAX_PLAYERS; ++i)
        if(IsPlayerConnected(i))
    #endif
    #if defined IsPlayerNPC
        if(!IsPlayerNPC(i))
    #endif
    {
        ShowProgressBarForPlayer(i, barid);
    }
    return 1;
}

stock HideProgressBarForAll(Bar:barid)
{
    #if defined _foreach_included
    foreach(Player, i)
    #else
    for(new i = 0; i < MAX_PLAYERS; ++i)
        if(IsPlayerConnected(i))
    #endif
    #if defined IsPlayerNPC
        if(!IsPlayerNPC(i))
    #endif
    {
        HideProgressBarForPlayer(i, barid);
    }
    return 1;
}

stock UpdateProgressBar(Bar:barid, playerid=INVALID_PLAYER_ID)
{
    if(playerid == INVALID_PLAYER_ID)
    {
        return ShowProgressBarForAll(barid);
    } else {
        return ShowProgressBarForPlayer(playerid, barid);
    }
}  
