$(document).ready(function(){
  
  var map = null;
  var geocoder = null;
  var address = null;
  var counter = 0;
           
	$(window).load(function(){ 
	  initialize();
	}); // load event
	  
	$(window).unload(function(){
	  GUnload();
	}); // unload event

  $('li a', 'ul.map_results').click(function(event){
    event.preventDefault();
  })
			
	function initialize() {
	  if (GBrowserIsCompatible()) {
	    map = new GMap2(document.getElementById('map'));
	    if (document.URL.indexOf('mapa') == -1) {
	      map.addControl(new GSmallMapControl());
	    } else {
	      map.addControl(new GLargeMapControl());
	    }
      map.addControl(new GHierarchicalMapTypeControl());
	    
	    if (document.URL.indexOf('dodaj3') > -1 || document.URL.indexOf('edycja3') > -1 || document.URL.indexOf('moderacja-obiektu') > -1) {
		    map.setCenter(new GLatLng(52.2297, 21.0122), 13);
		    GEvent.addListener(map, 'click', geocodeAddress);
		    geocoder = new GClientGeocoder();
		    point = new GLatLng($('input:hidden[name=o_latitude]').val(), $('input:hidden[name=o_longitude]').val());
		    address = $('input[name=o_maddress]').val();
        
		    if ($('input:hidden[name=o_latitude]').val() && $('input:hidden[name=o_longitude]').val()) {
		      createMarker(point, 'add-edit');
		    } else if (address) {
		      geocodeAddress();
		    }
		  }
		  if (document.URL.indexOf('obiekty') > -1 || document.URL.indexOf('mapa') > -1) {
		    var action = '';
		    if (document.URL.indexOf('obiekty') > -1) {
		      map.setCenter(new GLatLng(52.2297, 19.0122), 5);
		      action = 'search';
		    } else {
		      map.setCenter(new GLatLng(52.1000, 19.0122), 6);
		      action = 'find_on_map';     
		    }
		    
			  var xml = GXml.parse($('input:hidden[name=xml]').val());
			  var markers = xml.documentElement.getElementsByTagName("marker");
			    
			  for (var i = 0; i < markers.length; i++) {
	        var name = markers[i].getAttribute('o_name');
	        if (action == 'find_on_map') {
            var rating = {'avg_rating': markers[i].getAttribute('o_avg_rating'), 'number_of_vote': markers[i].getAttribute('o_number_of_vote')};
            var types = markers[i].getAttribute('o_types');
            var address = markers[i].getAttribute('o_address');
            var photo = markers[i].getAttribute('o_photo');
            var price = markers[i].getAttribute('o_price');
            var details = markers[i].getAttribute('o_details');
	        }
	        var point = new GLatLng(parseFloat(markers[i].getAttribute('o_latitude')),
	                                parseFloat(markers[i].getAttribute('o_longitude')));
	        
	        createMarker(point, action, {'name': name, 'rating': rating, 'types': types, 'address': address, 'photo': photo, 'price': price, 'details': details}, i);
	      }
		  }
		  if (regexp(document.URL, '[a-z-]+/[a-z-]+/[0-9a-z-]+_[0-9]+', 'test')) {
		    map.setCenter(new GLatLng(52.2297, 21.0122), 13);
		    
		    var xml = GXml.parse($('input:hidden[name=xml]').val());
        var markers = xml.documentElement.getElementsByTagName("marker");
        
        var name = markers[0].getAttribute('o_name');
        var point = new GLatLng(parseFloat(markers[0].getAttribute('o_latitude')),
                                parseFloat(markers[0].getAttribute('o_longitude')));
          
        createMarker(point, 'details');
		  }
	  } else {
	    window.alert('Przepraszamy, ale Google Maps API nie jest kompatybilny z Twoją przeglądarką.');
	  }
	} // initialize
	
	/*$('button[name=geocode]').click(function(event){
    geocodeAddress();
    event.preventDefault();
  }); // click event - geocode address*/
	
	function createMarker(point, action, object, index) {
	  var marker;
	  
	  //if (!$('input:hidden[name=o_latitude]').val()) { 
	    $('input:hidden[name=o_latitude]').val(point.lat());
      $('input:hidden[name=o_longitude]').val(point.lng());
    //}
	  
	  if (action == 'register') {
	    map.clearOverlays();
      marker = new GMarker(point, {draggable: true});
      GEvent.addListener(marker, 'dragend', geocodeAddress);
      map.setCenter(point, 13);
      map.addOverlay(marker);
    }
    if (action == 'search' || action == 'find_on_map') {
      var $marker_list = null;
      var sidebar_link = null;
      
      if (action == 'search') {
        $marker_list = $('ul.objects_result').get(0);
        sidebar_link = $('li', $marker_list).get(index);
      } else {
        $marker_list = $('ul.map_results').get(0);
        sidebar_link = $('li', $marker_list).get(index);
        
        var staticstars = {
				  '0.5': '05',
				  '1.0': 1,
				  '1.5': 15,
				  '2.0': 2,
				  '2.5': 25,
				  '3.0': 3,
				  '3.5': 35,
				  '4.0': 4,
				  '4.5': 45,
				  '5.0': 5,
				  '5.5': 55,
				  '6.0': 6
        };
        
        var content = '<ul class="objects_result">'+     
                        '<li class="object-item" style="cursor: pointer;">'+
                          object.photo+
                          '<div class="data">'+
                            '<p class="price">'+
                              '<span>ceny: '+object.price+'</span>'+
                            '</p>'+
                            '<h3>'+
                              object.details+
                            '</h3>'+
                            '<p class="loc">'+
                              object.address+
                            '</p>'+
                            '<p class="icons">'+
                              object.types+
                            '</p>'+ 
                          '</div>'+
                          '<div class="meta">'+
                            '<span>średnia ocen: </span>'+
                            '<span class="staticstars">'+
                              '<b class="s-'+staticstars[object.rating.avg_rating]+'">'+object.rating.avg_rating+'</b>'+
                            '</span>'+
                            '<span>'+object.rating.avg_rating+' (ocen: '+object.rating.number_of_vote+')</span>'+
                          '</div>'+
                        '</li>'+
                      '</ul>';
      }
      
      marker = new GMarker(point);
      marker.tooltip = new Tooltip(marker, object.name, 5);
      
      var ttmover = GEvent.callback(marker, tooltipMouseover);
      var ttmout = GEvent.callback(marker, tooltipMouseout);
      
      GEvent.addDomListener(sidebar_link, 'mouseover', ttmover);
      GEvent.addDomListener(sidebar_link, 'mouseout', ttmout);
      GEvent.addListener(marker, 'mouseover', ttmover);
      GEvent.addListener(marker, 'mouseout', ttmout);
      
      if (action == 'find_on_map') {
        var mclick = GEvent.callbackArgs(marker, markerClick, content);
        
        GEvent.addDomListener(sidebar_link, 'click', mclick);
        GEvent.addListener(marker, 'click', mclick);
        GEvent.addListener(marker, 'infowindowopen', GEvent.callback(marker, infoWindowOpen));
        GEvent.addListener(marker, 'infowindowclose', GEvent.callback(marker, infoWindowClose));
      }
      
      map.addOverlay(marker);
      map.addOverlay(marker.tooltip);
      //map.setCenter(marker.getPoint());      
    }
    if (action == 'details') {
      map.clearOverlays();
      marker = new GMarker(point);
      map.setCenter(point, 13);      
      map.addOverlay(marker);
    }
    if (action == 'add-edit') {
      map.clearOverlays();
      marker = new GMarker(point, {draggable: true});
      GEvent.addListener(marker, 'dragend', geocodeAddress);
      map.setCenter(point, 13);      
      map.addOverlay(marker);
    }
	}
  
	function geocodeAddress(response, latlng) {
	  if (geocoder) {
	    if (response && !response.Status) {
	      latlng = response;
	      response = null;
	    }
		  if (response || latlng) {
		    if (latlng) {
		      geocoder.getLocations(latlng, geocodeAddress)
		    } else {
		      if (response.Status.code != 200) {
		        window.alert('Adres nie został zlokalizowany.');
		        return;
		      } else {
		        var place = response.Placemark[0];
		        var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
		        $('input[name=o_maddress]').val(place.address);
		        createMarker(point, 'register');
		      }
		    }
		  } else {
		    //address = $('input[name=o_maddress]').val();
		    if (!address) {
		      /*window.alert('Proszę wprowadzić adres.');
		      return;*/
		      address = $('input[name=o_maddress]').val();
		    }
		    
	      geocoder.getLatLng(
	        address,
	        function(point) {
	          if (!point) {
	            if (document.URL.indexOf('dodaj') > -1) {
	              var form_error_message = '';
					      $('div.reportbar_error ul li').each(function(index){
							    if ($(this).text().indexOf('Pole Lokalizacja') > -1) {
							      form_error_message = true;
                    return;
						      }
	              });
					    }
							if (!form_error_message) {
	              //window.alert('Adresu "' + address + '" nie znaleziono. Może to być spowodowane faktem, że wprowadzony adres jest względnie nowy lub jest niepoprawny.');
                address_splited = address.split(',');
                if (address_splited.length > 1 && !counter) {
                  address = address_splited[1] + ', Polska';
                  geocodeAddress();
                  counter++;
                }
	            }
	            return; 
	          } else {
	            createMarker(point, 'register');             
	          }
	        }
	      );
	    }
	  }
	} // geocodeAddress
  
  //makrer, sidebar mouseover handler
  function tooltipMouseover() {
    if (!(this.isInfoWindowOpen) && !(this.isHidden())) {
      this.tooltip.show();
    }
  }

  //marker, sidebar mouseout handler
  function tooltipMouseout() {
    this.tooltip.hide();
  }

  //marker click handler
  function markerClick(html) {
    this.tooltip.hide();
    this.openInfoWindowHtml(html);
  }
   
  //infowindowopen handler
  function infoWindowOpen() {
    this.isInfoWindowOpen = true;
  }

  //infowindowclose handler
  function infoWindowClose() {
    this.isInfoWindowOpen = false;
  }
  
  //function showLargeMap() {
    //$('#minimap-action a').click(function(event){
      //$('#overlay').show();
    //});
  //};
      
}); // ready
