/* 
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. 
 * 
 * This file is available and licensed under the following license:
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *   * Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *
 *   * Neither the name of Sun Microsystems nor the names of its contributors 
 *     may be used to endorse or promote products derived from this software 
 *     without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*
* Main.fx
 *
 * Created on 7 Mar, 2009, 9:20:41 AM
 */

package sudoku;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.lang.FX;
import javafx.scene.Cursor;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.scene.text.TextOrigin;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import sudoku.Button;
import sudoku.SudokuNode;

/**
 * @author Rakesh Menon
 */
var stageDragInitialX:Number;
var stageDragInitialY:Number;

var stylesheets = "{__DIR__}black.css";
var black = false on replace {
    if(black) {
        stylesheets = "{__DIR__}black.css";
        cssButton.data = "Blue";
    } else {
        stylesheets = "{__DIR__}blue.css";
        cssButton.data = "Black";
    }
}

var newButton: Button = Button {
    data: "New"
    width: 52
    height: 25
}

var hintButton = Button {
    data: "Hint"
    width: 52
    height: 25
}

var verifyButton = Button {
    data: "Verify"
    width: 52
    height: 25
}

var timeline: Timeline = Timeline {
    keyFrames: [
        KeyFrame {
            time: 250ms
            action: function() {
                black = not black;
                glassRect.visible = false;
            }
        }
    ]
}

var cssButton: Button = Button {
    data: "Black"
    width: 52
    height: 25
    onMousePressed: function(e) {
        cssButton.opacity = 1.0;
        glassRect.visible = true;
        timeline.playFromStart();
    }
}

var dropShadow = DropShadow {
    offsetX: 2
    offsetY: 3
    color: Color.color(0.4, 0.4, 0.4)
};

var titleText = Text {
    content: "Sudoku"
    translateX: 15
    translateY: 15
    textOrigin: TextOrigin.TOP
    effect: dropShadow
    styleClass: "titleText"
}

var buttonGrid: HBox = HBox {
    spacing: -10
    content: [ newButton, hintButton, verifyButton, cssButton ]
    translateX: bind (281 - buttonGrid.boundsInLocal.width) / 2.0 + 2
    translateY: titleText.translateY + 22
}

var bgRect = Rectangle {
    x: 1
    y: 1
    width: 278
    height: 405
    styleClass: "borderRectangle"
};

var glassRect = Rectangle {
    x: 1
    y: 1
    width: 278
    height: 405
    opacity: 0.75
    styleClass: "borderRectangle"
    blocksMouse: true
    cursor: Cursor.WAIT
    visible: false
};

var loadingText : Text = Text {
    content: "Loading Theme..."
    translateX: bind (bgRect.width - loadingText.boundsInLocal.width)/ 2.0 + 10
    translateY: bind (bgRect.height - loadingText.boundsInLocal.height)/ 2.0
    textOrigin: TextOrigin.TOP
    effect: dropShadow
    styleClass: "titleText"
    visible: bind glassRect.visible
}

var closeButton = Text {
    content: "X"
    translateX: bgRect.width - 25
    translateY: 15
    textOrigin: TextOrigin.TOP
    effect: dropShadow
    cursor: Cursor.HAND
    styleClass: "titleText"
    visible: bind ("{__PROFILE__}" != "browser")
    onMousePressed: function(e) {
        FX.exit();
    }
}

var sudokuNode: SudokuNode = SudokuNode {
    translateY: buttonGrid.translateY + 43
    translateX: 4
};
newButton.onMousePressed = function(e) {
    sudokuNode.updateData();
}
hintButton.onMousePressed = function(e) {
    sudokuNode.hint();
}
verifyButton.onMousePressed = function(e) {
    sudokuNode.verifyData();
}

var stage = Stage {
    scene: Scene {
        content: [ bgRect, titleText, sudokuNode, buttonGrid, closeButton, glassRect, loadingText ]
        width: 281
        height: 408
        stylesheets: bind stylesheets
    }
    title: "JavaFX Sudoku"
    style: StageStyle.UNDECORATED
}
bgRect.onMousePressed = function(e) {
    if("{__PROFILE__}" != "browser") {
        stageDragInitialX = e.screenX - stage.x;
        stageDragInitialY = e.screenY - stage.y;
    }
}
bgRect.onMouseDragged = function(e) {
    if("{__PROFILE__}" != "browser") {
        stage.x = e.screenX - stageDragInitialX;
        stage.y = e.screenY - stageDragInitialY;
    }
}

sudokuNode.updateData();
sudokuNode.requestFocus();