/*
 * DeVig.java
 *
 * Created on 2005. travanj 13, 19:01
 */

package Vigenere;
import java.awt.event.*;
import org.netbeans.lib.awtextra.*;

/**
 *
 * @author  alf
 */
public class DeVig extends javax.swing.JFrame {
    
    
    private char slova[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    
    /** Creates new form DeVig */
    public DeVig() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        otTxtArea = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        indKoincTxtArea = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jTextField2 = new javax.swing.JTextField();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        MIcTextArea = new javax.swing.JTextArea();
        jLabel5 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        gTF = new javax.swing.JTextField();
        kiButton = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        keywordTF = new javax.swing.JTextField();
        jPanel3 = new javax.swing.JPanel();
        jLabel8 = new javax.swing.JLabel();
        kljucTF = new javax.swing.JTextField();
        jButton4 = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        otvorenitxtTA = new javax.swing.JTextArea();
        jLabel9 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.GridLayout(1, 0));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("DeVig");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTabbedPane1.setBackground(new java.awt.Color(51, 204, 255));
        jTabbedPane1.setBorder(new javax.swing.border.MatteBorder(null));
        jTabbedPane1.setToolTipText("");
        jTabbedPane1.setMaximumSize(new java.awt.Dimension(327670, 327670));
        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setToolTipText("Odredjivanje duljine kljuca");
        jLabel1.setText("Otvoreni tekst:");
        jPanel1.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, -1, -1));

        jScrollPane1.setViewportView(otTxtArea);

        jPanel1.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 30, 510, 110));

        jLabel2.setText("Indeksi koincidencije:");
        jPanel1.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 150, -1, -1));

        jScrollPane2.setViewportView(indKoincTxtArea);

        jPanel1.add(jScrollPane2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 170, 510, 200));

        jButton1.setText("Next");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel1.add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(450, 400, -1, -1));

        jLabel3.setText("Pretpostavljena max duljina kljuca:");
        jPanel1.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 400, -1, -1));

        jPanel1.add(jTextField1, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 400, 50, -1));

        jLabel4.setText("m =");
        jPanel1.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(320, 400, -1, -1));

        jPanel1.add(jTextField2, new org.netbeans.lib.awtextra.AbsoluteConstraints(350, 400, 50, -1));

        jTabbedPane1.addTab("Korak 1", jPanel1);

        jPanel2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel2.setToolTipText("Odredjivanje kljucne rijeci");
        jScrollPane3.setViewportView(MIcTextArea);

        jPanel2.add(jScrollPane3, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 40, 500, 240));

        jLabel5.setText("Medjusobni indeksi konicidencije:");
        jPanel2.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, -1, -1));

        jButton2.setText("Trazi MIc");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jPanel2.add(jButton2, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 300, -1, -1));

        jLabel6.setText("Unesi najpovoljnjiji g :");
        jPanel2.add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 300, -1, -1));

        jPanel2.add(gTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(270, 300, 40, -1));

        kiButton.setText("Nadji k[i]");
        kiButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                kiButtonActionPerformed(evt);
            }
        });

        jPanel2.add(kiButton, new org.netbeans.lib.awtextra.AbsoluteConstraints(220, 330, -1, -1));

        jLabel7.setText("Kljucna rijec:");
        jPanel2.add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(320, 300, -1, -1));

        jPanel2.add(keywordTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 300, 50, -1));

        jTabbedPane1.addTab("Korak 2", jPanel2);

        jPanel3.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel3.setToolTipText("Deshifririanje");
        jLabel8.setText("Kljucna rijec:");
        jPanel3.add(jLabel8, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 30, -1, -1));

        jPanel3.add(kljucTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 30, 100, -1));

        jButton4.setText("Desifriraj");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jPanel3.add(jButton4, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 30, -1, -1));

        jScrollPane4.setViewportView(otvorenitxtTA);

        jPanel3.add(jScrollPane4, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 110, 480, 190));

        jLabel9.setText("Otvoreni tekst:");
        jPanel3.add(jLabel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 90, -1, -1));

        jTabbedPane1.addTab("Korak 3", jPanel3);

        getContentPane().add(jTabbedPane1);

        pack();
    }//GEN-END:initComponents
    
    private void kiButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kiButtonActionPerformed
        int g=Integer.parseInt(gTF.getText());
        int k=-g%26<0 ? (-g%26)+26:(-g%26);
        keywordTF.setText(keywordTF.getText()+slova[k]);
    }//GEN-LAST:event_kiButtonActionPerformed
    
    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
        
        char slova[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        String sifrat = otTxtArea.getText();
        sifrat=sifrat.trim();
        sifrat=sifrat.toUpperCase();
        
        String kljuc = kljucTF.getText();
        kljuc = kljuc.trim();
        kljuc = kljuc.toUpperCase();
        int k[] = new int[kljuc.length()]; //numericki ekvivalenti slova u kljucu
        
        for(int i=0;i<k.length;i++) {
            int j=0;
            while(slova[j]!=kljuc.charAt(i)) {j++;}
            k[i]=j;
        }
        
        int m= kljuc.length(); //duljina kljuca
        
        int tmpdulj=(sifrat.length()/m)+1;
        StringBuffer[] z= new StringBuffer[tmpdulj];
        for(int s=0;s<tmpdulj;s++) z[s] = new StringBuffer();
        
        int tmpbr=0;
        for(int i=0;i<sifrat.length();i++) {
            if((i =(i==0)?i+1:i )%m!=0 && sifrat.charAt(i)!=' ' && sifrat.charAt(i)!='\n') {
                z[tmpbr].append(sifrat.charAt(i));
            }
            else {
                if(sifrat.charAt(i)!=' ' && sifrat.charAt(i)!='\n') {
                    tmpbr++;
                    z[tmpbr].append(sifrat.charAt(i));
                }
            }
            
        }
        
        //jos trebamo desifrirati dane z[i] s kljucem
        
        for(int i=0;i<tmpdulj;i++) {
            for(int l=0;l<z[i].length();l++) {
                int tmp1=0;
                while(slova[tmp1]!=z[i].charAt(l)) tmp1++;
                int tmp2 = tmp1-k[l] <0 ? ((tmp1-k[l])%26)+26 : (tmp1-k[l])%26;
                otvorenitxtTA.append(Character.toString(slova[tmp2]));
                
            }
        }
        
    }//GEN-LAST:event_jButton4ActionPerformed
    
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        //sada cemo redom generirati medjusobne indekse koincidencije za
        // stringove z[i] , i=1,...,m
        
        MIcTextArea.setText("");
        
        String sifrat = otTxtArea.getText();
        sifrat=sifrat.trim();
        sifrat=sifrat.toUpperCase();
        
        //frekvencije slova u hrvatskom jeziku
        int f[]={115,15,28,37,84,3,16,8,98,51,36,33,31,66,90,29,0,54,56,48,43,35,0,0,0,23};
        
        int m = Integer.parseInt(jTextField2.getText());
        
        //sada cemo ponovno izgenerirati potrebne stringove z[i], i=1,...,m
        StringBuffer[] z= new StringBuffer[m];
        for(int s=0;s<m;s++) z[s] = new StringBuffer();
        
        for(int i=0;i<m;i++) {
            int j = i;
            while(j<sifrat.length()) {
                if(sifrat.charAt(j)!=' ' && sifrat.charAt(j)!='\n')
                    z[i].append(sifrat.charAt(j));
                j=j+m;
            }
        }
        
        //sada idemo racunati MIc za svaki z[i], i=1,...,m
        
        for(int i=0;i<m;i++) {
            MIcTextArea.append("\n### "+(i+1)+" ###\n");
            
            for(int g=0;g<26;g++) {
                float suma=0;
                MIcTextArea.append("\nMIc za g= "+g+"\n");
                for(int j=0;j<26;j++) {
                    float pi=((float)f[j])/1000;
                    int ind=(i-g+26)%26;
                    // sad treba izborojati koliko puta se pojavljuje slovo 'slova[ind]'
                    //u stringu z[i]
                    int tmpbr=0;
                    for(int k=0;k<z[i].length();k++) {
                        if(slova[ind]==z[i].charAt(k)) tmpbr++;
                    }
                    suma = suma + pi*(float)tmpbr;
                }
                suma=suma/z[i].length();
                MIcTextArea.append("z["+i+"] = "+z[i].toString()+" >>"+suma+"\n");
            }
        }
        
    }//GEN-LAST:event_jButton2ActionPerformed
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        
        indKoincTxtArea.setText("");
        char[] slova={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        //prvo uzmemo sifrat iz odgovarajuceg text polja
        String sifrat = otTxtArea.getText();
        sifrat=sifrat.trim();
        sifrat=sifrat.toUpperCase();
        
        //sad trazimo duljinu kljuca
        int m=1;
        int max_dulj_kljuca = Integer.parseInt(jTextField1.getText());
        
        for(m=1; m<=max_dulj_kljuca; m++) {
            //kreiramo polje stringova za koje cemo ispitati indekse koincidencije
            StringBuffer[] z= new StringBuffer[m];
            for(int s=0;s<m;s++) z[s] = new StringBuffer();
            
            for(int i=0;i<m;i++) {
                int j = i;
                while(j<sifrat.length()) {
                    
                    if(sifrat.charAt(j)!=' ' && sifrat.charAt(j)!='\n')
                        z[i].append(sifrat.charAt(j));
                    
                    j=j+m;
                }
            }
            //sad kada smo stvorili stringove (z[i]), idemo racunati indekse koincidencije za njih
            
            indKoincTxtArea.append("Indeksi koincidencije niza stringova za m= "+m+"\n");
            
            for(int j=0;j<m;j++) {
                
                float suma=0;
                for(int i=0;i<26;i++) {
                    int tmpbr=0; //privremeni brojac
                    for(int k=0;k<z[j].length();k++) {
                        if(slova[i]==z[j].charAt(k)) tmpbr++;
                    }
                    suma=suma+((float)(tmpbr*(tmpbr-1)));
                }
                suma=suma/(float)(z[j].length()*(z[j].length()-1));
                
                indKoincTxtArea.append(" Z["+j+"] = "+z[j].toString()+" >>\t"+suma+"\n");
                
            }
            indKoincTxtArea.append("\n");
            
        }
        
    }//GEN-LAST:event_jButton1ActionPerformed
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new DeVig().show();
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea MIcTextArea;
    private javax.swing.JTextField gTF;
    private javax.swing.JTextArea indKoincTxtArea;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton4;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField keywordTF;
    private javax.swing.JButton kiButton;
    private javax.swing.JTextField kljucTF;
    private javax.swing.JTextArea otTxtArea;
    private javax.swing.JTextArea otvorenitxtTA;
    // End of variables declaration//GEN-END:variables
    
}
