package videopuzzle;

import javafx.scene.*;
import javafx.scene.paint.*;
import javafx.scene.image.*;
import javafx.scene.input.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.media.*;
import javafx.scene.text.*;
import javafx.geometry.*;
import javafx.scene.transform.*;
import javafx.stage.*;
import javafx.lang.FX;
import java.lang.Math;

/*FX.println("os = {FX.getProperty("os.name")}");
var uri="http://capra.sfbay.sun.com/JMC_Media_Samples/wmv/short/ducks16x9.360x180at1400kbpsCBR.wmv";
if(System.getProperty("os.name").contains("Mac")) {
    
}*/
//var uri="http://capra.sfbay.sun.com/~jm158417/javafx_videos/elephantsdream-512x288-at24fps.flv";
//var uri="http://capra.sfbay.sun.com/~jm158417/javafx_videos/big_buck_bunny_512x288_h264.mov";
//var uri="http://capra.sfbay.sun.com/~jm158417/javafx_videos/elephantsdream-512x288-at24fps.flv";
var uri="http://sun.edgeboss.net/download/sun/media/1460825906/1460825906_2957282001_elephantsdream-640x360.flv";
if(FX.getArgument("mediaURL")!=null) {
    uri = FX.getArgument("mediaURL").toString();
}
var player = MediaPlayer {
    media: Media { source: uri }
    autoPlay: true
    repeatCount: MediaPlayer.REPEAT_FOREVER
    volume: 0.5
};

var ui = VideoPuzzleUI { };

var main = Main { };
main.puz = Puzzle {
    width: 512
    height: 288
    scatterBounds: Rectangle2D { minX: -100 minY: -30 width: 512+200 height: 288+60 }
    video: player
    dragTargetImage: (ui.target_drag as ImageView).image
    ui:ui
};

var phase1 = ui.getGroup("phase1");
phase1.visible = true;
var phase2 = ui.getNode("phase2");
ui.phase2.visible = false;
var puzzlePieces = Group {
    translateX: (700-main.puz.width)/2
    translateY: (430-main.puz.height)/2-16
    content: bind [
        Rectangle { width: main.puz.width height: main.puz.height fill: null stroke: Color.BLACK strokeWidth: 2 },
        main.puz.pieces
    ]
};
puzzlePieces.visible = false;


// the preview used in phase 1
var phase1Preview = MediaView {
    transforms: [Transform.translate(18,50), Transform.scale(0.8,0.8)]
    mediaPlayer: player
};

// the phase 1 start button
ui.Start_Button.onMouseClicked = function(e:MouseEvent):Void {
    main.puz.scatter();
    main.startGame();
    ui.phase1.visible = false;
    phase1Preview.visible = false;
    ui.phase2.visible = true;
    puzzlePieces.visible = true;
}




// the difficulty slider
var slider_startx = ui.slider.translateX;
ui.slider_bkg.onMouseDragged = function(e:MouseEvent):Void {
    ui.slider.translateX = slider_startx + e.dragX;
    if(ui.slider.translateX < ui.slider_bkg.translateX) {
        ui.slider.translateX = ui.slider_bkg.translateX;
    }
    if(ui.slider.translateX > ui.slider_bkg.translateX + 110) {
        ui.slider.translateX = ui.slider_bkg.translateX + 110;
    }
    main.difficulty = 2 + ((ui.slider.translateX - ui.slider_bkg.translateX)/30) as Integer;
}

var difficulty_text = Text { x: 549 y: 315 fill: Color.BLACK font: Font { size: 10 }
                content: bind "{main.difficulty}x{main.difficulty} - {main.difficulty*main.difficulty} pieces selected" };
insert difficulty_text into (phase1 as Group).content;


// the volume control
ui.volume.visible = true;
ui.volume_rollover.visible = true;
RolloverBehavior { target: ui.volume_rollover };
ui.volume_rollover.onMouseClicked = function(e:MouseEvent):Void {
    ui.volume.visible = false;
    ui.volume_rollover.visible = false;
    ui.volume_stop.visible = true;
    ui.volume_stop_rollover.visible = true;
    player.volume = 0.0;
};
ui.volume_stop.visible = false;
ui.volume_stop_rollover.visible = false;
RolloverBehavior { target: ui.volume_stop_rollover };
ui.volume_stop_rollover.onMouseClicked = function(e:MouseEvent):Void {
    ui.volume.visible = true;
    ui.volume_rollover.visible = true;
    ui.volume_stop.visible = false;
    ui.volume_stop_rollover.visible = false;
    player.volume = 1.0;
};

// the play / pause control
RolloverBehavior{ target: ui.play_rollover };
ui.play_rollover.onMouseClicked = function(e:MouseEvent):Void {
    ui.play.visible = false;
    ui.play_rollover.visible = false;
    ui.pause.visible = true;
    ui.pause_rollover.visible = true;
    player.play();
};

