var map;
var marker_input;
var baseIcon = new GIcon(G_DEFAULT_ICON);
baseIcon.shadow = null;
baseIcon.iconSize = new GSize(48, 48);
baseIcon.shadowSize = new GSize(35, 35);
baseIcon.iconAnchor = new GPoint(24, 24);
baseIcon.infoWindowAnchor = new GPoint(24, 0);
baseIcon.imageMap = [ 0, 0, 48, 0, 48, 48, 0, 48 ];

var cluster_style = [{
        url: '/img/m2.png',
        height: 55,
        width: 56
      }
];

var gmarkers = [];
var places = [];
var htmls = [];
var gm_counter = 0;

function updatePermalink() {
    permalink = document.getElementById("permalinka");
    if (permalink) {
        var z = map.getZoom();
        var decimals = Math.pow(10, Math.floor(z / 3));
        lat = Math.round(map.getCenter().lat() * decimals) / decimals;
        lng = Math.round(map.getCenter().lng() * decimals) / decimals;
        var ll = lat + ',' + lng;
        permalink.href = '?ll=' + ll + '&z=' + z;
        permalink.innerHTML = permalink.href;
    }
}

var zoom_min_here_info = 5;

function countVisible() {
    var count_visible = 0;
    var z = map.getZoom();
    var places_here_tw = [];
    if( z > zoom_min_here_info ){
        for (var i=0; i < gmarkers.length; i++){
            if(map.getBounds().containsLatLng(gmarkers[i].getLatLng())){
                count_visible++;
                places_here_tw.push(places[i].tw.toLowerCase());
            }
        }
        places_here_tw.sort();
        var text = '';
        for (var i=0; i < places_here_tw.length; i++){
            text += '<li><a target="_blank" href="http://twitter.com/'+places_here_tw[i]+'">'+places_here_tw[i]+'</a> ';
        }
        $('#places_here').text(count_visible);
        $('#places_here_ul').html(text);
        $('#here_info').show();
    } else {
        $('#here_info').hide();
        $('#places_here_holder').hide();
    }
}

function cancelSave(){
    map.removeOverlay(marker_input);
}

function saveData() {
    showSaving();
    var tw = $("#tw").val();
    var url = "http://twitter.com/users/show/" + tw + ".json?callback=?";
    $.jsonp({
      "url": url,
      "success": function(data) {
          var latlng = marker_input.getLatLng();
          var lat = latlng.lat();
          var lng = latlng.lng();
          var z = map.getZoom();
          var profile_image_url = data.profile_image_url;
          $.post("/send_data", {
              lat: lat,
              lng: lng,
              z: z,
              tw: tw,
              profile_image_url: profile_image_url
              },
              function (data) {
                if( data.match(/Success/) ){
                    showSuccess(data.replace(/Success. /g,''));
                } else {
                    showError("Some problem saving into datastore. Please try later.");
                }
              }
              );
          var tw_icon = new GIcon(baseIcon);
          tw_icon.image = data.profile_image_url;
          var marker = new GMarker(latlng, {
              icon: tw_icon
          });
          map.addOverlay(marker);
      },
      "error": function(d,msg) {
          showError("Twitter does not return info for user <strong>@"+tw+"</strong>");
      }
    });
    map.removeOverlay(marker_input);
}

function moderateEntry(tw,approve) {
    showSaving();
    $.get("/moderate_entry", { tw: tw, approve: approve},
            function (data) {
                if( data.match(/Success/) ){
                    showSuccess(data.replace(/Success. /g,''));
                } else {
                    showError(data);
                }
            }
    );
}

function saveOnEnter(e) {
    evt = e || window.event;
    var keyPressed = evt.which || evt.keyCode;
    if (keyPressed == 13){
        saveData();
    }
    else {
        return true;
    }
}

function getPlaceTweets(marker){
    var tw = marker.tw;
    if(tw in htmls){
        $('#tw_holder').html(htmls[tw]);
    } else {
        var url = "http://twitter.com/statuses/user_timeline/" + tw + ".json?callback=?";
        $.jsonp({
          "url": url,
          "success": function(data) {
              $('#tw_text').html(ify.clean(data[0].text));
              $('#time_holder').html( '<a target="_blank" href="http://twitter.com/'+tw+'/statuses/'+data[0].id+'/">'+relative_time(data[0].created_at)+'</a>' );
              htmls[tw] = $('#tw_holder').html();
          },
          "error": function(d,msg) {
              showError("Twitter does not return infor for user <strong>@"+tw+"</strong>");
          }
        });
    }
}

