/** Loads detailed tax payer info */
  public void loadInfo() {
    // try to connect
    try {

      // Get TaxPayer Income first:
      HTTPConnection connection = new HTTPConnection(storage.getServerURL());

      JSONObject response = connection.connectJSON(Engine.getTaxPayerInfo(TaxPayerID));
      storage.setLastServerResponse(response.toString());

      if (!response.getString("result").equals("OK")) {
        throw new Exception("Invalid response from server = " + response.getString("data"));
      }

      // read results
      JSONObject data = response.getJSONArray("data").getJSONObject(0);

      // Fill the activity with results
      TaxIncome = data.getDouble("Income");
      tbTaxYearIncome.setText(String.valueOf(TaxIncome) + " \u20AC");
      // Get Tax stats:

      response = connection.connectJSON(Engine.TaxProgramGrid(TaxYearID, TaxPayerID));
      storage.setLastServerResponse(response.toString());

      // retrieve the array of items
      array = response.getJSONArray("data");

      recalculateTaxRate();

      // only after array is loaded - show the list
      adapter = new TaxYearProgramsAdapter(this);
      tableTaxProgramManage.setAdapter(adapter);

    } catch (Exception ex) {
      DKDialog.ShowMessage(
          this,
          Translate.translate("Error"),
          Translate.translate("Connection failed: " + ex.getMessage()),
          Translate.translate("OK"),
          Translate.translate("Cancel"));

      LogWriter.writeException(this, ex.getMessage(), ex);

      storage.setLastServerResponse(ex.toString());
    }
  }
    public void work() {
      // get the first institution
      if (total < _selected.size()) {
        int id = _selected.get(total);

        double firstPrice = 0;
        double currentPrice = 0;
        double avgPriceForProgram =
            (TaxIncome / _selected.size())
                * 0.2; // this is a price that is calculate for programs, average 20% of income

        // start negotiating
        try {
          // Get initial price of program
          LogWriter.writeInfo(
              "Agent -> Get program price: avgPerProgram = "
                  + avgPriceForProgram
                  + ", program ID = "
                  + id);

          HTTPConnection connection = new HTTPConnection(storage.getServerURL());

          JSONObject response =
              connection.connectJSON(Engine.AgentRequestProgramPrice(_taxYearID, _taxPayerID, id));
          storage.setLastServerResponse(response.toString());

          if (!response.getString("result").equals("OK")) {
            throw new Exception("Invalid response from server = " + response.getString("data"));
          }

          // read results
          JSONObject data = response.getJSONObject("data");

          int type = data.getInt("Type");
          currentPrice = data.getDouble("Price");
          firstPrice = currentPrice;
          double lowestPrice = firstPrice;
          double newPrice = 0;

          if (type == 1) {
            // this is final offer - we need to set the result - and offer to client
            LogWriter.writeInfo("Agent -> Final offer = " + currentPrice + " program ID = " + id);
            setProgramPrice(id, currentPrice);
          } else {
            double tries = 0.5;

            while (true) {
              if (type == 1) {
                // this is final offer - we need to set the result - and offer to client
                LogWriter.writeInfo(
                    "Agent -> Final offer = " + currentPrice + " program ID = " + id);
                setProgramPrice(id, currentPrice);
                break;
              }

              // we can try to continue more - to get a better deal if it is more than we want
              if (newPrice > firstPrice) {
                // obiously we cannot get betterp rice
                LogWriter.writeInfo(
                    "Agent -> Cannot go higher = " + lowestPrice + " program ID = " + id);
                setProgramPrice(id, lowestPrice);
                break;
              } else if (currentPrice > avgPriceForProgram) {

                // Get initial price of program
                connection = new HTTPConnection(storage.getServerURL());

                newPrice = avgPriceForProgram * 0.1 + avgPriceForProgram * (tries);

                LogWriter.writeInfo(
                    "Agent -> Askin better price = " + newPrice + " program ID = " + id);

                // lowe the price by 90%
                response =
                    connection.connectJSON(
                        Engine.AgentRequestProgramLowerPrice(
                            _taxYearID, _taxPayerID, id, newPrice));
                storage.setLastServerResponse(response.toString());

                if (!response.getString("result").equals("OK")) {
                  throw new Exception(
                      "Invalid response from server = " + response.getString("data"));
                }

                // read results
                data = response.getJSONObject("data");

                type = data.getInt("Type");
                currentPrice = data.getDouble("Price");

                LogWriter.writeInfo(
                    "Agent -> currentPrice = "
                        + currentPrice
                        + " lowestPrice = "
                        + lowestPrice
                        + " program ID = "
                        + id);

                if (currentPrice < lowestPrice) {
                  lowestPrice = currentPrice;
                }

                tries += 0.1;
              } else {
                // this is ok, we can accept that
                LogWriter.writeInfo(
                    "Agent -> Best offer = " + currentPrice + " program ID = " + id);
                setProgramPrice(id, currentPrice);
                break;
              }
            }
          }

        } catch (Exception ex) {
          // this will exit

          Message msg = mHandler.obtainMessage();
          Bundle b = new Bundle();
          b.putString("error", "Connection failed: " + ex.getMessage());
          msg.setData(b);
          mHandler.sendMessage(msg);

          LogWriter.writeException(TaxProgramsManageActivity.this, ex.getMessage(), ex);
        }
      }
    }
        public void onClick(View arg0) {

          if (btnCancel.getVisibility() == View.VISIBLE) {
            // Confirmation of existing programs

            try {

              for (int i = 0; i < array.length(); i++) {
                JSONObject object = (JSONObject) array.get(i);

                if (object.getInt("IsSelected") > 0) {
                  // Get TaxPayer Income first:
                  HTTPConnection connection = new HTTPConnection(storage.getServerURL());

                  JSONObject response =
                      connection.connectJSON(
                          Engine.ApproveProgramPrice(
                              TaxYearID,
                              TaxPayerID,
                              object.getInt("ID"),
                              object.getDouble("TaxRate")));
                  storage.setLastServerResponse(response.toString());

                  if (!response.getString("result").equals("OK")) {
                    throw new Exception(
                        "Invalid response from server = " + response.getString("data"));
                  }

                  // read results
                  int result = (Integer) response.getInt("data");
                }
              }

              Intent resultIntent = new Intent();
              setResult(Activity.RESULT_OK, resultIntent);
              TaxProgramsManageActivity.this.finish();
              /*
              	DKDialog.ShowMessage( TaxProgramsManageActivity.this,
              Translate.translate("Thank you") ,
              Translate.translate("All programs have been confirmed!"),
              Translate.translate("OK"),
              Translate.translate("Cancel"));
              	*/

            } catch (Exception ex) {
              DKDialog.ShowMessage(
                  TaxProgramsManageActivity.this,
                  Translate.translate("Error"),
                  Translate.translate("Connection failed: " + ex.getMessage()),
                  Translate.translate("OK"),
                  Translate.translate("Cancel"));

              LogWriter.writeException(TaxProgramsManageActivity.this, ex.getMessage(), ex);

              storage.setLastServerResponse(ex.toString());
            }
          } else {

            // 1-st submit

            selected = new ArrayList<Integer>();

            try {

              for (int i = 0; i < array.length(); i++) {

                JSONObject object = array.getJSONObject(i);

                if (object.getInt("IsSelected") > 0) {
                  selected.add(object.getInt("ID"));
                } else {
                  // clear the price
                  object.put("TaxRate", 0.0);
                }
              }

              if (selected.size() == 0) {
                DKDialog.ShowMessage(
                    TaxProgramsManageActivity.this,
                    Translate.translate("Error"),
                    Translate.translate("Nothing to submit, no programs selected!"),
                    Translate.translate("OK"),
                    Translate.translate("Cancel"));
              } else {
                typeBar = 1;
                showDialog(typeBar);
              }
            } catch (Exception ex) {
              DKDialog.ShowMessage(
                  TaxProgramsManageActivity.this,
                  Translate.translate("Error"),
                  Translate.translate("Failed to count selected values! " + ex.getMessage()),
                  Translate.translate("OK"),
                  Translate.translate("Cancel"));

              LogWriter.writeException(TaxProgramsManageActivity.this, ex.getMessage(), ex);
            }
          }
        }