/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cryptolearning;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.webui.jsf.component.Button;
import com.sun.webui.jsf.component.ImageComponent;
import com.sun.webui.jsf.component.StaticText;
import javax.faces.FacesException;
import javax.faces.component.html.HtmlInputText;
import javax.faces.event.ValueChangeEvent;
import com.sun.webui.jsf.component.TextField;
import core.ExMath;
import java.sql.Time;
import javax.swing.JOptionPane;
import core.*;
import com.sun.webui.jsf.component.Label;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version template.java
 * @version Created on 16.2.2009, 10:32:31
 * @author jirka
 */

public class Logarithm extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    private StaticText labGenRes = new StaticText();

    public StaticText getLabGenRes() {
        return labGenRes;
    }

    public void setLabGenRes(StaticText st) {
        this.labGenRes = st;
    }
    private Button btnSkip1 = new Button();

    public Button getBtnSkip1() {
        return btnSkip1;
    }

    public void setBtnSkip1(Button b) {
        this.btnSkip1 = b;
    }
    private Button button3 = new Button();

    public Button getButton3() {
        return button3;
    }

    public void setButton3(Button b) {
        this.button3 = b;
    }
    private Button btnBack1 = new Button();

    public Button getBtnBack1() {
        return btnBack1;
    }

    public void setBtnBack1(Button b) {
        this.btnBack1 = b;
    }
    private Button btnFwd1 = new Button();

    public Button getBtnFwd1() {
        return btnFwd1;
    }

    public void setBtnFwd1(Button b) {
        this.btnFwd1 = b;
    }
    private HtmlInputText txtGenerator = new HtmlInputText();

    public HtmlInputText getTxtGenerator() {
        return txtGenerator;
    }

    public void setTxtGenerator(HtmlInputText hit) {
        this.txtGenerator = hit;
    }
    private HtmlInputText txtRad = new HtmlInputText();

    public HtmlInputText getTxtRad() {
        return txtRad;
    }

    public void setTxtRad(HtmlInputText hit) {
        this.txtRad = hit;
    }
    private StaticText labKrok1 = new StaticText();

    public StaticText getLabKrok1() {
        return labKrok1;
    }

    public void setLabKrok1(StaticText st) {
        this.labKrok1 = st;
    }
    private StaticText labPopis1 = new StaticText();

    public StaticText getLabPopis1() {
        return labPopis1;
    }

    public void setLabPopis1(StaticText st) {
        this.labPopis1 = st;
    }
    private StaticText hiddenCislo1 = new StaticText();

    public StaticText getHiddenCislo1() {
        return hiddenCislo1;
    }

    public void setHiddenCislo1(StaticText st) {
        this.hiddenCislo1 = st;
    }
    private HtmlInputText txtZaklad1 = new HtmlInputText();

    public HtmlInputText getTxtZaklad1() {
        return txtZaklad1;
    }

    public void setTxtZaklad1(HtmlInputText hit) {
        this.txtZaklad1 = hit;
    }
    private HtmlInputText txtExponent1 = new HtmlInputText();

    public HtmlInputText getTxtExponent1() {
        return txtExponent1;
    }

    public void setTxtExponent1(HtmlInputText hit) {
        this.txtExponent1 = hit;
    }
    private HtmlInputText txtModul1 = new HtmlInputText();

    public HtmlInputText getTxtModul1() {
        return txtModul1;
    }

    public void setTxtModul1(HtmlInputText hit) {
        this.txtModul1 = hit;
    }
    private HtmlInputText txtZaklad2 = new HtmlInputText();

    public HtmlInputText getTxtZaklad2() {
        return txtZaklad2;
    }

    public void setTxtZaklad2(HtmlInputText hit) {
        this.txtZaklad2 = hit;
    }
    private HtmlInputText txtMocnina1 = new HtmlInputText();

    public HtmlInputText getTxtMocnina1() {
        return txtMocnina1;
    }

    public void setTxtMocnina1(HtmlInputText hit) {
        this.txtMocnina1 = hit;
    }
    private HtmlInputText txtModul2 = new HtmlInputText();

    public HtmlInputText getTxtModul2() {
        return txtModul2;
    }

    public void setTxtModul2(HtmlInputText hit) {
        this.txtModul2 = hit;
    }
    private Button btnMocneni1 = new Button();

    public Button getBtnMocneni1() {
        return btnMocneni1;
    }

    public void setBtnMocneni1(Button b) {
        this.btnMocneni1 = b;
    }
    private Button btnLogaritmus1 = new Button();

    public Button getBtnLogaritmus1() {
        return btnLogaritmus1;
    }

    public void setBtnLogaritmus1(Button b) {
        this.btnLogaritmus1 = b;
    }
    private Button button1 = new Button();

    public Button getButton1() {
        return button1;
    }

    public void setButton1(Button b) {
        this.button1 = b;
    }
    private HtmlInputText txtOdp1 = new HtmlInputText();

    public HtmlInputText getTxtOdp1() {
        return txtOdp1;
    }

    public void setTxtOdp1(HtmlInputText hit) {
        this.txtOdp1 = hit;
    }
    private HtmlInputText txtOdp2 = new HtmlInputText();

    public HtmlInputText getTxtOdp2() {
        return txtOdp2;
    }

    public void setTxtOdp2(HtmlInputText hit) {
        this.txtOdp2 = hit;
    }
    private HtmlInputText txtOdp3 = new HtmlInputText();

    public HtmlInputText getTxtOdp3() {
        return txtOdp3;
    }

    public void setTxtOdp3(HtmlInputText hit) {
        this.txtOdp3 = hit;
    }
    private StaticText labO1 = new StaticText();

    public StaticText getLabO1() {
        return labO1;
    }

    public void setLabO1(StaticText st) {
        this.labO1 = st;
    }
    private StaticText labO2 = new StaticText();

    public StaticText getLabO2() {
        return labO2;
    }

    public void setLabO2(StaticText st) {
        this.labO2 = st;
    }
    private StaticText labO3 = new StaticText();

    public StaticText getLabO3() {
        return labO3;
    }

    public void setLabO3(StaticText st) {
        this.labO3 = st;
    }
    private HtmlInputText txtOdp4 = new HtmlInputText();

    public HtmlInputText getTxtOdp4() {
        return txtOdp4;
    }

    public void setTxtOdp4(HtmlInputText hit) {
        this.txtOdp4 = hit;
    }
    private HtmlInputText txtOdp5 = new HtmlInputText();

    public HtmlInputText getTxtOdp5() {
        return txtOdp5;
    }

    public void setTxtOdp5(HtmlInputText hit) {
        this.txtOdp5 = hit;
    }
    private HtmlInputText txtOdp6 = new HtmlInputText();

    public HtmlInputText getTxtOdp6() {
        return txtOdp6;
    }

    public void setTxtOdp6(HtmlInputText hit) {
        this.txtOdp6 = hit;
    }
    private StaticText labO4 = new StaticText();

    public StaticText getLabO4() {
        return labO4;
    }

    public void setLabO4(StaticText st) {
        this.labO4 = st;
    }
    private StaticText labO5 = new StaticText();

    public StaticText getLabO5() {
        return labO5;
    }

    public void setLabO5(StaticText st) {
        this.labO5 = st;
    }
    private StaticText labO6 = new StaticText();

    public StaticText getLabO6() {
        return labO6;
    }

    public void setLabO6(StaticText st) {
        this.labO6 = st;
    }
    private StaticText labDoba1 = new StaticText();

    public StaticText getLabDoba1() {
        return labDoba1;
    }

    public void setLabDoba1(StaticText st) {
        this.labDoba1 = st;
    }
    private StaticText labMocnina1 = new StaticText();

    public StaticText getLabMocnina1() {
        return labMocnina1;
    }

    public void setLabMocnina1(StaticText st) {
        this.labMocnina1 = st;
    }
    private StaticText labDoba2 = new StaticText();

    public StaticText getLabDoba2() {
        return labDoba2;
    }

    public void setLabDoba2(StaticText st) {
        this.labDoba2 = st;
    }
    private StaticText labExponent1 = new StaticText();

    public StaticText getLabExponent1() {
        return labExponent1;
    }

    public void setLabExponent1(StaticText st) {
        this.labExponent1 = st;
    }
    private Label graphColumn1 = new Label();

    public Label getGraphColumn1() {
        return graphColumn1;
    }

    public void setGraphColumn1(Label l) {
        this.graphColumn1 = l;
    }
    private Label graphColumn2 = new Label();

    public Label getGraphColumn2() {
        return graphColumn2;
    }

    public void setGraphColumn2(Label l) {
        this.graphColumn2 = l;
    }
    private Label graphColumn3 = new Label();

    public Label getGraphColumn3() {
        return graphColumn3;
    }

    public void setGraphColumn3(Label l) {
        this.graphColumn3 = l;
    }
    private Label graphColumn4 = new Label();

    public Label getGraphColumn4() {
        return graphColumn4;
    }

    public void setGraphColumn4(Label l) {
        this.graphColumn4 = l;
    }
    private Label graphColumn5 = new Label();

    public Label getGraphColumn5() {
        return graphColumn5;
    }

    public void setGraphColumn5(Label l) {
        this.graphColumn5 = l;
    }
    private Label graphColumn6 = new Label();

    public Label getGraphColumn6() {
        return graphColumn6;
    }

    public void setGraphColumn6(Label l) {
        this.graphColumn6 = l;
    }
    private Label graphColumn7 = new Label();

    public Label getGraphColumn7() {
        return graphColumn7;
    }

    public void setGraphColumn7(Label l) {
        this.graphColumn7 = l;
    }
    private Label graphColumn8 = new Label();

    public Label getGraphColumn8() {
        return graphColumn8;
    }

    public void setGraphColumn8(Label l) {
        this.graphColumn8 = l;
    }
    private Label graphColumn9 = new Label();

    public Label getGraphColumn9() {
        return graphColumn9;
    }

    public void setGraphColumn9(Label l) {
        this.graphColumn9 = l;
    }
    private Label graphColumn10 = new Label();

    public Label getGraphColumn10() {
        return graphColumn10;
    }

    public void setGraphColumn10(Label l) {
        this.graphColumn10 = l;
    }
    private Label graphColumn11 = new Label();

    public Label getGraphColumn11() {
        return graphColumn11;
    }

    public void setGraphColumn11(Label l) {
        this.graphColumn11 = l;
    }
    private Label graphColumn12 = new Label();

    public Label getGraphColumn12() {
        return graphColumn12;
    }

    public void setGraphColumn12(Label l) {
        this.graphColumn12 = l;
    }
    private Label graphColumn13 = new Label();

    public Label getGraphColumn13() {
        return graphColumn13;
    }

    public void setGraphColumn13(Label l) {
        this.graphColumn13 = l;
    }
    private Label graphColumn14 = new Label();

    public Label getGraphColumn14() {
        return graphColumn14;
    }

    public void setGraphColumn14(Label l) {
        this.graphColumn14 = l;
    }
    private Label graphColumn15 = new Label();

    public Label getGraphColumn15() {
        return graphColumn15;
    }

    public void setGraphColumn15(Label l) {
        this.graphColumn15 = l;
    }
    private Label graphColumn16 = new Label();

    public Label getGraphColumn16() {
        return graphColumn16;
    }

    public void setGraphColumn16(Label l) {
        this.graphColumn16 = l;
    }
    private Label graphColumn17 = new Label();

    public Label getGraphColumn17() {
        return graphColumn17;
    }

    public void setGraphColumn17(Label l) {
        this.graphColumn17 = l;
    }
    private Label graphColumn18 = new Label();

    public Label getGraphColumn18() {
        return graphColumn18;
    }

    public void setGraphColumn18(Label l) {
        this.graphColumn18 = l;
    }
    private Label graphColumn19 = new Label();

    public Label getGraphColumn19() {
        return graphColumn19;
    }

    public void setGraphColumn19(Label l) {
        this.graphColumn19 = l;
    }
    private Label graphColumn20 = new Label();

    public Label getGraphColumn20() {
        return graphColumn20;
    }

    public void setGraphColumn20(Label l) {
        this.graphColumn20 = l;
    }
    private Label graphColumn21 = new Label();

    public Label getGraphColumn21() {
        return graphColumn21;
    }

    public void setGraphColumn21(Label l) {
        this.graphColumn21 = l;
    }
    private Label graphColumn22 = new Label();

    public Label getGraphColumn22() {
        return graphColumn22;
    }

    public void setGraphColumn22(Label l) {
        this.graphColumn22 = l;
    }
    private Label graphColumn23 = new Label();

    public Label getGraphColumn23() {
        return graphColumn23;
    }

    public void setGraphColumn23(Label l) {
        this.graphColumn23 = l;
    }
    private Label graphColumn24 = new Label();

    public Label getGraphColumn24() {
        return graphColumn24;
    }

    public void setGraphColumn24(Label l) {
        this.graphColumn24 = l;
    }
    private Label graphColumn25 = new Label();

    public Label getGraphColumn25() {
        return graphColumn25;
    }

    public void setGraphColumn25(Label l) {
        this.graphColumn25 = l;
    }
    private Label graphColumn26 = new Label();

    public Label getGraphColumn26() {
        return graphColumn26;
    }

    public void setGraphColumn26(Label l) {
        this.graphColumn26 = l;
    }
    private Label graphColumn27 = new Label();

    public Label getGraphColumn27() {
        return graphColumn27;
    }

    public void setGraphColumn27(Label l) {
        this.graphColumn27 = l;
    }
    private Label graphColumn28 = new Label();

    public Label getGraphColumn28() {
        return graphColumn28;
    }

    public void setGraphColumn28(Label l) {
        this.graphColumn28 = l;
    }
    private Label graphColumn29 = new Label();

    public Label getGraphColumn29() {
        return graphColumn29;
    }

    public void setGraphColumn29(Label l) {
        this.graphColumn29 = l;
    }
    private Label graphColumn30 = new Label();

    public Label getGraphColumn30() {
        return graphColumn30;
    }

    public void setGraphColumn30(Label l) {
        this.graphColumn30 = l;
    }
    private StaticText labDoba = new StaticText();

    public StaticText getLabDoba() {
        return labDoba;
    }

    public void setLabDoba(StaticText st) {
        this.labDoba = st;
    }
    private ImageComponent imgRun1 = new ImageComponent();

    public ImageComponent getImgRun1() {
        return imgRun1;
    }

    public void setImgRun1(ImageComponent ic) {
        this.imgRun1 = ic;
    }
    private ImageComponent imgRun2 = new ImageComponent();

    public ImageComponent getImgRun2() {
        return imgRun2;
    }

    public void setImgRun2(ImageComponent ic) {
        this.imgRun2 = ic;
    }

    // </editor-fold>

    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public Logarithm() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        Label[] labs = new Label[] { graphColumn1, graphColumn2, graphColumn3, graphColumn4, graphColumn5, graphColumn6, graphColumn7, graphColumn8, graphColumn9, graphColumn10, graphColumn11, graphColumn12, graphColumn13, graphColumn14, graphColumn15, graphColumn16, graphColumn17, graphColumn18, graphColumn19, graphColumn20, graphColumn21, graphColumn22, graphColumn23, graphColumn24, graphColumn25, graphColumn26, graphColumn27, graphColumn28, graphColumn29, graphColumn30  };
        for (int i=0; i<30; i++) labs[i].setVisible(false);
        
        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("template Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
        }
        
        // </editor-fold>
        // Perform application initialization that must complete
        // *after* managed components are initialized
        // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    public void txtZaklad_processValueChange(ValueChangeEvent event) {
    }

     private Double myExp(int a, int exp)
    {
        Double res = 1.0;
        for (int i=exp; i>0; i--)
            res *= a;
        return res;
    }

    public String btnMocneni_action()
    {
        Integer z, exp, moc, mod;
        Double tics = 0.0;
        try
        {
            z = Integer.parseInt(txtZaklad1.getValue().toString());
            exp = Integer.parseInt(txtExponent1.getValue().toString());
            mod = Integer.parseInt(txtModul1.getValue().toString());

            //Double res = myExp(z, exp) % mod;
            int res = SuperModulo.Modulo(z, exp, mod);

            labMocnina1.setText(res);
        }
        catch (Exception ex)
        {
            JOptionPane.showMessageDialog(null, "Zadané hodnoty musí být celá čísla.");
        }
        return null;
    }

    public String btnLogaritmus1_action() {
        try
        {
                int rad = Integer.parseInt(txtModul2.getValue().toString());
                int generator = Integer.parseInt(txtZaklad2.getValue().toString());
                String mocnina = txtMocnina1.getValue().toString();
                boolean flag = true;

                while (flag){
                for ( int i=0; i<rad; i++)
                {
                    Integer val = SuperModulo.Modulo(generator, i, rad);
                    if (mocnina.equals(val.toString())){
                        labExponent1.setText(i);
                        flag=false;
                    }
                    if (i == (rad-1)){
                        if (flag != false){
                            flag =false;
                            labExponent1.setText("neexistuje");
                        }
                    }
                }
                }
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Chybně zadané hodnoty.");
        }
        return null;
    }

    public String button1_action() {
        try
        {
                double t1 = System.nanoTime();
                int rad = Integer.parseInt(txtRad.getValue().toString());
                int generator = Integer.parseInt(txtGenerator.getValue().toString());

                String str = "";

                int [] vals = new int[30];

                for ( int i=0; i<Math.min(2*rad, 30); i++)
                {
                    //int val = ExMath.Exp(generator, i)%rad;
                    int val = SuperModulo.Modulo(generator, i, rad);
                    str += " " + val;
                    vals[i] = val;
                }

                labGenRes.setText(str);

                //vykresli graf
                Label[] labs = new Label[] { graphColumn1, graphColumn2, graphColumn3, graphColumn4, graphColumn5, graphColumn6, graphColumn7, graphColumn8, graphColumn9, graphColumn10, graphColumn11, graphColumn12, graphColumn13, graphColumn14, graphColumn15, graphColumn16, graphColumn17, graphColumn18, graphColumn19, graphColumn20, graphColumn21, graphColumn22, graphColumn23, graphColumn24, graphColumn25, graphColumn26, graphColumn27, graphColumn28, graphColumn29, graphColumn30  };
                NormalizeValues(vals);
                DrawGraph(labs, vals, 574);
                double t2 = System.nanoTime();
                Double dt = (t2-t1) / 1000000;
                labDoba.setText(dt.toString());
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Chybně zadané hodnoty.");
        }
        return null;
    }

    private void NormalizeValues(int[] vals)
    {
        // 1) najde maximum
        int max = -1;
        for (int i=0; i<30; i++) {
            if (vals[i]>max) max = vals[i];
        }

        // prepocita hodnoty, max odpovida 166px
        for (int i=0; i<30; i++) {
            double k = ((double)vals[i])/((double)max);
            vals[i] = (int) (k*166);
        }
    }

    private void DrawGraph(Label[] labs, int[] vals, int top)
    {
        for (int i=0; i<30; i++) {
            int nTop = top-vals[i];
            int nHeight = vals[i];
            String s = labs[i].getStyle();
            labs[i].setStyle(s + "; height: " + nHeight + "px; top: " + nTop + "px");
            if (nHeight>0) labs[i].setVisible(true);
            else labs[i].setVisible(false);
        }
    }

    public String btnBack_action() {
        PerformStep(false);
        return null;
    }

    public String btnSkip_action() {
        ClearFields();

        txtZaklad1.setDisabled(false);
        txtExponent1.setDisabled(false);
        txtModul1.setDisabled(false);

        txtZaklad2.setDisabled(false);
        txtMocnina1.setDisabled(false);
        txtModul2.setDisabled(false);
        txtRad.setDisabled(false);
        txtGenerator.setDisabled(false);

        btnLogaritmus1.setDisabled(false);
        btnMocneni1.setDisabled(false);
        button1.setDisabled(false);
        btnFwd1.setText("Další");
        //button2.setDisabled(false);

        btnBack1.setDisabled(true);
        btnFwd1.setDisabled(true);
        //btnSkip1.setDisabled(true);
        btnSkip1.setText("Restart okna");


        hiddenCislo1.setValue(0);
        labKrok1.setVisible(false);

        Label[] labs = new Label[] { graphColumn1, graphColumn2, graphColumn3, graphColumn4, graphColumn5, graphColumn6, graphColumn7, graphColumn8, graphColumn9, graphColumn10, graphColumn11, graphColumn12, graphColumn13, graphColumn14, graphColumn15, graphColumn16, graphColumn17, graphColumn18, graphColumn19, graphColumn20, graphColumn21, graphColumn22, graphColumn23, graphColumn24, graphColumn25, graphColumn26, graphColumn27, graphColumn28, graphColumn29, graphColumn30  };
        for (int i=0; i<30; i++) labs[i].setVisible(false);

        return null;
    }

    public String btnFwd_action() {
        PerformStep(true);
        return null;
    }

    public String button_action() {
        ClearFields();
        btnSkip1.setText("Předkočit průvodce");

        txtZaklad1.setDisabled(true);
        txtExponent1.setDisabled(true);
        txtModul1.setDisabled(true);

        txtZaklad2.setDisabled(true);
        txtMocnina1.setDisabled(true);
        txtModul2.setDisabled(true);
        txtRad.setDisabled(true);
        txtGenerator.setDisabled(true);

        btnLogaritmus1.setDisabled(true);
        btnMocneni1.setDisabled(true);
        button1.setDisabled(true);
        //button2.setDisabled(true);


        btnBack1.setDisabled(true);
        btnFwd1.setDisabled(false);
        btnSkip1.setDisabled(false);
        btnFwd1.setText("Další");

        Label[] labs = new Label[] { graphColumn1, graphColumn2, graphColumn3, graphColumn4, graphColumn5, graphColumn6, graphColumn7, graphColumn8, graphColumn9, graphColumn10, graphColumn11, graphColumn12, graphColumn13, graphColumn14, graphColumn15, graphColumn16, graphColumn17, graphColumn18, graphColumn19, graphColumn20, graphColumn21, graphColumn22, graphColumn23, graphColumn24, graphColumn25, graphColumn26, graphColumn27, graphColumn28, graphColumn29, graphColumn30  };
        for (int i=0; i<30; i++) labs[i].setVisible(false);

        return null;
    }
      private void ClearFields() {
        ///////////////////////////////////////////////
        // text prvni zpravy
        String zprava = "Diskrétní logaritmus jako operace opačná k diskrétnímu mocnění je jedním z problémů, které dnešní matematika nedokáže efektivně řešit. díky tomu se stal základem velké skupiny kryptografických metod. Tento průvodce by měl pomoci vysvětlit jeho princip a některé jeho vlastnosti.";
        labPopis1.setText(zprava);
        ///////////////////////////////////////////////

        txtZaklad1.setValue("??");
        txtExponent1.setValue("??");
        txtModul1.setValue("??");
        labMocnina1.setText("??");
        labDoba1.setText("??");
        txtZaklad2.setValue("??");
        txtMocnina1.setValue("??");
        txtModul2.setValue("??");
        labExponent1.setText("??");
        labDoba2.setText("??");

        txtRad.setValue("??");
        txtGenerator.setValue("??");
        labGenRes.setText("");

        labDoba.setText("??");
        labDoba1.setText("??");
        labDoba2.setText("??");
        hiddenCislo1.setText(0);
        labKrok1.setVisible(false);

    }
      private void PerformStep(boolean forward) {
        int krok = Integer.parseInt(hiddenCislo1.getValue().toString());

        ////////////////////////////////////////////////
        // nastavit pocet kroku
        int pocetKroku = 9;
        ////////////////////////////////////////////////

        labKrok1.setText("Krok -1:");

        if (forward) {
            krok = Math.min(pocetKroku, krok + 1);
        } else {
            krok = Math.max(0, krok - 1);
        }

        ////////////////////////////////////////////////
        // zprava se zobrazi uzivateli po provedeni kazdeho kroku
        String zprava = "";
        // hodnota slouzi pro predani zvolene hodnoty do prislusneho pole
        String hodnota;
        ////////////////////////////////////////////////

        switch (krok - 1) {
            case -1:
                if (!forward) {
                    btnBack1.setDisabled(true);

                    labKrok1.setVisible(false);
                    zprava ="Diskrétní logaritmus jako operace opačná k diskrétnímu mocnění je jedním z problémů, které dnešní matematika nedokáže efektivně řešit. díky tomu se stal základem velké skupiny kryptografických metod. Tento průvodce by měl pomoci vysvětlit jeho princip a některé jeho vlastnosti.";
                    txtZaklad1.setValue("??");
                    txtExponent1.setValue("??");
                    txtModul1.setValue("??");
                    labMocnina1.setText("??");
                }
                break;
            case 0:
                btnBack1.setDisabled(false);
                zprava = "Diskrétní mocnění je operace, kdy číslo (základ, generátor) je umocňen na daný exponent a z výsledku je určen zbytek po celočíselném dělení modulem. Výsledek tohoto dělení bude vždy v intervalu <0, modul>, nezávisle na velikosti exponentu.";
                labKrok1.setVisible(true);
                txtZaklad1.setValue("5");
                txtExponent1.setValue("8");
                txtModul1.setValue("11");
                labMocnina1.setText("3");
                if (!forward) {
                    txtExponent1.setValue("8");
                    labKrok1.setVisible(false);
                }
                break;
            case 1:
                zprava = "Tím, že zbytek po dělení bude vždy v intervalu <0, modul> nezávisle na velikosti exponentu, znamená to, že při mocnění zvyšujícím se exponentem se výsledky začnou opakovat. Největší počet hodnot, které mohou být hodnotou zbytku po dělení je roven počtu prvků množiny {1,..,modul}.";
                labKrok1.setVisible(true);
                txtExponent1.setValue("17");
                if (!forward) {
                    txtExponent1.setValue("17");
                }
                break;
            case 2:
                zprava = "Čísla, která se takto pravidelně opakují při výpočtu, se obecně nazývají \"Cyklické grupy\", v tomto případě \"Nekonečné cyklické grupy\". Jejich vlastnoti zásadně ovlivňují řešitelnost diskrétních logaritmů.";
                txtExponent1.setValue("27");

                if (!forward) {
                    txtZaklad2.setValue("??");
                    txtMocnina1.setValue("??");
                    txtModul2.setValue("??");
                    labExponent1.setText("??");
               }
                break;
           case 3:
                zprava = "Diskrétním logaritmem je tedy problém určení exponentu, na který byl umocněn známý základ, známe-li hodnotu zbytku po celočíselném dělení známým modulem. Pro malé řády cyklických grup lze postupně umocňovat základ a počítat, zda pro daný mocnitel je nalezený výsledek shodný s hledaným, ve velkých grupách to však není vzhledem k počtu možností realizovatelné.";
                txtZaklad2.setValue(3);
                txtMocnina1.setValue(5);
                txtModul2.setValue(11);
                labExponent1.setText("8");

                if (!forward) {

               }
                break;
           case 4:
                zprava = "Vlastnosti diskrétních logaritmů jsou tedy zásadně ovlivněny vlastnostmi cyklických grup. Pro efektivní implementaci kryptografické metody je třeba věnovat volbě grupy zásadní pozornost. Dále budou představeny jejich základní vlastnosti.";

                if (!forward) {
                    txtRad.setValue("??");
                    txtGenerator.setValue("??");
                    labGenRes.setText("");

               }
                break;
           case 5:
                zprava = "Prvky cyklické mutliplikativní grupy vzniknou obecně tak, že se zvolený generátor umozňuje postupně na čísla od 0 do hodnoty modulu (řád grupy), čímž vznikne posloupnost prvků grupy. Jak bude tato posloupnost vypadat, záleží na volbě generátoru a řádu grupy.";
                txtRad.setValue("29");
                txtGenerator.setValue("3");
                labGenRes.setText("1 3 9 27 23 11 4 12 7 21 5 15 16 19 28 26 20 2 6 18 25 17 22 8 24 14 13 10 1 3");
                if (!forward) {
                    imgRun1.setVisible(false);

                }
                break;
           case 6:
                zprava = "Při vhodně zvoleném řádu grupy a vhodném generátoru obsahuje grupa maximální množství rozdílných prvků a ty se jeví jako náhodný šum. Taková grupa je vhodná pro použití v kryptografii. Je zde vidět, že každý prvek je v grupě pouze jednou a první opakující se prvek je roven 1 v případě, že exponent je roven n-1.";
                imgRun1.setVisible(true);

                if (!forward) {
                    txtRad.setValue("29");
                    txtGenerator.setValue("3");
                    labGenRes.setText("1 3 9 27 23 11 4 12 7 21 5 15 16 19 28 26 20 2 6 18 25 17 22 8 24 14 13 10 1 3");
                    imgRun2.setVisible(false);
                    imgRun1.setVisible(true);
               }
                break;
           case 7:
                zprava = "Na druhé straně při volbě nevhodné grupy nebo generátoru může grupa obsahovat jen několik prvků, které vzniknou při několika různých mocninách. Použití takové grupy v kryptografii by značně snížilo bezpečnost daného algoritmu.";
                txtRad.setValue("29");
                txtGenerator.setValue("7");
                labGenRes.setText("1 7 20 24 23 16 25 1 7 20 24 23 16 25 1 7 20 24 23 16 25 1 7 20 24 23 16 25 1 7");
                imgRun2.setVisible(true);
                imgRun1.setVisible(false);

                btnFwd1.setText("Konec");
                if (!forward) {
               }
                break;
           case 8:
                ClearFields();
                zprava = "Diskrétní logaritmus jako operace opačná k diskrétnímu mocnění je jedním z problémů, které dnešní matematika nedokáže efektivně řešit. díky tomu se stal základem velké skupiny kryptografických metod. Tento průvodce by měl pomoci vysvětlit jeho princip a některé jeho vlastnosti.";
                btnSkip1.setText("Restart okna");
                imgRun2.setVisible(false);

                btnFwd1.setDisabled(true);
                btnFwd1.setText("Další");
                btnBack1.setDisabled(true);
                if (!forward) {
               }
                break;

        }

        hiddenCislo1.setValue(krok);
        labKrok1.setText("Krok " + (krok - 1) + ":");
        labPopis1.setText(zprava);
    }

    public String btnVyh_action() {
        try
        {
        String odp = txtOdp1.getValue().toString();
        if (odp.equals("A")||odp.equals("a"))
            labO1.setText("OK");
        else
            labO1.setText("KO");

        odp = txtOdp2.getValue().toString();
        if (odp.equals("b")||odp.equals("B"))
            labO2.setText("OK");
        else
            labO2.setText("KO");

        odp = txtOdp3.getValue().toString();
        if (odp.equals("3")||odp.equals("6"))
            labO3.setText("OK");
        else
            labO3.setText("KO");

        odp = txtOdp4.getValue().toString();
        if (odp.equals("6"))
            labO4.setText("OK");
        else
            labO4.setText("KO");

        odp = txtOdp5.getValue().toString();
        if (odp.equals("c")||odp.equals("C"))
            labO5.setText("OK");
        else
            labO5.setText("KO");

        odp = txtOdp6.getValue().toString();
        if (odp.equals("C")||odp.equals("c"))
            labO6.setText("OK");
        else
            labO6.setText("KO");
         }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Chybná vstupní data, DL.");
        }
        return null;
    }

    public String btnVysl_action() {
        txtOdp1.setValue("A");
        txtOdp2.setValue("B");
        txtOdp3.setValue("3, 6");
        txtOdp4.setValue("6");
        txtOdp5.setValue("C");
        txtOdp6.setValue("C");
        return null;
    }

    public String hyperlink1_action() {
        // TODO: Process the action. Return value is a navigation
        // case name where null will return to the same page.
        return null;
    }
    
}

