// =============================================================================
// (c) 2008 MapJack.com
// Author: Bjorn Moren. bjorn@mapjack.com
// =============================================================================

google.load("maps", "2");    

var _map = null;                     // Satellite map (google.maps.Map2)
var _dotOverlay = null;              // Dots overlay (google.maps.TileLayerOverlay)
var _dotOverlayVisible = true;
var _dotLayer = null
var _avatar = null;                  // Current position (google.maps.Marker)
var _beam = null;
var _beamDrag = null;
var _avatarImages = new Array();     // GIF images that makes up the avatar
var _mapServer = "http://www.mapjack.com/DotsR5/";
var _imageServer = "http://www.mapjack.com/Images/";
var _localMapServer = "file:///C:/Mapjack/Flash/DotsR5/";
var _avatarLat = 0;
var _avatarLon = 0;
var _avatarHeading = 0;
var _beamAngle = 90;
var _markers = new Array();

var _beamLength = 35;
var _canDragMap = true;
var _isDraggingBeam = false;
var _beamDragDist = 10;

var _dotOpacityForSat = [7,7,7,7,7,7,7,5,3,3,3,3,5,4,5,8,10,10,10,10];      // Dot opacity for the zoom levels, 0 - 10
var _dotOpacityForMap = [3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,5,5,5,5];

var _mapEncodeChars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789";
//alert(window.location.host)

// Page loaded, initiate application
function mapLoad()
{
    if (!google.maps.BrowserIsCompatible()) return;
    
    if (location.href.indexOf("file:") == 0) _mapServer = _localMapServer;

	
    var startMapType = 1;
    var startZoomLevel = 17;
//    var startPos = mapDecodePosition("vuhjWXAxeFBA");   // san jose
    var startPos = mapDecodePosition("kEqwTrVsWc7C");   // phuket

    var code = mapReadCookie("JasmineZee");
    if (code && code != "") startPos = mapDecodePosition(code);
    
    _map = new google.maps.Map2(document.getElementById("overviewMap"), {draggableCursor: 'hand', draggingCursor: 'hand'});
    _map.addControl(new google.maps.LargeMapControl());
    _map.addControl(new google.maps.ScaleControl());
    _map.addControl(new google.maps.MapTypeControl());
    _map.addControl(new google.maps.OverviewMapControl());
    _map.enableScrollWheelZoom();
    _map.setCenter(new google.maps.LatLng(startPos.lat, startPos.lon), startZoomLevel);
    if (startMapType == 0) _map.setMapType(google.maps.SATELLITE_MAP);
    else  _map.setMapType(google.maps.NORMAL_MAP);
    _map.setCenter(new google.maps.LatLng(startPos.lat, startPos.lon), startZoomLevel);
	_map.setCenter(new google.maps.LatLng(startPos.lat, startPos.lon), startZoomLevel);
          	_map.addControl(new GLargeMapControl());
			geocoder = new GClientGeocoder();
         
    google.maps.Event.addListener(_map, 'zoomend', zoomEndHandler);
    google.maps.Event.addListener(_map, 'maptypechanged', updateDotOverlay);
    google.maps.Event.addListener(_map, 'mousemove', mapMouseMove);
    google.maps.Event.addListener(_map, 'click', userClick);

    // Avatar marker
    var avatarIcon = new google.maps.Icon();
    avatarIcon.image = _imageServer + "Avatar0.gif";
    avatarIcon.iconSize = new google.maps.Size(18, 39);
    avatarIcon.iconAnchor = new google.maps.Point(9, 34);
    avatarIcon.infoWindowAnchor = new google.maps.Point(5, 1);
    for (var i = 0; i < 8; i++)
    {
        var image = new Image();
        image.src = _imageServer + "Avatar" + i + ".gif";
        _avatarImages[_avatarImages.length] = image;
    }
    _avatar = new google.maps.Marker(new google.maps.LatLng(startPos.lat, startPos.lon), {icon:avatarIcon, draggable:true, bouncy:false, clickable:false});
    google.maps.Event.addListener(_avatar, 'dragstart', avatarDragStartHandler);
    google.maps.Event.addListener(_avatar, 'dragend', avatarDragEndHandler);
    _map.addOverlay(_avatar);
    
    // Beam drag marker
    var beamIcon = new google.maps.Icon();
    beamIcon.image = "Images/BeamDrag.gif";
    beamIcon.iconSize = new google.maps.Size(15, 15);
    beamIcon.iconAnchor = new google.maps.Point(7, 7);
    beamIcon.dragCrossSize = new google.maps.Size(0, 0);
    _beamDrag = new google.maps.Marker(new google.maps.LatLng(startPos.lat, startPos.lon), {icon:beamIcon, draggable:true, bouncy:false, dragCrossMove:false});
    google.maps.Event.addListener(_beamDrag, 'dragstart', beamDragStartHandler);
    google.maps.Event.addListener(_beamDrag, 'drag', beamDragHandler);
    google.maps.Event.addListener(_beamDrag, 'dragend', beamDragEndHandler);
    _map.addOverlay(_beamDrag);
    _beamDrag.hide();
    
    // Add dot overlay and beam
    zoomEndHandler(null, null);
	//lat49App.init(); 
}
/*=========================
	added by: Rey Papellero   reypapz02@gmail.com
===========================*/
function revereseGeo(point)
	{
	
	 geocoder.getLocations(point, function(addresses) {
          if(addresses.Status.code != 200) {
            //reverse geocoder failed to find an address 
			mapCall("showaddress"," "+'');
          }
          else {
            address = addresses.Placemark[0];           
            //document.getElementById("txtaddress").value=address.address;
			mapCall("showaddress",address.address);		
          }
        });
	}