RolloverBehavior { target: ui.pause_rollover };
ui.pause_rollover.onMouseClicked = function(e:MouseEvent):Void {
    ui.play.visible = true;
    ui.play_rollover.visible = true;
    ui.pause.visible = false;
    ui.pause_rollover.visible = false;
    player.pause();
};
ui.pause.translateX -= 25;
ui.pause_rollover.translateX -= 25;
ui.pause.visible = true;
ui.pause_rollover.visible = true;
ui.play.visible = false;
ui.play_rollover.visible = false;
ui.load.visible = false;
ui.load_rollover.visible = false;


ui.framework.visible = true;



var previewSpotX = 12; var previewSpotY = 50;
var overlaySpotX = 95; var overlaySpotY = 55;
var previewDimOverlay = Group {
    visible: false
    content:[
        Rectangle { 
            x: 7 y: 25 width: 685 height: 332 arcWidth: 10 arcHeight: 10
            fill: Color.rgb(0,0,0,0.4)  
            blocksMouse: true
        }
    ]
}
var previewGridOverlay = Group {
    translateX: overlaySpotX
    translateY: overlaySpotY
    visible: false
    content: bind for(i in [0..main.puz.pieceRows-1],j in [0..main.puz.pieceCols-1]) {
        Rectangle {
            x: i*main.puz.pieceWidth
            y: j*main.puz.pieceHeight
            width: main.puz.pieceWidth
            height: main.puz.pieceHeight
            fill: null
            stroke: Color.WHITE
        }
    }
};

// the phase 2 buttons
ui.hint_button_active.visible = true;
RolloverBehavior { target: ui.hint_button_active };
ui.hint_button_active.onMouseClicked = function(e:MouseEvent):Void {
    main.puz.toggleHint();
};

ui.shuffle_button_active.visible = true;
RolloverBehavior { target: ui.shuffle_button_active };
ui.shuffle_button_active.onMouseClicked = function(e:MouseEvent):Void {
    main.puz.scatter();
};
ui.preview_button_active.visible = true;
RolloverBehavior { target: ui.preview_button_active };
ui.preview_button_active.onMouseClicked = function(e:MouseEvent):Void {
    phase1Preview.transforms = [Transform.translate(overlaySpotX,overlaySpotY), Transform.scale(0.8,0.8)];
    phase1Preview.visible = not phase1Preview.visible;
    previewDimOverlay.visible = phase1Preview.visible;
    previewGridOverlay.visible = phase1Preview.visible;
}
ui.stop_button_active.visible = true;
RolloverBehavior { target: ui.stop_button_active };
ui.stop_button_active.onMouseClicked = function(e:MouseEvent):Void {
    ui.phase1.visible = true;
    phase1Preview.visible = true;
    ui.phase2.visible = false;
    puzzlePieces.visible = false;
    phase1Preview.transforms = [Transform.translate(previewSpotX,previewSpotY), Transform.scale(0.8,0.8)];
    previewDimOverlay.visible = false;
    previewGridOverlay.visible = false;
}


/*
var dragText = Text { x: 270 y: 13 fill: Color.WHITE content: "Drag me out of the browser"
    visible: bind not AppletStageExtension.appletDragSupported
};
*/


// drag and close controls

var dragArea = Rectangle { x: 0 y: 0 width: 700 height: 30 fill: Color.rgb(0,0,0,0.0) };
var isApplet = (FX.getArgument("isApplet")!=null);

ui.drag.visible = false;
ui.drag_text.visible = isApplet and AppletStageExtension.appletDragSupported;
var outOfBrowser:Boolean = false on replace {
    ui.drag.visible = outOfBrowser;
    ui.drag_text.visible = not outOfBrowser and AppletStageExtension.appletDragSupported;
}

ui.close_94.visible = not isApplet;
ui.close_94.onMousePressed = function(e:MouseEvent) {
    stage.close();
}
ui.window_icons.visible = true;

phase1.blocksMouse = true;
phase2.blocksMouse = true;

var stage:Stage = Stage {
    visible: true
    title: "Video Puzzle"
    style: StageStyle.TRANSPARENT
    scene: Scene {
        fill: null
        content: [
            ui.framework,
            ui.movie_controls,
            phase2,
            puzzlePieces,
            phase1,
            previewDimOverlay,
            phase1Preview,
            previewGridOverlay,
            ui.window_icons,
            //dragText,
        ]
    }
    extensions: [
        AppletStageExtension {
            shouldDragStart: function(e: MouseEvent): Boolean {
                println("should drag start: {e.x} , {e.y} {e}");
                return e.primaryButtonDown and not outOfBrowser and dragArea.contains(e.sceneX,e.sceneY);
            }
            onDragStarted: function(): Void {
                println("drag started");
            }
            onDragFinished: function(): Void {
                println("drag finished");
                outOfBrowser = true;
             }
            onAppletRestored: function(): Void {
                println("restored");
            }
            useDefaultClose: false
        }
    ]}

ui.framework.onMouseDragged = function(e:MouseEvent) {
        stage.x += e.dragX;
        stage.y += e.dragY;
};