//<![CDATA[
var map;
var pano,pano_c;
var clicked_marker;
var flg = false;
var mk_flg = false;
var latlng,guy_latlng;
var guy_marker;
var streetOverray;
var cameraSetted = true;
var guyIcon;
var lastestX;

function startMap(lat,lng,zoom) {

    map = new GMap2(document.getElementById("map"));

    if( lat == 0 ){
        latlng = new GLatLng(35.658517, 139.745493);
        map.setCenter(latlng, 5);
    }else{
        latlng = new GLatLng(lat, lng);
        map.setCenter(latlng, zoom);
    }

    map.addControl(new GMapTypeControl());
    map.addControl(new GLargeMapControl());

    var maptypes = map.getMapTypes();
    for( var i=0;i<maptypes.length;i++ ){
        maptypes[i].getMinimumResolution = function(){
            return 0;
        }
        maptypes[i].getMaximumResolution = function(){
            return 20;
        }
    }

    guyIcon = new GIcon();
    guyIcon.transparent = "http://maps.google.com/intl/en_us/mapfiles/cb/man-pick.png";
/*
    guyIcon.imageMap = [
      26,13, 30,14, 32,28, 27,28, 28,36, 18,35, 18,27, 16,26,
      16,20, 16,14, 19,13, 22,8
    ];
*/
    guyIcon.iconSize = new GSize(49, 52);
    guyIcon.iconAnchor = new GPoint(25, 35);
    guyIcon.infoWindowAnchor = new GPoint(25, 5);
    guyIcon.shadow = null;

    setDefaultMarker(lat,lng,'');
    setPosition(lat,lng,zoom);

}

function setDefaultMarker(lat,lng,msg){
    var markerIcon = new GIcon();

    markerIcon.image = "http://www.google.com/mapfiles/dd-start.png";
    markerIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    markerIcon.iconSize = new GSize(20,34);
    markerIcon.shadowSize = new GSize(37,34);
    markerIcon.iconAnchor = new GPoint(0,34);
    markerIcon.infoWindowAnchor = new GPoint(9,4);
    var point = new GLatLng(lat,lng);

    var marker = new GMarker(point,{icon:markerIcon});

    map.addOverlay(marker);

    if( msg.length > 0 ){
        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(msg);
        });
    }
}

function setPosition(lat,lng,zoom){
    latlng = new GLatLng(lat,lng);

    map.setCenter(latlng, zoom);

    guy_marker = new GMarker(latlng,{ icon: guyIcon , draggable:true , bouncy:true , bounceGravity:0.5 });
    streetOverray = new GStreetviewOverlay();
    map.addOverlay(streetOverray);
    map.addOverlay(guy_marker);

    pano_c = new GStreetviewClient();
    pano = new GStreetviewPanorama(document.getElementById("pano"));

    pano_c.getNearestPanorama(latlng,init);

    GEvent.addListener(guy_marker, "dragstart", function() {
        lastestX = map.fromLatLngToContainerPixel(guy_marker.getLatLng()).x;
        iconsrc = "http://maps.google.co.jp/intl/ja_jp/mapfiles/cb/man_fly_left.png";
        guy_marker.setImage(iconsrc);
    });

    GEvent.addListener(guy_marker, "drag", function() {
        guy_marker.closeInfoWindow();
        var currentX;
        latlng = guy_marker.getLatLng();
        currentX = map.fromLatLngToContainerPixel(latlng).x;
        if(currentX != lastestX){
            iconsrc = (currentX > lastestX) ? "http://maps.google.co.jp/intl/ja_jp/mapfiles/cb/man_fly_right.png" : "http://maps.google.co.jp/intl/ja_jp/mapfiles/cb/man_fly_left.png";
            guy_marker.setImage(iconsrc);
            lastestX = currentX;
        }
      });

    GEvent.addListener(guy_marker, "dragend", function() {
        guy_marker.setImage(rebuildGUY(pano.getPOV().yaw));
        latlng = guy_marker.getLatLng();
        pano_c.getNearestPanorama(latlng,renderer);
    });

    GEvent.addListener(pano, "yawchanged", function(yaw) {
        guy_marker.setImage(rebuildGUY(yaw));
    });

//    GEvent.addListener(pano, "initialized", panoramaInitialized);

}

function rebuildGUY(yaw){
    var GUY_NUM_ICONS = 16;
    var GUY_ANGULAR_RES = 360/GUY_NUM_ICONS;
    if (yaw < 0) {
      yaw += 360;
    }
    guyImageNum = Math.round(yaw/GUY_ANGULAR_RES) % GUY_NUM_ICONS;

    guyImageUrl = "http://maps.google.com/intl/en_us/mapfiles/cb/man_arrow-" + guyImageNum + ".png";
    return guyImageUrl;
}

function panoramaInitialized(loc){
    pano_c.getNearestPanorama(loc.latlng,renderer);
}

function init(data){

    if(data.code == 600){
        guy_marker.openInfoWindowHtml("<p>この近くにはストリートビューがありません。</p><p style='font-size:9pt'>青い道路にこのアイコンをドラッグしてください。</p>");
        return false;
    }else if(data.code == 500){
        return false;
    }else if(data.code == 200){
        var yaw = getHoui(data.location.latlng, latlng);
        pano.setLocationAndPOV(latlng, {yaw: yaw, pitch: -27, zoom: 0});
        renderer(data);
    }
}

function renderer(data){

    if(data.code == 600){
        guy_marker.openInfoWindowHtml("<p>この近くにはストリートビューがありません。</p><p style='font-size:9pt'>青い道路にこのアイコンをドラッグしてください。</p>");
        return false;
    }else if(data.code == 500){
        alert("サーバーエラーです。");var manPoint = new GLatLng;
        return false;
    }else if(data.code == 200){
        var newpoint = data.location.latlng;
        pano.setLocationAndPOV(newpoint);
        map.panTo(newpoint);
        guy_marker.setLatLng(newpoint);
    }
}

function getHoui( from, to ) {
    var from_x = from.x * Math.PI / 180;
    var from_y = from.y * Math.PI / 180;
    var to_x = to.x * Math.PI / 180;
    var to_y = to.y * Math.PI / 180;

    var ram = to_x - from_x;

    var deg = Math.sin(from_y) * Math.sin(to_y) + Math.cos(from_y) * Math.cos(to_y) * Math.cos(ram);

    var sig;
    if( deg == -1.0 ){
        sig = Math.PI;
    }else if( deg == 1.0 ){
        sig = 0;
    }else{
        sig = Math.atan(-deg / Math.sqrt(-deg * deg + 1)) + Math.PI / 2;
    }

    var ssig = Math.sin(sig);

    if( ssig == 0 ){return 0}
    else{
        var xx = Math.cos(to_y) * Math.sin(ram) / ssig;

        if( -xx * xx + 1 < 0 ){
            if( Math.sin(to_x - from_x) > 0 ){
                return 90;
            }else{
                return 270;
            }
        }else if( Math.sqrt( -xx * xx + 1 ) == 0 ){
            if( Math.sin(to_x - from_x) > 0 ){
                return 90;
            }else{
                return 270;
            }
        }else{
            var houi = Math.atan(xx / Math.sqrt(-xx * xx + 1));

            if( 0 > Math.cos(from_y) * Math.sin(to_y) - Math.sin(from_y) * Math.cos(to_y) * Math.cos(ram) ){
                houi = Math.PI - houi;
            }
            houi = houi * 180 / Math.PI;
           if( houi < 0 ){houi+=360}
           return Math.round(houi);
        }
    }
}
//]]>


