content: package com.alexhulbert.icewind.gui;
  
  import static com.alexhulbert.icewind.gui.StaticStage.devices;
  import static com.alexhulbert.icewind.gui.Utils.fadeIn;
  import static com.alexhulbert.icewind.gui.Utils.fadeOut;
  import com.alexhulbert.jmobiledevice.Lockdown;
  import com.alexhulbert.jmobiledevice.diagnostics.Diagnostics;
  import com.alexhulbert.jmobiledevice.diagnostics.Info;
  import com.alexhulbert.jmobiledevice.diagnostics.Keys;
  import java.io.IOException;
  import java.util.Locale;
  import javafx.application.Platform;
  import javafx.scene.control.Label;
  import javafx.scene.control.ProgressIndicator;
  import javafx.scene.image.Image;
  import javafx.scene.image.ImageView;
  import javax.script.ScriptEngine;
  import javax.script.ScriptEngineManager;
  import org.jsoup.Jsoup;
  import org.jsoup.nodes.Document;
  import org.jsoup.nodes.Element;
  import org.jsoup.select.Elements;
  
  public class RefreshThread implements Runnable {
      
      public String devicePic(String model, String family, boolean isDFU) {
          return String.format(
                  "https://statici.icloud.com/fmipmobile/deviceImages-2.0/%s/%s/%sline-nolocation_ipad.png",
                  family,
                  family + model,
                  isDFU ? "off" : "on"
          );
      }
      
      public String bigPic(String build) {
          String base = "http://theiphonewiki.com";
          Document wiki;
          try {
              wiki = Jsoup.connect(base + "/wiki/" + build.toLowerCase(Locale.ENGLISH)).get();
          } catch (IOException e) {
              return null; //Device picture not available
          }
          Element devicePicture = wiki.select(".thumbinner").first().select("a img").first();
          String url = base + devicePicture.attr("src");
          String newBase = url.substring(0, url.lastIndexOf('/') + 1);
          Document imgs;
          try {
              imgs = Jsoup.connect(newBase).get();
          } catch (IOException e) {
              return url;
          }
          Element biggest = imgs.select("a").last();
          return newBase + biggest.attr("href");
      }
      
      private final ImageView ImgA;
      private final ImageView ImgB;
      private final ImageView ImgC;
      private final Label NameA;
      private final Label NameB;
      private final Label NameC;
      private final ProgressIndicator ProgA;
      private final ProgressIndicator ProgB;
      private final ProgressIndicator ProgC;
  
      public RefreshThread(
              ImageView ImgA, ImageView ImgB, ImageView ImgC, 
              Label NameA, Label NameB, Label NameC, 
              ProgressIndicator ProgA, ProgressIndicator ProgB, ProgressIndicator ProgC
      ) {
          this.ImgA = ImgA;
          this.ImgB = ImgB;
          this.ImgC = ImgC;
          this.NameA = NameA;
          this.NameB = NameB;
          this.NameC = NameC;
          this.ProgA = ProgA;
          this.ProgB = ProgB;
          this.ProgC = ProgC;
      }
  
      @Override
      public void run() {
          //TODO: Disable  back button
          devices.clear();
          
          fadeOut(ImgA, 250);
          fadeIn(ProgA, 250);
          fadeOut(ImgB, 250);
          fadeIn(ProgB, 250);
          fadeOut(ImgC, 250);
          fadeIn(ProgC, 250);
          
          String[] devUdids = Lockdown.listDevices();
          for (int i = 0; i < Math.min(3, devUdids.length); i++) {
              try {
                  Lockdown ld = new Lockdown(devUdids[i]);
                  devices.add(ld);
              } catch (Exception e) {
                  break;
              }
          }
          
          if (devices.size() > 0) {
              LoadA();
              if (devices.size() > 1) {
                  LoadB();
                  if (devices.size() > 2) {
                      LoadC();
                  } else {
                      fadeOut(ProgC, 250);
                      ImgC.setImage(null);
                      Platform.runLater(new Runnable() {
                          @Override public void run() {
                              NameC.setText("");
                          }
                      });
                  }
              } else {
                  fadeOut(ProgB, 250);
                  ImgB.setImage(null);
                  fadeOut(ProgC, 250);
                  ImgC.setImage(null);
                  Platform.runLater(new Runnable() {
                      @Override public void run() {
                          NameB.setText("");
                          NameC.setText("");
                      }
                  });
              }
          } else {
              fadeOut(ProgA, 250);
              ImgA.setImage(null);
              fadeOut(ProgB, 250);
              ImgB.setImage(null);
              fadeOut(ProgC, 250);
              ImgC.setImage(null);
              Platform.runLater(new Runnable() {
                  @Override public void run() {
                      NameA.setText("");
                      NameB.setText("");
                      NameC.setText("");
                  }
              });
          }
      }
      
      public void LoadA() {
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameA.setText("Loading...");
              }
          });
          Diagnostics diagA = new Diagnostics(devices.get(0));
          final Info infoA = diagA.query(
                  Keys.ProductType.value +    //iPod51
                  Keys.ProductVersion.value + //7.0.6
                  Keys.DeviceColor.value +    //black
                  Keys.DeviceClass.value +    //iPod
                  Keys.UserAssignedDeviceName.value +
                  Keys.HWModelStr.value
          );
          String realClass = infoA.getString(Keys.DeviceClass.value);
          char[] realTypeClass = infoA.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray();
          String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers?
          String bigImg = bigPic(infoA.getString(Keys.HWModelStr.value));
          StaticStage.bigImages[0] = bigImg == null ? imgUrl : bigImg;
          fadeOut(ProgA, 175);
          ImgA.setImage(new Image(imgUrl));
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameA.setText(infoA.getString(Keys.UserAssignedDeviceName.value));
              }
          });
          fadeIn(ImgA, 250);
      }
      
      public void LoadB() {
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameB.setText("Loading...");
              }
          });
          Diagnostics diagB = new Diagnostics(devices.get(1));
          final Info infoB = diagB.query(
                  Keys.ProductType.value +    //iPod51
                  Keys.ProductVersion.value + //7.0.6
                  Keys.DeviceColor.value +    //black
                  Keys.DeviceClass.value +    //iPod
                  Keys.UserAssignedDeviceName.value +
                  Keys.HWModelStr.value
          );
          String realClass = infoB.getString(Keys.DeviceClass.value);
          char[] realTypeClass = infoB.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray();
          String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers?
          String bigImg = bigPic(infoB.getString(Keys.HWModelStr.value));
          StaticStage.bigImages[1] = bigImg == null ? imgUrl : bigImg;
          fadeOut(ProgB, 175);
          ImgB.setImage(new Image(imgUrl));
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameB.setText(infoB.getString(Keys.UserAssignedDeviceName.value));
              }
          });
          fadeIn(ImgB, 250);
      }
      
      public void LoadC() {
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameC.setText("Loading...");
              }
          });
          Diagnostics diagC = new Diagnostics(devices.get(2));
          final Info infoC = diagC.query(
                  Keys.ProductType.value +    //iPod51
                  Keys.ProductVersion.value + //7.0.6
                  Keys.DeviceColor.value +    //black
                  Keys.DeviceClass.value +    //iPod
                  Keys.UserAssignedDeviceName.value +
                  Keys.HWModelStr.value
          );
          String realClass = infoC.getString(Keys.DeviceClass.value);
          char[] realTypeClass = infoC.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray();
          String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers?
          String bigImg = bigPic(infoC.getString(Keys.HWModelStr.value));
          StaticStage.bigImages[2] = bigImg == null ? imgUrl : bigImg;
          fadeOut(ProgC, 175);
          ImgB.setImage(new Image(imgUrl));
          Platform.runLater(new Runnable() {
              @Override public void run() {
                  NameB.setText(infoC.getString(Keys.UserAssignedDeviceName.value));
              }
          });
          fadeIn(ImgC, 250);
      }
  }
  