/**
 * $RCSfile: map.js,v $
 * ----------------------------------------------------------------------
 * Author      : byforce
 * Date        : 2009. 08. 29
 * Copyright   : Copyright (c) 2007-2009 nalbam.com. All Rights Reserved.
 * Description :
 * Modify      :
 */

var isDebug = false;

var geo    = null;
var gmap1  = null;
var photos = [];

var lat   = 37.566536;
var lng   = 126.977969;
var zoom  = 4;
var user  = "";
var query = "";

Event.observe(window, 'load', function () {
    initPage();
});

Event.observe(window, 'unload', function () {
    GUnload();
});

function initPage() {
	if (gmap1 != null) {
		return;
	}

	// Google map
	gmap1 = new GMap2(document.getElementById("gmap1"));

	var customUI = gmap1.getDefaultUI();
	var point = new GLatLng(lat, lng);

	gmap1.setUI(customUI);
	gmap1.setCenter(point, zoom);

	if (iPhone == '') {
		GOverviewMapControl = new GOverviewMapControl(new GSize(200, 150));
		gmap1.addControl(GOverviewMapControl);
	}

	// geo
	geo = new GClientGeocoder();

	loadBounds();

	// gmap1 moveend
	GEvent.addListener(gmap1, "moveend", function () {
		loadBounds();
	});

	// gmap1 zoomend
	GEvent.addListener(gmap1, "zoomend", function () {
		removeTrack();

		zoom = gmap1.getZoom();
		loadBounds();
	});

	if (query != "") {
		search();
	}
}

function loadBounds() {
    var bounds = gmap1.getBounds();
    var point_sw = bounds.getSouthWest();
    var point_ne = bounds.getNorthEast();

    var url = "/map_imgs.php?zoom=" + zoom;
    url += "&swlat=" + point_sw.lat();
    url += "&swlng=" + point_sw.lng();
    url += "&nelat=" + point_ne.lat();
    url += "&nelng=" + point_ne.lng();
    if (user != "") {
        url += "&user=" + user;
    }

    new Ajax.Request(url, {
        method: 'get',
        onSuccess: function (transport) {
            var json = transport.responseText.evalJSON(true);
            results = json.results;

            if (results.length > 0) {
                for (var i = 0; i < results.length; i++) {
                    addMarker(results[i]);
                }
            }
        }
    });

    var point = gmap1.getCenter();
    geo.getLocations(point, setLocations);
}

function addMarker(img) {
    if (checkPhoto(img) == true) {
        return;
    }

    var gicon = new GIcon(G_DEFAULT_ICON);
    gicon.image  = img.thumbnail;
    gicon.shadow = "";

	if (eval(img.readcnt) > 30) {
		gicon.iconSize = new GSize(50, 50);
		gicon.imageMap = [0, 0, 50, 0, 50, 50, 0, 50];
		gicon.iconAnchor = new GPoint(25, 25);
	} else {
		gicon.iconSize = new GSize(30, 30);
		gicon.imageMap = [0, 0, 30, 0, 30, 30, 0, 30];
		gicon.iconAnchor = new GPoint(15, 15);
	}

    var markerOptions = {
        icon: gicon
    };

    var point = new GLatLng(img.lat, img.lng);
    var marker = new GMarker(point, markerOptions);

    var content = "";
    content += "<div style='width:410px;'>";
    content += " <div style='width:80px; float: left;'>";
    content += "  <a href='/" + img.hcode + "' target='_blank'><img src='" + img.thumbnail + "' alt='' width='75' height='75' align='left'></a> ";
    content += " </div>";
    content += " <div style='width:320px; float: left;'>";
    content += "  <a href='/map/" + img.twid + "'><b>" + img.twid + "</b></a><br/>" + img.text;
    content += "  <div class='date'> " + img.regdate + " " + img.dates + "</div>";
    content += " </div>";
    content += "</div>";

    // marker click
    GEvent.addListener(marker, "click", function () {
        gmap1.openInfoWindowHtml(point, content);
    });

    gmap1.addOverlay(marker);
}

function checkPhoto(img) {
    var hasPhoto = false;

    var range = getRange();

    for (var i = 0; i < photos.length; i++) {
        if (photos[i].hcode == img.hcode) {
            hasPhoto = true;
            break;
        }
        var lat_ = Math.abs(Math.abs(photos[i].lat) - Math.abs(img.lat));
        var lng_ = Math.abs(Math.abs(photos[i].lng) - Math.abs(img.lng));
        if (lat_ < range && lng_ < range) {
            hasPhoto = true;
            break;
        }
    }

    if (hasPhoto == false) {
        photos[photos.length] = img;
    }

    return hasPhoto;
}

function getRange() {
    if (zoom < 2) {
        return 20;
    } else if (zoom == 2) {
        return 15;
    } else if (zoom == 3) {
        return 10;
    } else if (zoom == 4) {
        return 4;
    } else if (zoom == 5) {
        return 2.1;
    } else if (zoom == 6) {
        return 1.1;
    } else if (zoom == 7) {
        return 0.6;
    } else if (zoom == 8) {
        return 0.27;
    } else if (zoom == 9) {
        return 0.13;
    } else if (zoom == 10) {
        return 0.063;
    } else if (zoom == 11) {
        return 0.033;
    } else if (zoom == 12) {
        return 0.017;
    } else if (zoom == 13) {
        return 0.009;
    } else if (zoom == 14) {
        return 0.004;
    } else if (zoom >= 15) {
        return 0.002;
    }
    return 100;
}

function removeTrack() {
    try {
        photos.length = 0;
        gmap1.clearOverlays();
    }
    catch (e) {}
}

function setPoint(lat, lng) {
    var point = new GLatLng(lat, lng);
    gmap1.setCenter(point);

    geo.getLocations(point, setLocations);
}

function search() {
    var search = $("gsearch").value;
    $("gmessage").update("");

    geo.getLocations(search, function (result) {
        if (result.Status.code == G_GEO_SUCCESS) {
            if (result.Placemark.length > 0) {
                for (var i = 0; i < result.Placemark.length; i++) {
                    var p = result.Placemark[i].Point.coordinates;
                    $("gmessage").insert("<div>" + (i + 1) + ". <a href='javascript:setPoint(" + p[1] + ", " + p[0] + ")'>" + result.Placemark[i].address + "</a></div>");
                }
                var p = result.Placemark[0].Point.coordinates;
                setPoint(p[1], p[0]);
            }
        } else {
            var reason = "Code " + result.Status.code;
            $("gmessage").update("Can not found! [" + search + "] : " + reason);
        }
    });
}

function setLocations(result) {
    try {
        var place = result.Placemark[0];
        $("gaddress").update(place.address);
    }
    catch (e) {}
}
