var area_lng = 0;
var area_lat = 0;

var locations = new Array();
var icons = new Array();
var init_lat = 0;
var init_lon = 0;
var locations_num = 0;
var icons_over = new Array();

var loc_photos = new Array();
var loc_photo_id = 0;
loc_photos[-1] = new Array();


var map = null;
var geocoder = null;

var current_zoom = 0;
var icon_fav = new GIcon();
//var cl = new Array();
icon_fav.image = "/images/gmap/mm_20_green.png";
icon_fav.shadow = "/images/gmap/mm_20_shadow.png";
icon_fav.iconSize = new GSize(12, 20);
icon_fav.shadowSize = new GSize(22, 20);
icon_fav.iconAnchor = new GPoint(6, 20);
icon_fav.infoWindowAnchor = new GPoint(0, 0);

var icon_new = new GIcon();
icon_new.image = "/images/gmap/mm_20_yellow.png";
icon_new.shadow = "/images/gmap/mm_20_shadow.png";
icon_new.iconSize = new GSize(12, 20);
icon_new.shadowSize = new GSize(22, 20);
icon_new.iconAnchor = new GPoint(6, 20);
icon_new.infoWindowAnchor = new GPoint(0, 0);

// this one is used in image loader
var skip_checker = true;

var current_loc = -1;
var trip_line;
var marker = new Array();
var points = new Array();

var undo = new Array();
var undo_pointer = -1;

// arrow icon
var arrowIcon = new GIcon();
arrowIcon.iconSize = new GSize(24,24);
arrowIcon.shadowSize = new GSize(1,1);
arrowIcon.iconAnchor = new GPoint(12,12);
arrowIcon.infoWindowAnchor = new GPoint(0,0);

var degreesPerRadian = 180.0 / Math.PI;

//var poly_color = '#434E1F';
var poly_color = '#000000';
var poly_weight = 2;





function bearing( from, to ) {
    // See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.
    // Convert to radians.
    var lat1 = from.latRadians();
    var lon1 = from.lngRadians();
    var lat2 = to.latRadians();
    var lon2 = to.lngRadians();

    // Compute the angle.
    var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );

    if ( angle < 0.0 )
        angle  += Math.PI * 2.0;

    // And convert result to degrees.
    angle = angle * degreesPerRadian;
    angle = angle.toFixed(1);

    return angle;
}

function arrowHead(points) {
    // == obtain the bearing between the last two points
    var p1=points[points.length-1];
    var p2=points[points.length-2];
    var dir = bearing(p2,p1);
    // == round it to a multiple of 3 and cast out 120s
    var dir = Math.round(dir/3) * 3;
    while (dir >= 120) {dir -= 120;}
    // == use the corresponding triangle marker
    arrowIcon.image = "http://www.google.com/intl/en_ALL/mapfiles/dir_"+dir+".png";
    map.addOverlay(new GMarker(p1, arrowIcon));
}

function midArrows(points) {
    for (var i=1; i < points.length-1; i++) {
        var p1=points[i-1];
        var p2=points[i+1];
        var dir = bearing(p1,p2);
        // == round it to a multiple of 3 and cast out 120s
        var dir = Math.round(dir/3) * 3;
        while (dir >= 120) {dir -= 120;}
        // == use the corresponding triangle marker
        arrowIcon.image = "http://www.google.com/intl/en_ALL/mapfiles/dir_"+dir+".png";
        map.addOverlay(new GMarker(points[i], arrowIcon));
    }
}

function mapGo(lat, lon, num)
{
    var point = new GLatLng( lat, lon);
    map.setCenter(point);

    current_loc = num;
    GEvent.trigger(marker[num],"click");
    //window.location = "#loc_" + num;
}

function zoom3()
{
    map.zoomIn();map.zoomIn();map.zoomIn();
}


function getPhotoImageElement(photo_id, ii)
{

    if (loc_photos[ii] == undefined)
        return '';

    if (loc_photos[ii][photo_id] == undefined) {
        return '';
    }

    var htm_current_img = '<img id=photo_'+ photo_id +''+ ii +' src=' + loc_photos[ii][photo_id]['thumb'] +
    ' pbSrc="'+ loc_photos[ii][photo_id]['big'] + '"' +
    ' class="PopBoxImageSmall" pbshowcaption="true" title="' + loc_photos[ii][photo_id]['title'] +'" onclick="Pop(this,50,\'PopBoxImageLarge\');" />';

    return htm_current_img;
}

function getHtmlPopup(ii)
{
    var msg = locations[ii]['text'];
    //var img = '<img align="absmiddle" src="' + locations[ii]['img'] + '" />';
    var img = '';
    
    var descr = '<span style="font-size: 10px; color: #000000; line-height: 13pt;">' + locations[ii]['descr'] + '</span>';
    var htm = '<table width="100%"><tr><td colspan=2><font style="color: black;font-weight: bold;font-size: 13px;"><span align=justify style=width:180px;>'+msg+'</span></font></td></tr><tr><td>' + descr + '</td><td align=right width="1px">' + img + '</td></tr><tr><td colspan="2">&nbsp;</td></tr></table>';
    return htm;
}

function createMarker(ii, type, trip)
{
    var point = new GLatLng( parseFloat(locations[ii]['lat']), parseFloat(locations[ii]['lng']));

    if (locations[ii]['type'] == 'our') {
    	marker[ii] = new GMarker(point,icon_new);
    } else {
    	marker[ii] = new GMarker(point,icon_fav);
    }

    GEvent.addListener(marker[ii], "click", function() {
	
	    var htm = getHtmlPopup(ii);
	    marker[ii].openInfoWindowHtml(htm, {maxWidth: 250, minHeight: 180});

    });

    map.addOverlay(marker[ii]);

}

