var findSanta = {
    init: function(){
        this.streetview.init();
    },
    streetview: {
        pano: null,
        latlng: null,
        pov:null,
        startLat:51.516109,
        startLng:-0.142315,
        streetLat:51.515995,
        streetLng:-0.142301,
        santaLat:51.515512,
        santaLng:-0.142175,
        currentLat:51.516109,
        currentLng:-0.142315,
        currentYaw:165.37,
        init: function(){
            $('body').css({overflow:'hidden'});
            var params = {
                allowScriptAccess: "always",
                scale: "noscale",
                menu: "false",
                wmode:"opaque"
            };
            swfobject.embedSWF("/flash/radar.swf", "radarContainer", "181", "246", "9.0.124","", {xpos:20,ypos:10}, {wmode:"transparent"}, {id:"radar"});
            swfobject.embedSWF("/flash/pano.swf", "panoContainer", "100%", "100%", "9.0.124","", {config_url:"/xml/config.xml"}, params, {id:"pano"});
            findSanta.streetview.initHeight();
            this.latlng = new GLatLng(this.startLat,this.startLng);
            this.pov = {yaw:165.37,pitch:12,zoom:0};
            this.pano = new GStreetviewPanorama($('#streetContainer').get(0), { latlng:this.latlng, pov:this.pov, features:{ userPhotos:false } });
            $(window).resize(function(){
                findSanta.streetview.initHeight();
                findSanta.streetview.pano.checkResize();
            });
            GEvent.addListener(this.pano, 'error', this.handleError);
            GEvent.addListener(this.pano, 'initialized', this.povChanged);
            GEvent.addListener(this.pano, "yawchanged", this.yawChanged);

            var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
            if (is_chrome) {
                $('#radarOverlay').prepend('<iframe id="chromeFixRadar" src="/transparent.html" width="'+($('#radarOverlay').width()+5)+'" height="'+($('#radar').height()+10)+'" style="position:absolute; background:#333; border:3px solid #fff; top:-10px; right:-5px;"></iframe>');
                $('#panoOverlay').prepend('<iframe id="chromeFixPano" src="/transparent.html" width="'+$('#panoOverlay').width()+'" height="'+$('#panoOverlay').height()+'" style="position:absolute; top:0; left:0;"></iframe>');
            }
            
        },
        initHeight: function(){
            $('#streetContainer, #streetOverlay, #panoContainer, #panoOverlay, #chromeFixPano').height($(window).height()).width($(window).width());
        },
        povChanged: function(location){
            if (location.lat == findSanta.streetview.streetLat && location.lng == findSanta.streetview.streetLng){
                $("#pano")[0].setStartPoint(0);
                $('#streetOverlay object, #streetOverlay').css({zIndex:1});
                $('#panoOverlay object, #panoOverlay').css({zIndex:2});
                findSanta.streetview.backStreet();
            } else if (location.lat == findSanta.streetview.santaLat && location.lng == findSanta.streetview.santaLng) {
                $("#pano")[0].setStartPoint(1);
                $('#streetOverlay object, #streetOverlay').css({zIndex:1});
                $('#panoOverlay object, #panoOverlay').css({zIndex:2});
                findSanta.streetview.enterStreet();
            } else {
                findSanta.streetview.setRadar(location.lat, location.lng, null);
            }
        },
        yawChanged: function(yaw){
            findSanta.streetview.setRadar(null, null, yaw);
        },
        findDistance: function(lat,lng){
            var R = 6371; // km
            var dLat = (lat-findSanta.streetview.santaLat).toRad();
            var dLon = (lng-findSanta.streetview.santaLng).toRad();
            var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                    Math.cos(findSanta.streetview.santaLat.toRad()) * Math.cos(lat.toRad()) *
                    Math.sin(dLon/2) * Math.sin(dLon/2);
            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            var d = R * c;
            return d;
        },
        findBearing: function(lat,lng){
            var dLon = (lng-findSanta.streetview.santaLng).toRad();
            var y = Math.sin(dLon) * Math.cos(lat);
            var x = Math.cos(findSanta.streetview.santaLat)*Math.sin(lat) -
                     Math.sin(findSanta.streetview.santaLat)*Math.cos(lat)*Math.cos(dLon);
            var brng = Math.atan2(y, x).toBrng();
            return brng;
        },
        setRadar: function(lat, lng, yaw){
            if (null == lat) lat = findSanta.streetview.currentLat;
            else findSanta.streetview.currentLat = lat;
            if (null == lng) lng = findSanta.streetview.currentLng;
            else findSanta.streetview.currentLng = lng;
            if (null == yaw) yaw = findSanta.streetview.currentYaw;
            else findSanta.streetview.currentYaw = yaw;
            distance = findSanta.streetview.findDistance(lat, lng);
            //bearing = findSanta.streetview.findBearing(lat, lng);
            yaw = (90-yaw).toRad();
            var d = distance;
            var x = Math.cos(yaw)*d;
            var y = Math.sin(yaw)*d;
            y = y*300;
            x = x*300;
            $("#radar")[0].setLocation(x,y);
        },
        handleError: function(errorCode){
            if(errorCode == 603) {
                alert("Error: Flash doesn't appear to be supported by your browser");
                return;
            }
        },
        preloaded: function(){
            $('.addthis_button').css({zIndex:3});
            $('#radarOverlay').css({zIndex:3});
            $('#streetOverlay object, #streetOverlay').css({zIndex:2});
            $('#panoOverlay object, #panoOverlay').css({zIndex:1});
        },
        preloadedRadar: function(){
            findSanta.streetview.setRadar(findSanta.streetview.startLat,findSanta.streetview.startLng, null);
        },
        exitStreet: function(dir){
            if (dir == 'in') this.pano.setLocationAndPOV(this.latlng, this.pov);
            else this.pano.setLocationAndPOV(this.latlng, {yaw:354,pitch:12,zoom:0});
            $('#streetOverlay object, #streetOverlay').css({zIndex:2});
            $('#panoOverlay object, #panoOverlay').css({zIndex:1});
        },
        enterStreet: function(){
            $("#pano")[0].setBlur();
            $("#radar")[0].setLocation(0,0);
            $("#radarOverlay object, #radarOverlay").css({zIndex:1});
            $("#radarFoundSanta").show();
        },
        backStreet: function(){
            $("#pano")[0].setBlur();
            $("#radar")[0].setLocation(0,-10);
            $('#radarOverlay object, #radarOverlay').css({zIndex:3});
            $("#radarFoundSanta").hide();
        }
    }
};

$(document).ready(function(){
    findSanta.init();
});

function preloaded(){findSanta.streetview.preloaded()}
function preloadedRadar(){findSanta.streetview.preloadedRadar()}
function exitStreet(dir){findSanta.streetview.exitStreet(dir)}
function enterStreet(){findSanta.streetview.enterStreet()}
function backStreet(){findSanta.streetview.backStreet()}

Number.prototype.toRad = function() {  // convert degrees to radians
    return this * Math.PI / 180;
}

Number.prototype.toDeg = function() {  // convert radians to degrees (signed)
    return this * 180 / Math.PI;
}

Number.prototype.toBrng = function() {  // convert radians to degrees (as bearing: 0...360)
    return (this.toDeg()+360) % 360;
}