function lat49ad()
	{
		//lat49 add
		//added by reypapz
		var publisherID=173;
		Lat49.initAds(this.publisherID);
		google.maps.Event.addListener(_map, "moveend",eventFired);
		google.maps.Event.addListener(_map,"load",eventFired); 
		
	}

	function eventFired()
	{
		var  _binds=_map.getBounds();
		var center=_binds.getCenter(); 
		var lat=center.lat();
		var lon=center.lng();
		Lat49.updateAdByLatLon("adcontainer",lat,lon,_map.getZoom());
		
	}
// Calls a function in any frame
function mapCall(name)
{
    var appFrames = [];
    mapGetFrames(window.top, appFrames);
    for (var i = 0; i < appFrames.length; i++)
    {
        var func = appFrames[i][name];
        if (func) return func(arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
    }
    return null;    
}

function mapGetFrames(win, arr)
{
    arr.push(parent.frames["content"]);
    arr.push(parent.frames["map"]);
    arr.push(parent.frames["main"].frames["panorama"]);
    return;


    if (win != window.top) arr[arr.length] = win;
    for (var i = 0; i < win.frames.length; i++)
       mapGetFrames(win.frames[i], arr);
}

function beamDragStartHandler()
{
    _isDraggingBeam = true;
}

function beamDragEndHandler()
{
    _beamDrag.hide();
    _isDraggingBeam = false;
}

function beamDragHandler()
{
    //var beamPos = _map.fromLatLngToDivPixel(_beamDrag.getPoint());
    //var beamPos = _map.fromLatLngToDivPixel(_mousePos);
    //var avatarPos = _map.fromLatLngToDivPixel(_avatar.getPoint());
    //var dragAng = 180 * Math.atan2(beamPos.x - avatarPos.x, avatarPos.y - beamPos.y) / Math.PI;
    //if (dragAng < 0) dragAng = 360 + dragAng;

    var beamPos = _beamDrag.getPoint();
    var avatarPos = _avatar.getPoint();
    var dragAng = 180 + 180 * Math.atan2(avatarPos.lng() - beamPos.lng(), avatarPos.lat() - beamPos.lat()) / Math.PI;

    _avatarHeading = dragAng;
    updateBeam();
    updateAvatar();
    
    mapCall("turnTo", _avatarHeading);
}

function mapMouseMove(pos)
{  
    if (_isDraggingBeam || _map.getZoom() <= 12) return;
    var avatarPos = _avatar.getPoint();
    _canDragMap = (avatarPos.distanceFrom(pos) > _beamDragDist)
    if (!_canDragMap)
    {
        _beamDrag.show();
        _beamDrag.setPoint(pos);
    }
    else
    {
        _beamDrag.hide();
    }
}

// Handles user clicks on the map
function userClick(marker, point) 
{
    if (window.event && window.event.shiftKey && window.event.altKey)
    {
        if (point)
        {
            var lat = Math.round(point.lat() * 1000000) / 1000000;
            var lon = Math.round(point.lng() * 1000000) / 1000000;
            window.prompt("Coordinate for the clicked location:", "lat:" + lat + ", lon:" + lon);
        }
        return;
    }
    if (marker) 
    {
        if (marker.viewPoint) mapCall("navigateToEncoded", marker.viewPoint);
        else
        {
            point = marker.getPoint();
            mapNavigateTo(point.lat(), point.lng());
        }
        //if (_map.getZoom() < 14) _map.setZoom(14);
    }
    else 
    {
        mapNavigateTo(point.lat(), point.lng());
    }
}

function updateDotOverlay()
{
    var opacity = 1;
    var zoom = _map.getZoom();
    
    // Show city markers
    /*if (zoom < 10)
    {
        if (_overviewMarkers == null)
        {
            _overviewMarkers = new Array();
            var mIcon = new google.maps.Icon();
            mIcon.image = "Images/Marker.gif";
            mIcon.iconSize = new google.maps.Size(18, 28);
            mIcon.iconAnchor = new google.maps.Point(9, 28);
            for (var i = 0; i < _overviewMarkerCoords.length; i++)
            {
                var marker = new google.maps.Marker(new google.maps.LatLng(_overviewMarkerCoords[i][0], _overviewMarkerCoords[i][1]), 
                    {icon:mIcon, title:_overviewMarkerCoords[i][2]});
                //google.maps.Event.bind(marker, "click", this, userClick); 
                _map.addOverlay(marker);
                _overviewMarkers.push(marker);
            }
        }

    }
    else if (_overviewMarkers != null)
    {
        while (_overviewMarkers.length > 0) _map.removeOverlay(_overviewMarkers.pop());
        _overviewMarkers = null;
    }*/

    // Show dots
    if (zoom > 6)
    {
        if (_map.getCurrentMapType() == google.maps.SATELLITE_MAP)
            opacity = _dotOpacityForSat[zoom - 1] / 10;
        else opacity = _dotOpacityForMap[zoom - 1] / 10;

        //if (_dotOverlay != null) _map.removeOverlay(_dotOverlay);       // Bug in Google Maps -> generates an error
        
        _dotLayer = new google.maps.TileLayer(new google.maps.CopyrightCollection(), 0, 17);
        _dotLayer.getTileUrl = function (a,b)
        {
            return _mapServer + b + "/" + a.x + "/" +       
                b + "_" + a.x + "_" + a.y + ".gif";
        }
        _dotLayer.getOpacity = function () { return opacity; }
        _dotOverlay = new google.maps.TileLayerOverlay(_dotLayer);
        _map.addOverlay(_dotOverlay);
    }
    else if (_dotOverlay != null) _map.removeOverlay(_dotOverlay);
}


// Handles mouse drags of avatar
function zoomEndHandler(oldZoom, newZoom)
{
    updateDotOverlay();
    updateBeam();
    var avatarPos = _avatar.getPoint();
    var pixPos = _map.fromLatLngToDivPixel(avatarPos);
    var offsetPos = _map.fromDivPixelToLatLng(new google.maps.Point(pixPos.x + _beamLength, pixPos.y));
    _beamDragDist = avatarPos.distanceFrom(offsetPos);
}

function showDots(show)
{
    if (!_dotOverlay) return false;
    if (show) _dotOverlay.show(); 
    else _dotOverlay.hide();
    return true;
}

function updateMap(lat, lon, heading, viewAngle)
{
    if (!_avatar || _isDraggingBeam) return false;

    _avatarLat = lat;
    _avatarLon = lon;
    _avatarHeading = heading;
    _beamAngle = viewAngle;
    
    updateAvatar();
    updateBeam();
    return true;
}

// Called by the panorama frame when position or heading has changed
function updateAvatar()
{
    if (!_avatar) return;
    var point = new google.maps.LatLng(_avatarLat, _avatarLon);
    _avatar.setPoint(point);
    _map.savePosition(point);
    _avatar.setImage(_avatarImages[Math.round(_avatarHeading / 45) % 8].src);
    panVisible(_avatar);
	revereseGeo(point);
}

function updateBeam()
{
    if (_avatarLat == 0 && _avatarLon == 0) return;

    if (_beam) _map.removeOverlay(_beam);
    _beam = null;
    if (_map.getZoom() <= 12) return;

    var roundNess = parseInt(_beamAngle / 10);
    if (roundNess < 2) roundNess = 2;
    var center = _map.fromLatLngToDivPixel(_avatar.getPoint());
    var beamAngle = _beamAngle * Math.PI / 180;
    var heading = _avatarHeading * Math.PI / 180;
    var points = new Array();
    points[points.length] = _avatar.getPoint();
    for (var i = 0; i <= roundNess; i++)
    {
        var ang = heading + (beamAngle * i / roundNess) - (beamAngle / 2);
        var x = Math.sin(ang) * _beamLength;
        var y = -Math.cos(ang) * _beamLength;
        var p = _map.fromDivPixelToLatLng(new google.maps.Point(x + center.x, y + center.y));
        points[points.length] = p;
    }
    points[points.length] = points[0];

    _beam = new google.maps.Polygon(points, "#6666FF", 1, 1, "#AAAAFF", 0.5);
    _map.addOverlay(_beam);
}

// Calls the panorama application to move to a coordinate
function mapNavigateTo(lat, lon)
{
    mapCall("navigateTo", lat, lon, true);
}

// Handles mouse drags of avatar
function avatarDragStartHandler()
{
    if (_beam) _map.removeOverlay(_beam);
    _beam = null;
}

// Handles mouse drags of avatar
function avatarDragEndHandler()
{
    var point = _avatar.getPoint();
    mapNavigateTo(point.lat(), point.lng());
}


// Makes sure a position is visible on the map
function panVisible(pos)
{
    var bounds = _map.getBounds();
    var size = bounds.toSpan();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();
    sw = new google.maps.LatLng(sw.lat() + size.lat()/10, sw.lng() + size.lng()/10);
    ne = new google.maps.LatLng(ne.lat() - size.lat()/10, ne.lng() - size.lng()/5);
    bounds = new google.maps.LatLngBounds(sw, ne);
    if (!bounds.contains(pos.getPoint()))
        _map.panTo(pos.getPoint());    
}

function addMarker(lat, lon, index, viewPoint, toolTip)
{
    if (!_map) return false;
    var mIcon = new google.maps.Icon();
    mIcon.image = "Images/Marker" + index + ".gif";
    mIcon.iconSize = new google.maps.Size(23, 16);
    mIcon.iconAnchor = new google.maps.Point(0, 16);
    mIcon.infoWindowAnchor = new google.maps.Point(5, 1);
    var marker = new google.maps.Marker(new google.maps.LatLng(lat, lon), {icon:mIcon, title:toolTip});
    marker.viewPoint = viewPoint;
    _map.addOverlay(marker);
    _markers.push(marker);
    return true;
}

function zoomPanOnMarkers()
{
    if (!_map) return false;
    var bounds = new google.maps.LatLngBounds();
    for (var i = 0; i < _markers.length; i++) bounds.extend(_markers[i].getPoint());
    var zoom = _map.getBoundsZoomLevel(bounds);
    if (zoom > 16) zoom = 16; 
    _map.setZoom(zoom);
    _map.setCenter(bounds.getCenter());
    return true;
}

function removeMarkers()
{
    if (!_map) return false;
    while (_markers.length > 0) _map.removeOverlay(_markers.pop());
    return true;
}

// Reads a cookie from the browser
function mapReadCookie(name)
{
    var cookieValue = "";
    var search = name + "=";
    if(document.cookie.length > 0)
    { 
        offset = document.cookie.indexOf(search);
        if (offset != -1)
        { 
            offset += search.length;
            end = document.cookie.indexOf(";", offset);
            if (end == -1) end = document.cookie.length;
            cookieValue = unescape(document.cookie.substring(offset, end))
        }
    }
    return cookieValue;
}

function mapDecodePosition(code)
{
    if (code == null || code.length < 10) return null;
	var result = new Object();
	
	var latVal = mapDecodeInt(code.substr(0, 5));
	result.lat = (latVal / 1000000.0) - 180.0;

	var lonVal = mapDecodeInt(code.substr(5, 5));
	result.lon = (lonVal / 1000000.0) - 180.0;

	return result;
}

function mapDecodeInt(code)
{
	var result = 0;
	for (var i = code.length - 1; i >= 0; i--)
	{
		var charNo = _mapEncodeChars.indexOf(code.substr(i, 1));
		if (charNo < 0 || charNo >= _mapEncodeChars.length) return 0;
		result = result * _mapEncodeChars.length + charNo;
	}
	return result;
} 

