(function() {
    var homes = {
        austin: {
            hq:  { lat:  30.266949, long: -97.738961 },
            map: { lat:  30.269000, long: -97.748000 }
        },
        sf: {
            hq:  { lat:  37.774760, long:-122.410324 },
            map: { lat:  37.775000, long:-122.410000 }
        }
    };
    var home = 'austin'; // This can be either 'sf' or 'austin'

    var marker_half = 'marker_half.png';
    var marker_full = 'marker_full.png';

    var mission_minimum = 2; // How many simultaneous checkins before it's a mission
    var max_age = 86400; // How old a mission can be before it's auto-expired

    var map_styles = [
        { featureType: "administrative.neighborhood", elementType: "labels",stylers: [
                { visibility:'off' }
        ] },
        { featureType: "landscape", elementType: "geometry", stylers: [
                { hue:"#aa4422", saturation:25 }
        ] },
        { featureType: "poi", elementType: "labels", stylers: [
                { visibility:'off' }
        ] },
        { featureType: "poi.business", elementType: "geometry", stylers: [
                { hue:"#996644", saturation:25, lightness:40 }
        ] },
        { featureType: "poi.park", elementType: "geometry", stylers: [
                { hue:"#aa4422", saturation:25, lightness:40 }
        ] },
        { featureType: "poi.school", elementType: "all", stylers: [
                { hue:"#aa4422", saturation:30, lightness:50 }
        ] },
        { featureType: "poi.sports_complex", elementType: "all", stylers: [
                { hue:"#aa4422", saturation:30, lightness:50 }
        ] },
        { featureType: "road", elementType: "all", stylers: [
                { saturation:-100 }
        ] },
        { featureType: "transit", elementType: "all", stylers: [
                { visibility:'off' }
        ] },
        { featureType: "water", elementType: "geometry", stylers: [
                    { hue:"#993311", saturation:5, lightness:10 }
        ] },
    ];

    var map_center;
    var map_hq;

    var compass_points = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'];

    var bounds, map;
    var users = {};
    var venues = {};

    var cursor = 0;
    function decay() {
        var now = Math.round((new Date()).getTime() / 1000);
        $.each(venues, function(i, venue) {
            var new_checkins = [];
            $.each(venue.checkins, function(j, checkin) {
                if (checkin.timestamp < now - max_age) {
                    var user = users[checkin.user_id];
                } else {
                    new_checkins.push(checkin);
                }
            });
            venue.checkins = new_checkins;
            venues[i] = venue;
            venue_update(venue.id);
        });
        
    }

    setInterval(function() {
        decay();
    }, 15000);

    function venue_update(venue_id) {
        var venue = venues[venue_id];
        var checkins = venue.checkins;
        if (checkins.length > 0) {
            if (checkins.length >= mission_minimum) {
                venue.marker.setIcon(marker_full);
                venue.marker.title = venue.name + ' (' + checkins.length + ' checkins)';
            } else {
                venue.marker.setIcon(marker_half);
                if (checkins.length > 1) {
                    venue.marker.title = venue.name + ' (' + checkins.length + ' checkins)';
                } else {
                    venue.marker.title = venue.name + ' (1 checkin)';
                }
                if (venue.name == $('#mission_info .venue_name').html()) {
//                    $('#mission_info').hide();
                }
            }
            venues[venue_id] = venue;
        } else {
            venue.marker.setMap(null);
            delete venue.marker;
            delete venues[venue_id];
        }
    }

    function update() {
        var url = 'http://creative360.com/sxswmissions/ajax.php'
                        + '?cursor=' + cursor + '&callback=?';
        $.ajax({
            url:      url,
            cache:    false,
            dataType: 'json',
            success:  function(data) {
                var run_minimum = mission_minimum;
                $.each(data, function(idx, item) {
                    var now = Math.round((new Date()).getTime() / 1000);
                    var marker;
                    var point = new google.maps.LatLng(item.lat, item.long);
                    if (item.timestamp >= now - max_age &&
                                    bounds.contains(point)) {
                        if (item.timestamp > cursor) {
                            cursor = item.timestamp + 1;
                        }
                        if (users[item.user_id] !== undefined) {
                            var old_venue_id = users[item.user_id].last_venue;
                            var old_venue = venues[old_venue_id];
                            var new_checkins = [];
                            $.each(old_venue.checkins, function(idx, old_checkin) {
                                if (old_checkin.user_id != item.user_id) {
                                    new_checkins.push(old_checkin);
                                }
                            });
                            old_venue.checkins = new_checkins;
                            venues[old_venue_id] = old_venue;
                            venue_update(old_venue_id);
                        }

                        users[item.user_id] = {
                            name:       item.user_name,
                            img:        item.user_img,
                            last_venue: item.venue_id
                        };

                        var venue;
                        if (venues[item.venue_id] !== undefined) {
                            venue = venues[item.venue_id];
                            marker = venue.marker;
                        } else {
                            venue = {
                                id:       item.venue_id,
                                name:     item.venue_name,
                                lat:      item.lat,
                                long:     item.long,
                                address:  item.venue_address,
                                checkins: [],
                            };
                            var markerOpts = {
                                flat:      true,
                                map:       map,
                                position:  point,
                            };
                            marker = new google.maps.Marker(markerOpts);
                            marker.setAnimation(google.maps.Animation.DROP);
                        }
                        venue.checkins.push({
                            timestamp: item.timestamp,
                            user_id:   item.user_id,
                        });
                        if (venue.checkins.length >= run_minimum) {
                            run_minimum = venue.checkins.length;
                            if ($('#mission_info .venue_name').html() != venue.name) {
                                var mission_pt = new google.maps.LatLng(venue.lat, venue.long);
                                var cardinal_distance = google.maps.geometry.spherical.computeDistanceBetween(
                                                                map_hq, mission_pt, 3963.19);
                                var cardinal_heading = google.maps.geometry.spherical.computeHeading(
                                                                map_hq, mission_pt);
                                cardinal_distance = Math.round(cardinal_distance * 10) / 10;
                                if (cardinal_heading < 0) {
                                    cardinal_heading = 360 + cardinal_heading;
                                }
                                var heading_box = Math.floor(cardinal_heading / 22.5);
                                var compass_point = compass_points[heading_box];
                                $('#mission_info .venue_name').html(venue.name);
                                $('#mission_info .venue_address').html(venue.address);
                                $('#mission_info .venue_cardinal').html(cardinal_distance + ' miles ' + compass_point);
                                $('#mission_info').stop(true)
                                                  .show()
                                                  .animate({backgroundColor: '#ff0000'}, 200)
                                                  .delay(2000)
                                                  .animate({backgroundColor: '#aa4422'}, 1000);
                            }
                            marker.setIcon(marker_full);
                            marker.title = venue.name
                                 + ' (' + venue.checkins.length + ' checkins)';
                        } else {
                            marker.setIcon(marker_half);
                            if (venue.checkins.length > 1) {
                                marker.title = item.venue_name + ' (' + venue.checkins.length + ' checkins)';
                            } else {
                                marker.title = item.venue_name + ' (1 checkin)';
                            }
                        }
                        venue.marker = marker;
                        venues[item.venue_id] = venue;
                        $('#checkin_info').html('An ambassador just checked in at <span class="venue">' + item.venue_name + '</span>')
                                          .show().delay(4000).fadeOut(1000);
                    }
                });
                setTimeout(function() {
                    update();
                }, 5000);
            }
        });
    }

    $(document).ready(function() {

        map_center = new google.maps.LatLng(homes[home].map.lat, homes[home].map.long);
        map_hq = new google.maps.LatLng(homes[home].hq.lat, homes[home].hq.long);

        var opts = {
            center:                 map_center,
            disableDefaultUI:       true,
            draggable:              false,
            disableDoubleClickZoom: true,
            mapTypeId:              google.maps.MapTypeId.ROADMAP,
            mapTypeControlOptions:  {
                mapTypeIds: [google.maps.MapTypeId.ROADMAP, 'sfembassy']
            },
            scrollwheel:            false,
            zoom:                   15,
        };
        map = new google.maps.Map(document.getElementById("map_canvas"), opts);

        var sfemMapType = new google.maps.StyledMapType(map_styles, {
            name: 'sfembassy'
        });

        map.mapTypes.set('sfembassy', sfemMapType);
        map.setMapTypeId('sfembassy');

        var markerOpts = {
            map:       map,
            position:  map_hq,
        };
        new google.maps.Marker(markerOpts);

        google.maps.event.addListener(map, 'bounds_changed', function() {
            if (bounds === undefined) {
                bounds = map.getBounds();
                update();
            }
        });
    });
})($);

