var geocoder;
var map;
var directionsService = new google.maps.DirectionsService();
var directionsDisplay = new google.maps.DirectionsRenderer({suppressInfoWindows:true,suppressMarkers:true});
var markers = new Array();
var boxes = new Array();
var source_location;
var number_of_poses;
var pos_locations = new Array();
var pos_distances = new Array();
var pos_routes = new Array();
var poses = new Array();
var pos_ids = new Array();
var counter = 0;
var logo;
// var logo2;
var source_marker;
var delay = 50;
var overtime = false;

// general functions

function show_message(message) {
}
function time_limit() {
   overtime = true;
}
function initialize(address) {
	
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(52.011937,19.775391);
    var myOptions = {
        zoom: 6,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.HYBRID,
        scrollwheel: false
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);    
    logo = new google.maps.MarkerImage('http://maps.gstatic.com/intl/pl_pl/mapfiles/icon_green.png');
    // logo2 = new google.maps.MarkerImage('/markers/shadow.png');
    geocode_address(address);
}

function geocode_address(address) {
	console.log('geocode_address : ' + address);
    if (geocoder) {
        geocoder.geocode( {
            'address': address,
            'country': 'pl'
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var result = results[0];
                source_location = result.geometry.location;
                source_marker = new google.maps.Marker({
                    map: map,
                    position: source_location,
                    clickable: false,
                    draggable: true,
                    icon: logo
                });
                google.maps.event.addListener(source_marker, 'dragend', function() {
                    source_location = this.getPosition();
                    counter = 0;
                    clear_boxes();
                    clear_markers();
                    overtime = false;
                    find_poses();
                });
// new google.maps.Marker({
// map: map,
// position: source_location,
// clickable: false,
// draggable: false,
// visible: false,
// icon: logo
// shadow: logo2
// });
// markers.push(marker);
                find_poses();
            } else {
                show_message('nie znam adresu: '+status);
            }
        });
    }
}

function find_poses() {
	console.log('find_poses : ' + "/index.php/site/service_search/show_all_poses/" + this.document.getElementById('service_id').value);
    setTimeout('time_limit()',8000);
    new Ajax.Request("/index.php/site/service_search/show_all_poses/" + this.document.getElementById('service_id').value, {
        method: 'get',
        onSuccess: function(transport) {
            var tekst = transport.responseText;
            if (tekst!="error") {
                poses = tekst.evalJSON();
                for (i=0; i < poses.length; i++) {
                    setTimeout('calculate_next_distance('+i+')',delay);                    
                }
            } else {
                show_message('ERROR');
            }
        }
    });
}

function calculate_next_distance(i) {
	console.log('calculate_next_distance : ' + i);
    var pos = poses[i];
    var dest_location = new google.maps.LatLng(pos.latitude , pos.longitude  );
    console.log('calculate_next_distance lat long: ' + pos.latitude + ' ' + pos.longitude);
    var myrequest = {
        origin: source_location,
        destination: dest_location,
        provideRouteAlternatives: false,
        travelMode: google.maps.DirectionsTravelMode.DRIVING,
        unitSystem: google.maps.DirectionsUnitSystem.METRIC
    };
    directionsService.route(myrequest, function(result, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            poses[i].route = result;
            poses[i].distance = result.routes[0].legs[0].distance.value;
            poses[i].dist_txt = result.routes[0].legs[0].distance.text;
        } else {
            poses[i].route = null;
            poses[i].distance = 999999;
            poses[i].dist_txt = 'bardzo daleko';        	
        }	
            counter ++;
            if (counter == poses.length || overtime) {
                calculate_closest_poses();
            }
// } else {
// if (status==google.maps.DirectionsStatus.OVER_QUERY_LIMIT) {
// delay += 250;
// } else {
// show_message(i+": "+status);
// }
                
    });
}

function calculate_closest_poses() {
// console.log('calculate_closest_poses : ');
    var sorted = poses.sortBy(
    function(s) {
            return s.distance;
    });
    var closest_poses = new Array();
    for (var i = 0; i < 3; i++) {
        closest_poses.push(sorted[i].id);
    }
    show_closest_poses(closest_poses);
}

