/*
 * Dette program er i al sin enkelthed en molberegner, beregnet til at udregne den
 * samlede molvægt af en bestemt sammensætning af elementer.
 * Programmet er skrevet i forbindelse med et eksamensprojekt i programmering C
 * Koden og programmet må frit benyttes ved angivelse af kilde.
 * Skrevet af Malte Ravn Spence (malteravn95@gmail.com)
 */

// Deklarer de globale variabler.
XML xml;
Element[] e;
int listlength;
int[] count;
float[] sw;
float lw;
float weight;
float space;
PFont font;
boolean start = true;
boolean lang = false;

void setup()
{
  // Definer skærmstørrelse, stroke og font.
  size(1191, 637);
  noStroke();
  font = loadFont("HelveticaNeueLTCom-LtEx-30.vlw");
  textFont(font);

  // Importer data fra ptable.xml.
  xml = loadXML("ptable.xml");
  XML[] children = xml.getChildren("element");
  listlength = children.length;

  // deklarer nye arrays.
  e = new Element[listlength];
  count = new int[listlength];
  sw = new float[listlength];

  for (int i = 0; i < listlength; i++)
  {
    // Hent de forskellige attributter fra hvert 
    //element og assign dem til de midlertidige variabler.
    int id = children[i].getInt("id");
    int gr = children[i].getInt("group");
    int pe = children[i].getInt("period");
    String sh = children[i].getString("short");
    String ty = children[i].getString("type");
    String en = children[i].getString("en");
    String fu = children[i].getContent();
    float mw = children[i].getFloat("molarweight");

    // Lav derefter et nyt objekt med de ovenstående variabler.
    e[i] = new Element(id, gr, pe, sh, ty, en, fu, mw);
    textSize(30);
    sw[i] = textWidth(sh);
  }
}

void draw()
{
  //Hvis start == true, tegnes hele interfacet, og start 
  //sættes til false, således at det ikke tegnes igen.
  if (start == true)
  {
    PtableObject();   
    show();
    start = false;
  }
}

void PtableObject() // Tegn hele interfacet.
{
  background(20, 20, 20);
  for (int i = 0; i < listlength; i++)
  {
    e[i].draw(); // Tegn alle element-boksene
  }

  // Tegn de to grå bokse for hhv. molekylestruktur og molvægt.
  fill(107, 107, 107);
  rect(186, 149, 408, 40);
  rect(597, 149, 153, 40);

  // Skriv "molekyle", "reset" og "g/mol" over de to grå bokse.
  // hvis lang == true skrives molecule & mole i stedet for molekyle og mol.
  fill(107, 107, 107);
  textSize(20);
  if(lang == true)
  {
    textAlign(LEFT, BOTTOM);
    text("molecule", 186, 146);
    textAlign(RIGHT, BOTTOM);
    text("reset", 594, 146);
    text("g/mole", 747, 146);
  }
  else
  {
    textAlign(LEFT, BOTTOM);
    text("molekyle", 186, 146);
    textAlign(RIGHT, BOTTOM);
    text("reset", 594, 146);
    text("g/mol", 747, 146);
  }

  // Tegn de to bokse med hhv. "*" og "**" der hvor 
  // "La" og "Ac" burde være i det periodiske system.
  fill(201, 73, 90);
  rect(156, 345, 60, 60);
  fill(201, 32, 55);
  rect(156, 408, 60, 60);
  fill(20, 20, 20);
  textAlign(CENTER, CENTER);
  textSize(30);
  text("*", 186, 380);
  text("**", 186, 443);
  
  // Skriv credits
  fill(107, 107, 107);
  textSize(15);
  textAlign(LEFT, BOTTOM);
  text("2013", 10, 617);
  textAlign(LEFT, TOP);
  text("malteravn95@gmail.com", 10, 617);
  
  // Engelsk eller Dansk skrives i nederste højre hjørne
  // afhængig af lang-variablen.
  if(lang == true)
  {
    lw = textWidth("English");
    textAlign(RIGHT, TOP);
    text("English", 1181, 617); 
  }
  else
  {
    lw = textWidth("Dansk");
    textAlign(RIGHT, TOP);
    text("Dansk", 1181, 617);
  }
}

void mouseClicked()
{
  // Genoptegn de to lysgrå bokse og "slet" evt. tidligere tekst.
  fill(107, 107, 107);
  rect(186, 149, 408, 40);
  rect(597, 149, 153, 40);

  for (int i = 0; i < listlength; i++)
  {
    e[i].clicked();
  }
  
  if (mouseX >= 1181-lw && mouseY >= 612 && mouseX <= 1181 && mouseY <= 627)
  {
    if(lang == true)
    {
      lang = false;
      start = true;
    }
    else if(lang == false)
    {
      lang = true;
      start = true;
    }
  }
  show();
}

void show()
{
  for (int i = 0; i < listlength; i++)
  {
    e[i].display();
  }
  // Skriv molvægten indenfor den højre lysegrå boks.
  fill(20, 20, 20);
  textAlign(RIGHT, BOTTOM);
  textSize(30);
  text(weight, 747, 190);
  
  /*
   * Overflow control - hvis afstanden space bliver større end boksens 
   * længde, eller vægten overstiger 9700, stoppes loopen.
   * Ved tryk på reset nulstilles programmet.
   */
  if (space >= 350 || weight > 9700)
  {
    noLoop();
    start = true;

    // Overskriv reset i rød skrift.
    fill(252, 3, 3);
    textSize(20);
    textAlign(RIGHT, BOTTOM);
    text("reset", 594, 146);
  }
  
  // Nulstil weight og space.
  weight = 0;
  space = 0;
}