function createMarkerPlace(point,icon,data){
    var marker = new GMarker(point, {
        icon: icon
    });
    var html = "<strong>@<a target='_blank' href='/place/"+data.tw+"'>"+data.tw+"</a>:</strong><br/><div id='tw_holder'><div id='tw_text'><img align='middile' src='/img/loading.gif'/> </div><div id='time_holder'></div>";
    if (document.location.search.indexOf('mod=true') > -1){
        html += " <br/><div> <a href='#' onclick='moderateEntry(\""+data.tw+"\",true)'>approve</a> &nbsp;&nbsp;&nbsp; <a href='#' onclick='moderateEntry(\""+data.tw+"\",false)'>remove</a> </div>";
    }
    marker.tw = data.tw;
    gmarkers[gm_counter] = marker;
    GEvent.addListener(marker, "click", function () {
        marker.openInfoWindow(html);
        getPlaceTweets(marker);
    });
    gm_counter++;
}

function initialize_map(){
    if (GBrowserIsCompatible()) {
        var opts = {
            googleBarOptions: {
                style: 'new',
                adsOptions : { 
                    client : 'partner-pub-5986361799601315',
                    channel : 'tweetingplaces'
                }
            }
        };
        map = new GMap2(document.getElementById("main_map"), opts);
        map.setCenter(new GLatLng(45, -30), 3);
        map.setUIToDefault();
        map.enableGoogleBar();
        var minMapScale = 3;
        var maxMapScale = 17; 
        // get array of map types
        var mapTypes = map.getMapTypes(); 
        // overwrite the getMinimumResolution() and getMaximumResolution() methods for each map type
        for (var i = 0; i < mapTypes.length; i++) {
            mapTypes[i].getMinimumResolution = function () {
                return minMapScale;
            };
            mapTypes[i].getMaximumResolution = function () {
                return maxMapScale;
            };
        } 

        // Note: replace this publisher ID with your own.
        var publisherID = 'partner-pub-5986361799601315';
        var adsManagerOptions = {
            maxAdsOnMap : 1,
            style: 'adunit',
            channel: 'tweetingplaces'  
        };
        adsManager = new GAdsManager(map, publisherID, adsManagerOptions);
        adsManager.enable();

        // does processing of JSON file
        var html = [];
        process_it = function (doc) { // parse JSON document
            var data = eval('(' + doc + ')');
            $.getJSON(json_file, function (data) {
                places = data.places;
                for (var i = 0; i < places.length; i++) {
                    var profile_image_url = places[i].profile_image_url;
                    var latlng = new GLatLng(places[i].coord[0], places[i].coord[1]);
                    var tw_icon = new GIcon(baseIcon);
                    tw_icon.image = profile_image_url;
                    createMarkerPlace(latlng,tw_icon,places[i]);
                }
                var markerCluster = new MarkerClusterer(map, gmarkers, {styles: cluster_style});
                countVisible();
            });
        };
        updatePermalink();
        GDownloadUrl("/all.json", process_it);
        GEvent.addListener(map, "moveend", function () {
            updatePermalink();
            countVisible();
        });
        GEvent.addListener(map, "click", function (overlay, latlng) {
            if (latlng) {
                if(marker_input){
                    map.removeOverlay(marker_input);
                };
                marker_input = new GMarker(latlng, {
                    draggable: true
                });
                var html = "<table>" + "<tr><td>@</td> <td><input type='text' onkeypress='saveOnEnter(event)' id='tw'/> </td> </tr>" + "<tr><td></td><td><input type='button' value='Save' onclick='saveData()'/><input type='button' value='Cancel' onclick='cancelSave()'/></td></tr>";
                GEvent.addListener(marker_input, "click", function () {
                    marker_input.openInfoWindow(html);
                    setTimeout("$('#tw').focus();", 250);
                });
                map.addOverlay(marker_input);
                marker_input.openInfoWindow(html);
                setTimeout("$('#tw').focus();", 250);
                GEvent.addListener(marker_input, "dragstart", function() {
                    map.closeInfoWindow();
                });
                GEvent.addListener(marker_input, "dragend", function() {
                    marker_input.openInfoWindow(html);
                    setTimeout("$('#tw').focus();", 250);
                });
            }
        });
        GEvent.addListener(map, "zoomend", function (oldZoom, newZoom) {
            if(marker_input){
                map.removeOverlay(marker_input);
            };
        });

        // if not location specified
        // re-center and zoom to visitor's location determined from IP
        if ( !(document.location.search.indexOf('ll=')>-1) ){
            $.getJSON('http://api.wipmania.com/jsonp?callback=?', function (data) { 
                    map.setCenter(new GLatLng(data.latitude, data.longitude), data.zoom);
            });
        }
    }
}

