/*
 * Main.fx
 *
 * Created on 9 Jun, 2009, 6:31:20 PM
 */

package placelist;

import javafx.data.pull.PullParser;
import javafx.ext.swing.SwingComponent;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.io.http.HttpRequest;
import javafx.scene.control.Label;
import javafx.scene.control.TextBox;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.LayoutInfo;
import javafx.scene.layout.VBox;
import javafx.scene.Scene;
import javafx.stage.Alert;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javax.swing.JComboBox;
import placelist.Place;
import placelist.XMLParser;

/**
 @author Rakesh Menon
 */

/**
 * Obtain appid from http://developer.yahoo.com/wsregapp/
 */
var appid = "abcd";

/**
 * Server Side
 */

function findPlaces(url : String) {

    placesList.removeAllItems();
    placesList.setEnabled(false);

    println("Finding places in \"{url}\" document");
    
    var httpRequest = HttpRequest {
        
        location: "http://wherein.yahooapis.com/v1/document"
        method: HttpRequest.POST
        
        onOutput: function(os) {
            try {
                var out = new java.io.PrintStream(os);
                out.print("documentURL={url}&");
                out.print("documentType=text/html&");
                out.print("outputType=rss&");
                out.print("appid={appid}");
                out.flush();
                out.close();
            finally {
                os.close();
            }
        }

        onException: function(e) {
            
            //e.printStackTrace();

            /**
             * http://developer.yahoo.com/geo/placemaker/guide/api-reference.html
             */
            if(e.getMessage() == null) {
                Alert.inform("{e}");
            else if(e.getMessage().contains("400")) {
                Alert.inform("400 Bad Request");
            else if(e.getMessage().contains("404")) {
                Alert.inform("404 Not Found");
            else if(e.getMessage().contains("413")) {
                Alert.inform("413 Request Entity Too Large");
            else if(e.getMessage().contains("415")) {
                Alert.inform("415 Unsupported Media Type");
            else if(e.getMessage().contains("999")) {
                Alert.inform("999 Unable to process request at this time");
            else {
                Alert.inform("{e.getMessage()}");
            }
        }
        
        onInput: function(is) {
            var xmlParser = XMLParser onDone: onPlaces };
            xmlParser.parse(is);
            is.close();
        }
    };
    httpRequest.start();
}

function updateMap(place : Place) {
    
    var httpRequest = HttpRequest {
        
        location: "http://local.yahooapis.com/MapsService/V1/mapImage?{place.toMapURL()}&appid={appid}&zoom=12&image_width=400&image_height=300"
        method: HttpRequest.GET
        
        onException: function(e) {
            e.printStackTrace();
        }
        
        onInput: function(is) {
            var pullParser = PullParser {
                input: is
                onEvent: function(e) {
                    if(e.type == PullParser.TEXT) {
                        if(not placesList.isEnabled()) {
                            placesList.setEnabled(true);
                        }
                        place.imageURL = "{e.text}";
                        placesList.addItem(place);
                    }
                }
            }
            pullParser.parse();
            is.close();
        }
    };
    httpRequest.start();
}

function onPlaces(places : Place[]) {
    println("Number of places found: {sizeof places}");
    for(place in places) {
        updateMap(place);
    }
}

/**
 * Client Side
 */

var waitImage = Image {
    url: "{__DIR__}images/wait.jpg"
}

var urlTextBox : TextBox = TextBox {
    text: "http://en.wikipedia.org/wiki/Wonders_of_the_World"
    action: function() {
        findPlaces(urlTextBox.rawText);
    }
    layoutInfo: LayoutInfo minWidth: 350 width: 350 maxWidth: 350 }
}

var hBox1 = HBox {
    content: [
        Label {
            text: "URL"
            layoutInfo: LayoutInfo vpos: VPos.CENTER minWidth: 45 width: 45 maxWidth: 45 }
        },
        urlTextBox
    ]
}

var placesList = new JComboBox();
var actionListener = java.awt.event.ActionListener {
    public override function actionPerformed(ae : java.awt.event.ActionEvent) {
        var place = placesList.getSelectedItem() as Place;
        if(place != null) {
            imageView.image = Image {
                width: 400
                height: 300
                url: place.imageURL
                backgroundLoading: true
                placeholder: waitImage
            }
        }
    }
};
placesList.addActionListener(actionListener);

var placesListFX : SwingComponent = SwingComponent.wrap(placesList);
placesListFX.layoutInfo = LayoutInfo minWidth: 350 width: 350 maxWidth: 350 };

var hBox2 = HBox {
    content: [
        Label {
            text: "Places"
            layoutInfo: LayoutInfo vpos: VPos.CENTER minWidth: 45 width: 45 maxWidth: 45 }
        },
        placesListFX
    ]
}

var imageView = ImageView {
    image: waitImage
    layoutInfo: LayoutInfo {
        vpos: VPos.CENTER
        hpos: HPos.CENTER
        minWidth: 400
        width: 400
        maxWidth: 400
        minHeight: 300
        height: 300
        maxHeight: 300
    }
}

var vBox = VBox {
    spacing: 10
    content: hBox1, hBox2, imageView ]
    translateX: 10
    translateY: 10
}

Stage {
    title: "JavaFX + Placemaker + Maps"
    width: 420
    height: 410
    scene: Scene {
        content: vBox ]
    }
    resizable: false
    //style: StageStyle.UNDECORATED
}
findPlaces(urlTextBox.rawText);