jQuery.googleMap.search = function(data, id){

  GMap2.prototype.markers = new Array();

  var categoryFields = new Array('#adCategory1', '#adCategory2', '#adCategory3', '#adCategory4', '#adCategory5', '#adCategory6');

  var map = $j.googleMap.maps[id];
  map.getPane(G_MAP_FLOAT_SHADOW_PANE).style.display = "none";
  
  //ikona hotelu/noclegu
  var hotelIcon = new GIcon();
      hotelIcon.iconSize=new GSize(32,32);
      hotelIcon.shadowSize=new GSize(56,32);
      hotelIcon.iconAnchor=new GPoint(16,32);
      hotelIcon.infoWindowAnchor=new GPoint(16,0);
  var hotel = new GIcon(hotelIcon, '/0/images/markerHotel.png', null, null);
  
  //ikona wycieczek i wypraw
  var travelIcon = new GIcon();
      travelIcon.iconSize=new GSize(32,32);
      travelIcon.shadowSize=new GSize(56,32);
      travelIcon.iconAnchor=new GPoint(16,32);
      travelIcon.infoWindowAnchor=new GPoint(16,0);
  var travel = new GIcon(travelIcon, '/0/images/markerTravel.png', null, null);
  
  //ikona sportu i rekreacji
  var sportIcon = new GIcon();
      sportIcon.iconSize=new GSize(32,32);
      sportIcon.shadowSize=new GSize(56,32);
      sportIcon.iconAnchor=new GPoint(16,32);
      sportIcon.infoWindowAnchor=new GPoint(16,0);
  var sport = new GIcon(sportIcon, '/0/images/markerSport.png', null, null);
  
  //ikona obozow i kolonii
  var campIcon = new GIcon();
      campIcon.iconSize=new GSize(32,32);
      campIcon.shadowSize=new GSize(56,32);
      campIcon.iconAnchor=new GPoint(16,32);
      campIcon.infoWindowAnchor=new GPoint(16,0);
  var camp = new GIcon(campIcon, '/0/images/markerCamp.png', null, null);
  
  //ikona zdrowia i urody
  var healthIcon = new GIcon();
      healthIcon.iconSize=new GSize(32,32);
      healthIcon.shadowSize=new GSize(56,32);
      healthIcon.iconAnchor=new GPoint(16,32);
      healthIcon.infoWindowAnchor=new GPoint(16,0);
  var health = new GIcon(healthIcon, '/0/images/markerHealth.png', null, null);
  
  //ikona gastronomii
  var foodIcon = new GIcon();
      foodIcon.iconSize=new GSize(32,32);
      foodIcon.shadowSize=new GSize(56,32);
      foodIcon.iconAnchor=new GPoint(16,32);
      foodIcon.infoWindowAnchor=new GPoint(16,0);
  var food = new GIcon(foodIcon, '/0/images/markerFood.png', null, null);
  
  //ikona muzea
  var cultureIcon = new GIcon();
      cultureIcon.iconSize=new GSize(32,32);
      cultureIcon.shadowSize=new GSize(56,32);
      cultureIcon.iconAnchor=new GPoint(16,32);
      cultureIcon.infoWindowAnchor=new GPoint(16,0);
  var culture = new GIcon(cultureIcon, '/0/images/markerCulture.png', null, null);

  var categoryMarkers = {1:hotel, 2:camp, 3:travel, 4:health, 5:sport, 6:food, 7:culture};

  //ikona grupy ogloszen
  var groupIcon = new GIcon();
      groupIcon.iconSize=new GSize(34,30);
      groupIcon.shadowSize=new GSize(0,0);
      groupIcon.iconAnchor=new GPoint(17,18);
      groupIcon.infoWindowAnchor=new GPoint(15,0);
  var group = new GIcon(groupIcon, '/0/images/markerGroup.png', null, null);


  //flagi wykorzystane do opoznienia wyszukiwania przy przesuwaniu mapki
  var searchDisbled = false;
  var searchEnabled = false;
  var delaySearchTimeout = null;

  $j(document).ready(function(){
    search();
    initCategories();
  });

  $j("#zoomToPoland").bind("click", function(){
    $j(".smallNav li.active").removeClass("active");
    $j(this).parent().addClass("active");
    map.setCenter(new GLatLng(51.91716758909015, 19.13818359375));
    map.setZoom(6);
  });

	$j("#zoomToEurope").bind("click", function(){
    $j(".smallNav li.active").removeClass("active");
    $j(this).parent().addClass("active");
	  map.setCenter(new GLatLng(51.0, 15.0));
	  map.setZoom(3);
	});

  $j("#zoomToWorld").bind("click", function(){
    $j(".smallNav li.active").removeClass("active");
    $j(this).parent().addClass("active");
    map.setCenter(new GLatLng(36.0, 9.0));
    map.setZoom(2);
  });

  GEvent.addListener(map, "zoomend", function(){
    if (searchDisbled){
      searchDisbled = false;
    }
    clearInfoMarkers();
    search();
    //hack - usuniecie timeouta ustawianego po zoomend przez moveend
    setTimeout(function(){
      clearTimeout(delaySearchTimeout);
    }, 1);      
  });

  GEvent.addListener(map, "moveend", function(){
    if (!searchDisbled){
      delaySearch();
    }
    else{
      searchEnabled = true;
    }
  });
    
  GEvent.addListener(map, "movestart", function(){
    clearTimeout(delaySearchTimeout);
  });
  
  function initCategories(){
    $j('input.adCategory').bind('click', function(){
      search();
    });
  }
  
  function delaySearch(){
    clearTimeout(delaySearchTimeout);
    delaySearchTimeout = setTimeout(search, 500);
  }

  function search(){
    clearTimeout(delaySearchTimeout);
        
    var jsonTransport;
        
    $j.ajax({
      type: 'GET',
      url: '/map/search/' + getBounds(map) + '&zoom=' + map.getZoom() + getCategories(),
      dataType: 'json',
      success: function(transport) {
        jsonTransport = transport;
      },
      complete: function(){
        
        clearInfoMarkers();
        if (jsonTransport && jsonTransport.markers) {
          var place;
          var markerType = group;        
        
	        for (var i=0; i<jsonTransport.markers.length; i++){
	          place = jsonTransport.markers[i];
	          if (place.type == 'ad'){
              markerType = categoryMarkers[place.data.category] ? categoryMarkers[place.data.category] : hotel;
	          }
	          addInfoMarker(place.lat, place.lng, place, markerType);
	        }
        }
      }
    });
  }
  
  
  
  /*
   * Metoda usuwajaca markery z mapy
   */
  function clearInfoMarkers(){
    for (var i=0; i<map.markers.length; i++){
      map.removeOverlay(map.markers[i]);
    }
    map.markers = new Array();
  }  
  
  /**
   * Formatuje informacje wyswietlana w chmurce
   */
  function prepareInfo(marker){
    info = '<div class="noStyle">';
    switch (marker.type){
      case 'co':
        info += '<strong>' + marker.label + '</strong>';
        if (marker.provinces && marker.provinces.markers){
          var province;
          for(i=0; i<marker.provinces.markers.length; i++){
            province = marker.provinces.markers[i];
            info += '<p><a href="/ads/search/?region=' + province.id + '">' + province.label + ' (' + province.sum + ')</a></p>';
          }
        }
        break;

      case 'pr':
        info += '<strong>Województwo (ofert):</strong>';
        info += '<p><a href="/ads/search/?region=' + marker.id + '">' + marker.label + ' (' + marker.sum + ')</a></p>';
        break;
      
      case 'di':
        info += '<strong>Powiat (ofert):</strong>';
        info += '<p><a href="/ads/search/?district=' + marker.id + '">' + marker.label + ' (' + marker.sum + ')</a></p>';
        break;
		    
		  case 'ad':
		    var img = !marker.data.photo || marker.data.photo == '' ?  '' : '<img src="' + marker.data.photo + '" alt="" />  ';
        info += '<strong>' + marker.label + '</strong>';
        info += '<p><a href="' + marker.data.url + '">' + img + marker.data.city + '<br />' + marker.data.address + '</a></p>';
		    break;
    }
    return info + '</div>';
  }  
  
  /*
   * Metoda dodajaca marker dla mapy
   */
  function addInfoMarker(lat, lng, data, type){
    
    var point = new GLatLng(lat, lng);
    var marker = new GMarker(point, type);
    var info = prepareInfo(data);

    GEvent.addListener(marker, "click", function(){
      switch (data.type){
        case 'co':
          map.setCenter(point);
          map.setZoom(6);
          break;
        case 'pr':
          map.setCenter(point);
          map.setZoom(9);
          break;
        case 'di':
          map.setCenter(point);
          map.setZoom(11);
          break;
      }
    });

    GEvent.addListener(marker, "mouseover", function(){
      searchEnabled = false;
      marker.openInfoWindowHtml(info,{autoScroll:true,maxHeight:100,maxWidth:250});
    });

    GEvent.addListener(marker, "infowindowopen", function(){
      searchDisbled = true;
    });
    
    GEvent.addListener(marker, "infowindowclose", function(){
      searchDisbled = false;
      if (searchEnabled){
        search();
      }
    });
    
    map.markers.push(marker);
    map.addOverlay(marker);
  }  
  
  function getCategories(){
    var query = '&category=';
    for (var i=0; i<categoryFields.length; i++){
      if ($j(categoryFields[i])[0].checked){
        query += $j(categoryFields[i]).val();
				if (i<categoryFields.length-1){
				  query += '_';
				}
      }
    }
    return query;
  }
  
  function getBounds(map){
    var bounds = map.getBounds();
    var str = '?latFrom=' + bounds.getSouthWest().lat()+
      '&lngFrom=' + bounds.getSouthWest().lng()+
      '&latTo=' + bounds.getNorthEast().lat()+
      '&lngTo=' + bounds.getNorthEast().lng();
    return str;
  }  
}