function drawRoute(trip)
{
    points = new Array();
    if (trip_line != null) {
        map.removeOverlay(trip_line);
    }

	for(i = 0; i < locations.length; i++) {
        points.push(new GLatLng(locations[i]['lat'],locations[i]['lng']));
	}

	// add polyline
	if (trip > 0) {
        trip_line = new GPolyline(points, poly_color, poly_weight);
        map.addOverlay(trip_line);
	}
}

function mapLoadData(type, trip)
{
	if(locations.length > 0 ) {

        for (i = 0; i < locations.length; i++) {
            if (marker[i] != undefined)
                map.removeOverlay(marker[i]);
        }
        marker = new Array();
        points = new Array();

        if (trip_line != null) {
            map.removeOverlay(trip_line);
        }

	    var img1 = '';

		for(ii = 0; ii < locations.length; ii++) {
		    if (type == 'edit') {
		        hid.value = hid.value + locations[ii]['lat'] + '||'
		          + locations[ii]['lng'] + '||' + locations[ii]['text'] + '||'
		          + locations[ii]['descr'] + '||' + locations[ii]['act'] + '||'
		          + locations[ii]['id'] + '||';

                if (loc_photos[ii] != undefined) {
//                    alert('hid2 ok');
            		for(iii = 0; iii < loc_photos[ii].length; iii++) {
        		        hid2.value = hid2.value + locations[ii]['id'] + '||' +
        		          loc_photos[ii][iii]['big'] + '||' +
        		          loc_photos[ii][iii]['title'] + '||';
            		}
                }
		    }

		    points.push(new GLatLng(locations[ii]['lat'],locations[ii]['lng']));
			createMarker(ii, type, trip);
		}

		/*
		// add polyline
		if (trip > 0) {
            trip_line = new GPolyline(points, poly_color, poly_weight);
            map.addOverlay(trip_line);
		}
		*/

		var p_max = new GLatLng(locations[0]['lat'] , locations[0]['lng']);
		var p_min = new GLatLng(locations[0]['lat'] , locations[0]['lng']);
		max_lat = parseFloat(locations[0]['lat']);
		max_lng = parseFloat(locations[0]['lng']);
		min_lat = parseFloat(locations[0]['lat']);
		min_lng = parseFloat(locations[0]['lng']);
		for(ii = 0; ii < locations.length; ii++) {
			if(parseFloat(locations[ii]['lat']) > max_lat) { max_lat = parseFloat(locations[ii]['lat']);	}
			if(parseFloat(locations[ii]['lng']) > max_lng) { max_lng = parseFloat(locations[ii]['lng']);	}
			if(parseFloat(locations[ii]['lat']) < min_lat) { min_lat = parseFloat(locations[ii]['lat']);	}
			if(parseFloat(locations[ii]['lng']) < min_lng) { min_lng = parseFloat(locations[ii]['lng']);	}

        }

        p0 = new GLatLng(max_lat , min_lng);
        p1 = new GLatLng(min_lat , max_lng);

        var oGLatLng = new GLatLng( ((max_lat+min_lat)/2), ((max_lng+min_lng)/2) );
        var oGLatLngBounds = new GLatLngBounds( p0, p1);
        cBounds = map.getBounds();
        var ocorrectzoomlevel = map.getBoundsZoomLevel(oGLatLngBounds);
        
        if (ocorrectzoomlevel > 18) {
            ocorrectzoomlevel = 18;
        }
        if (locations.length == 1) {
        	ocorrectzoomlevel = 19;
        }
        //alert(ocorrectzoomlevel);
        map.setCenter(oGLatLng, ocorrectzoomlevel);
        
        if (locations.length == 1) {
        	var htm = getHtmlPopup(0);
        	marker[0].openInfoWindowHtml(htm, {maxWidth: 250, minHeight: 180});
        }

    } else {
        if (area_lng == 0 && area_lat == 0) {
        	// rhinotire
            area_lng = 40.741904;
            area_lat = -73.925548;
        }
        center_point = new GLatLng(area_lng, area_lat);
        map.setCenter(center_point, 3);
    }

	if (type == 'edit') {
	    makeFavs();
	}

}

function mapLoad(init_lat, init_lon, type, trip) {
	if (GBrowserIsCompatible()) {
	    area_lng = init_lon;
	    area_lat = init_lat;
		//alert(locations.length); return;
		map = new GMap(document.getElementById("gmap"));
		center_point = new GLatLng(init_lat, init_lon);
		
		geocoder = new GClientGeocoder();

		map.setCenter(center_point, 11);
		map.removeMapType(G_HYBRID_MAP);
        map.addMapType(G_PHYSICAL_MAP);
        map.setMapType(G_NORMAL_MAP);
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl(1));
		current_zoom = map.getZoom();
		mapLoadData(type, trip);

		// IE shit fix
        setTimeout("map.zoomIn()", 100);
        setTimeout("map.zoomOut()", 200);
	}
}

function zoom_map(level) {
		map.setZoom(level);
		return level;
}

function getCurentZoom() {
	return current_zoom;
}

function zoomIn() {
	map.zoomIn();
	var lv = map.getZoom();
	return lv;
}
function zoomOut() {
	map.zoomOut();
	var lv = map.getZoom();
	return lv;
}

