// Import der Java-Klassen
importPackage(java.lang)
importPackage(java.awt);
importPackage(java.awt.event);
importPackage(Packages.JSci.awt);
importPackage(Packages.JSci.swing);

/*
 * GraphDemo
 * 
 * Beispiel für JavaScript mit Rhino
 * http://www.linkwerk.com/pub/javascript/rhino/
 * (c) Linkwerk GmbH 2005
 *
 */

// Funktion toJavaArray()
// Erweiterung von JavaScript-Arrays
// mittels "prototyping"
Array.prototype.toJavaArray = function (type) {
    // Erzeuge Java-Array mit Reflection
    var arr = java.lang.reflect.Array.newInstance(type, this.length);
    
    // Umladen aus JavaScript-Array nach Java-Array
    for (i = 0; i != this.length; ++i) {
        arr[i] = this[i];
    }
    
    return arr;
}

// Aufruf GraphDemo
GraphDemo()

// GraphDemo
function GraphDemo() {

    // Funktion zur Erzeugung des Daten-Modells
    f = function (x) {
            return Math.cos(x);
        }

    // Eck-Werte zur Erzeugung des Daten-Modells
    var minX  = -2 * Math.PI;;
    var maxX  = 2 * Math.PI;
    var stepX = 0.1;
        
    // Erzeuge Datenmodell
    var valueModel = createValueData(minX, maxX, stepX, f);
    
    // Erzeuge neuen PlotFrame
    var plotFrame = new PlotFrame();

    // Erzeuge JLineGraphPanel
    var lineGraphPanel = LineGraphPanel(valueModel); 
    plotFrame.addGraph(lineGraphPanel);
    
    // Setze Property visible am Frame unter Verwendung
    // von JavaBeans Style Properties
    plotFrame.getFrame().visible = true;
}

// LineGraphPanel
function LineGraphPanel(valueModel) {
    
    var lineGraph = new JLineGraph(valueModel);
    var titleFont=new Font("Default",Font.BOLD,14);
    var title=new Label("Function plot",Label.CENTER);
    var lineGraphPanel=new Panel(new JGraphLayout());

    lineGraph.setGridLines(true);
    lineGraph.setMarker(new Graph2D.DataMarker.Circle(2));
    title.setFont(titleFont);
    lineGraphPanel.add(title, JGraphLayout.TITLE);
    lineGraphPanel.add(lineGraph, JGraphLayout.GRAPH);

    lineGraphPanel.add(new Label("x-axis",Label.CENTER), JGraphLayout.X_AXIS);
    lineGraphPanel.add(new Label("y-axis",Label.CENTER), JGraphLayout.Y_AXIS);
    
    return lineGraphPanel;
}


// PlotFrame Object Constructor
function PlotFrame() {

    var plotFrame = new Frame("The amazing iX plot panel");
    plotFrame.setSize(700, 600);

    /* Überladen der Methode windowClosing der 
     * abstrakten Java-Klasse WindowAdapter
     * Alle Mehoden der Klasse WindowAdapter sind "leer"
     */
    function windowClosingAction(event) {
        print("Closing..."); 
        quit();
    };
    
    // Erzeuge Objekt mit Object Literal
    var wcObj = { windowClosing : windowClosingAction }
    plotFrame.addWindowListener(WindowAdapter(wcObj));

    // Methode von PlotFrame
    this.getFrame = 
        function () {
            return plotFrame;
        };

    // Methode von PlotFrame
    this.addGraph = 
        function (graph) {
            plotFrame.add(graph);
        };
        
}

// Funktion createValueData
function createValueData(minX, maxX, stepX, f) {

    var yWerte = new Array();
        
    for(x = minX; x <= maxX; x += stepX) {
        yWerte.push(f(x));
    }

    var model = new DefaultGraph2DModel();

    model.setXAxis(minX, maxX, yWerte.length);
    model.addSeries(yWerte.toJavaArray(Float.TYPE));
    
    return model;
}

