/*==========================================================
  File:  gui_elements.c
  Author:  _pragma

  Description:  Under the hood of the graphical user interface.
  ==========================================================*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/gl.h>
#include <SDL/SDL.h>

#include "texture.h"
#include "console.h"
#include "cvar.h"
#include "util.h"
#include "gui_elements.h"

gui_element_t *gui_create_element(int typechar *text
                                  float x1float y1
                                  float x2float y2,
                                  char *texture)
{
  gui_element_t *element;

  if(!(element = malloc(sizeof(gui_element_t))))
  {
    CON_printf("warning: failed to create gui element");
    return false;
  }

  element->type = type;
  if(text)
    element->text = strdup(text);
  else
    element->text = 0;
  element->x1 = x1;
  element->y1 = y1;
  element->x2 = x2;
  element->y2 = y2;
  element->next = 0;

  if(!(element->textureId = T_loadTextureTGA(texturetrue)))
    CON_printf("Warning failed to load '%s'"texture);

  return element;
}

void gui_add_element_to_list(gui_element_t *elementgui_element_t **list)
{
  element->next = *list;
  *list = element;
}

void gui_remove_element_from_list(gui_element_t *elementgui_element_t **list)
{
  gui_element_t *temp;

  if(element == *list)
    *list = element->next;
  else
  {
    temp = *list;

    while (temp && (temp->next != (element)))
      temp = temp->next;

    if (temp)
      temp->next = element->next;
  }
}

void gui_destroy_element(gui_element_t *element)
{
  if(element)
  {
    if(element->text)
      free(element->text);
    free(element);
    element = 0;
  }
  else
    CON_printf("warning: destroying null gui element");
}

void gui_destroy_all_elements(gui_element_t *element_list)
{
  gui_element_t *element, *next;

  for(element = element_listelementelement = next)
  {
    next = element->next;
    gui_destroy_element(element);
  }
}

void gui_draw_elements(gui_element_t *element_list)
{
  gui_element_t *element;
  extern cvar_t *cvar_scr_width, *cvar_scr_height;
  int width = atoi(cvar_scr_width->value), 
      height = atoi(cvar_scr_height->value);

  glLoadIdentity();

  glDisable(GL_TEXTURE_2D);

  glBlendFunc(GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA);

  glColor4f(0.00.00.00.5);
  glBegin(GL_QUADS);
    glVertex2i(00);
    glVertex2i(width0);
    glVertex2i(widthheight);
    glVertex2i(0height);
  glEnd();

  glEnable(GL_TEXTURE_2D);
  glBlendFunc(GL_SRC_ALPHAGL_ONE);

  glColor4f(1.01.01.01.0);

  for(element = element_listelementelement = element->next)
  {
    glBindTexture(GL_TEXTURE_2Delement->textureId);
    glBegin(GL_QUADS);
      glTexCoord2f(00);  glVertex2f(element->x1element->y1);
      glTexCoord2f(01);  glVertex2f(element->x1element->y2);
      glTexCoord2f(11);  glVertex2f(element->x2element->y2);
      glTexCoord2f(10);  glVertex2f(element->x2element->y1);
    glEnd();
  }
}

void gui_processMouseClick(int xint yint buttongui_element_t *element_list)
{
  gui_element_t *element;

  if((button & SDL_BUTTON(1)) == 0)
    return;

  for(element = element_listelementelement = element->next)
    if(x > element->x1 && x < element->x2 &&
       y > element->y1 && y < element->y2)
    {
      element->on_click(xybutton);
      return;
    }
}