function show_closest_poses(closest_poses) {
	console.log('show_closest_poses : ' + closest_poses);
    var min_lat = source_location.lat();
    var max_lat = min_lat;
    var min_lng = source_location.lng();
    var max_lng = min_lng;
    for (var i = 0; i < closest_poses.length; i++) {        
        var pos = get_pos(closest_poses[i]);        
        var location = new google.maps.LatLng(pos.latitude,pos.longitude);
        if (pos.latitude < min_lat) {
            min_lat = pos.latitude;
        }
        if (pos.latitude > max_lat) {
            max_lat = pos.latitude;
        }
        if (pos.longitude < min_lng) {
            min_lng = pos.longitude;
        }
        if (pos.longitude > max_lng) {
            max_lng = pos.longitude;
        }        
        // var tekst = "<div><a href='#'
		// onclick='show_details("+pos.id+")'>"+pos.name+"</a><br/>"+pos.city+"<br/>
		// <a href='#' onclick='show_direction("+pos.id+")'>trasa
		// dojazdu</a></div>";
        var tekst = "<div><a style='color:navy' href='/index.php/site/service_search/show_pos/id/"+pos.id+"'>"+pos.name+"</a><div style='line-height:1.0em; font-weight:bold; color:black'>"+pos.city+"<br/>"+pos.address+"</div><a style='color:navy' href='#' onclick='show_direction("+pos.id+")'>trasa dojazdu</a></div>";
        var marker = set_marker(location,tekst);        
    }    
    var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(min_lat,min_lng),new google.maps.LatLng(max_lat,max_lng));
    map.fitBounds(bounds);
    // map.panBy(-25,-25);
}

function show_details(pos_id) {
	console.log('show_details : ' + pos_id);
    new Ajax.Request("/index.php/site/service_search/show_pos_data/"+pos_id, {
        method: 'get',
        onSuccess: function(transport) {
            var tekst = transport.responseText;
            if (tekst!="error") {
                var dane = tekst.evalJSON();
                var info = "<br/><br/><table width='100%' border='1'>";
                info += "<tr><td colspan='2'><b>"+dane.name+"</b></td></tr>";
                info += "<tr><td>adres</td><td>"+dane.street+"<br/>"+dane.city;
                info += "</td></tr><tr><td>telefon</td><td>"+dane.telephone;
              // info += "</td></tr><tr><td colspan='2'>godziny
				// otwarcia</td></tr>";
// info += "<tr><td>pon. - pt.</td><td>"+dane.open_working_day;
// info += "</td></tr><tr><td>sobota</td><td>"+dane.open_saturday;
               // info +=
				// "</td></tr><tr><td>niedziela</td><td>"+dane.open_sunday;
                info += "</td></tr></table>"
                $('map_info').update(info);
            } else {
                show_message('error');
            }
        }
    });
}

// utility functions
function get_pos(pos_id) {
    var pos = poses.detect(
    function(s){
        return s.id == pos_id;
    });
    return pos;
}

function show_direction(pos_id) {
	console.log('show_direction : ' + pos_id);
    // var pos = get_pos(pos_id);
    // var tekst = "<div><a href='#'
	// onclick='show_details("+pos.id+")'>"+pos.name+"</a><br/>"+pos.city+"<br/><br/>"+pos.dist_txt+"</div>";
    directionsDisplay.setMap(map);
    directionsDisplay.setDirections(get_pos(pos_id).route);
    clear_boxes();
    // clear_markers(pos_id);
    // source_marker.setMap(null);
    // show_details(pos_id);
    // boxes[i].open(map,markers[i]);
}

function set_location(id,location) {
	console.log('set_location : ' + id + ' : ' + location);
    locations[id] = location;
}
function set_marker(location,tekst) {
	console.log('set_marker : ' + location + ' : ' + tekst);
    var marker = new google.maps.Marker({
        map: map,
        position: location,
    });
    markers.push(marker);
    google.maps.event.addListener(marker, 'click', function() {
        set_infobox(marker,tekst);
    });
    return marker;
}

function set_infobox(marker,tekst) {
	console.log('set_infobox : ' + marker + ' : ' + tekst);
    var info = new google.maps.InfoWindow({
        content: tekst
    });
    clear_boxes();
    boxes.push(info);
    // google.maps.event.addListener(info, 'closeclick', function() {
    // $('map_info').update("");
    // });
    info.open(map,marker);
}

function extend_bounds(location) {
    var bounds = map.getBounds();
    bounds.extend(location);
    map.fitBounds(bounds);
}
function set_zoom(zoom) {
    if (map.getZoom() != zoom) {
        map.setZoom(zoom);
    }
}
function show_pl() {
    set_zoom(6);
}

function clear_markers() {
    for (i=0; i < markers.length; i++) {
        markers[i].setMap(null);
    }
    markers = new Array();
    show_pl();
}
function clear_boxes() {    
    for (var i=0; i < boxes.length; i++) {
        boxes[i].close();
        boxes = new Array();
    }
}

function geocode_pos(address,id) {
	console.log('geocode_pos : ' + id + ' : ' + address);
    if (geocoder) {
        geocoder.geocode( {
            'address': address,
            'country': 'pl'
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var location = results[0].geometry.location
                new Ajax.Request("/index.php/mapa/posmap/geocode_pos/"+id+"/"+location.lat()+"/"+location.lng() , {
                    method: 'get',
                    onSuccess: function(transport) {
                        var tekst = transport.responseText;
                        alert(tekst);
                    }
                });
            } else {
                alert("Nie znaleziono adresu (" + status +")");
            }
        });
    }
}
