/*
 * Below two functions are responsible for simple
 * tooltip which appears when user click
 * on GMarker on search results page 
 */ 

function getTooltipCoordinates(point)
{
  /* modyfikatory współrzędnych */
  var modx=0;
  var mody=0;
  /* próbujemy pobrać kontener 

  if ($("div.advertMapContainer").offset()!=null)
  {
    var offset = $("div.advertMapContainer").offset();
  }
  else if ($("div.listingMapContainer").offset()!=null)
  {
    var offset = $("div.listingMapContainer").offset();
    modx=-50;
  }
  else if ($("div.developerMapContainer").offset()!=null)
  {
    var offset = $("div.developerMapContainer").offset();
  };

  */

  if ($("div.listingMapContainer").offset()!=null)
  {
    modx=-30;
  }
  var offset = $("div.canvas").position();
  var px = point.x;
  var py = point.y;
  var bx = offset.left-100+modx;
  var by = offset.top;//-175;
  /*
     Google Maps :)
     ___ ___ ___
    |   |   |   |
    | 1 |a2b| 3 |
    |___|___|___|
    |   |   |   |
    | 4 |a5b| 6 |
    |___|___|___|

  */ 
  if ((px<=120) && (py<=200)) // 1
  {
    var posx = px+bx+90;
    var posy = py+by;
  } 
  else if ((px<=120) && (py>200)) // 4
  {
    var posx = px+bx+90;
    var posy = py+by-180;
  }
  else if ((px>290) && (py>200)) // 6
  {
    var posx = px+bx-200;
    var posy = py+by-175;
  }
  else if ((px>290) && (py<=200)) // 3
  {
    var posx = px+bx-200;
    var posy = py+by;
  }
  else if ((px>120) && (px<=200) && (py<=200)) // a2
  {
    var posx = px+bx-30;
    var posy = py+by;
  }
  else if ((px>200) && (px<=290) && (py<=200)) // b2
  {
    var posx = px+bx-130;
    var posy = py+by;
  }
  else if ((px>120) && (px<=200) && (py>200)) // a5
  {
    var posx = px+bx-30;
    var posy = py+by-180;
  }
  else if ((px>200) && (px<=290) && (py>200)) // b5
  {
    var posx = px+bx-130;
    var posy = py+by-175;
  };
  var cssobj = new Object();
  
  cssobj.left = posx;
  cssobj.top = posy;
 //console.log(cssobj);
  return cssobj;

}

function hideTooltipGMarker() {
  tooltipState = 0;
  $('#tooltipGMarkerCLick').stop(true, true).hide();
  $('#tooltipGMarkerCLick #tooltipBody').text("");
};

/*
$.fn.delay = function(time, callback){
  jQuery.fx.step.delay = function(){};
  return this.animate({delay:1}, time, callback);
}
*/
tooltipState = 0;

function clearTooltip() {
  $('#tooltipGMarkerCLick #tooltipBody').delay(1000, function()
  {
    if (tooltipState==0) {
      $('#tooltipGMarkerCLick #tooltipBody').text("");
    };
  });  
};

function showTooltipGMarker(message) {
  tooltipState = 1;
  $('#tooltipGMarkerCLick #tooltipBody').text("");
  $('#tooltipGMarkerCLick #tooltipBody').append(message);
  $('#tooltipGMarkerCLick').stop(true, true).fadeIn(10);
};


function stopHide() {
  $('#tooltipGMarkerCLick').stop(true, true);
};

/* 
 * the goal is to have special function to close tooltip in cute way, 
 * even maybe after some time?
 */
$.fn.pause = function(duration) {
    $(this).animate({ dummy: 1 }, duration);
    return this;
};

function hideTooltipGMarkerSmooth() {
  tooltip = 0;
  $('#tooltipGMarkerCLick').delay(500).fadeOut(10);
  clearTooltip();
  //$('#tooltipGMarkerCLick #tooltipBody').delay(30001).text("");
};
/* End of tooltip javascript */

$(document).ready(function() {




  /*
   * this is small feature to fade search result list
   * ticket #162
   */
  
  function hideResults () {
    var height = $('#result_list').css("height")
    $('#result_list').css("opacity", "0.3")
    $('#result_list').css("-moz-opacity", "0.3")
    $('#result_list').css("filter", "alpha(opacity=30)")

    $('#please_wait_message').css("position", "absolute");  //
    $('#please_wait_message').css("left", "10px");          // these three should be set in css
    $('#please_wait_message').css("z-index", "30");         // 

    $('#please_wait_message').show();
  };  

  function showResults () {
    $('#please_wait_message').hide();
    $('#result_list').css("opacity", "1")
    $('#result_list').css("-moz-opacity", "1")
    $('#result_list').css("filter", "alpha(opacity=100)")
  }

  /* end of ticket #162 */

  function SearchMapControl(){}
  SearchMapControl.prototype = new GControl();
  SearchMapControl.prototype.initialize = function(map){

      var container = document.createElement('div');
      var button = document.createElement('div');
      this.setButtonStyle_(button);
      container.appendChild(button);
      button.appendChild(document.createTextNode("Szukaj na mapie"));
	  var checkbox = document.createElement('input');
	  checkbox.type='checkbox';
	  button.appendChild(checkbox);
      GEvent.addDomListener(checkbox, 'change', function(){
              map.allow_search = this.checked
              });
      map.getContainer().appendChild(container);
      return container;
  }
  SearchMapControl.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7));
  }
  SearchMapControl.prototype.setButtonStyle_ = function(button) {
    button.style.color = "#666";
    button.style.backgroundColor = "white";
    button.style.font = "small Arial";
    button.style.border = "1px solid black";
    button.style.padding = "2px";
    button.style.marginBottom = "3px";
  }

  
  function setupSearchMapControlOnBar(barId) {
      var bar = $(barId);
      if (!bar.length)
        return false;
      
      alert("OK!");
      return true;
  }

  function SearchMapControlOnBar(){}
  SearchMapControlOnBar.prototype = new GControl();
  SearchMapControlOnBar.prototype.initialize = function(map){

      var container = document.createElement('form');
      label = document.createElement('label');
      label.appendChild(document.createTextNode("Szukaj na mapie "));
	  var checkbox = document.createElement('input');
	  checkbox.type='checkbox';
	  label.appendChild(checkbox);
      container.appendChild(label);
      GEvent.addDomListener(checkbox, 'change', function(){
              map.allow_search = this.checked
              });
      $('#searchResultsOnMapSort').append(container);
      return container;
  }
  
  $('#tooltipGMarkerCLick').mouseout(hideTooltipGMarkerSmooth);
  $('#tooltipGMarkerCLick').mouseover(stopHide);
  
  //INIT MAPS
  $('.initialize-maps').each(function() {
        var $canvas = $('.canvas', this);
        var center_on_markers = $canvas.attr('center_on_markers');

        var $control_box = $('.control-box', this);
        var latitude = 52.173931;
        var longitude = 18.852539;
        var zoom_level = 14;
        var jmap_data = {
        	'language':'pl',	
            'mapType': G_NORMAL_MAP,
            'mapControl':false,
            'mapCenter':[latitude, longitude],
            'mapZoom':zoom_level,
            'mapEnableScaleControl': false,
            'mapEnableSmoothZoom': true
        };
    
        $canvas.jmap('init', jmap_data);
        
        var map = Mapifies.MapObjects.Get($canvas);
        
        map.addControl(new GMenuMapTypeControl());// holding a drop-down menu of the G_DEFAULT_MAP_TYPES map types
        map.addControl(new GSmallZoomControl3D()); //small zoom buttons
        
        // define icons
        var defined_icons = {};
        $('>.icon', $control_box).each(function() {
            var codename = $('.codename', this).text();
            var shadow = $('.shadow', this).text();
            var image = $('.image', this).text();
            var image_small = $('.image_small', this).text();
            var icon_size = $('.icon_size', this).text().split(',');
            var shadow_size = $('.shadow_size', this).text().split(',');
            var icon_anchor = $('.icon_anchor', this).text().split(',');
            var icon_window_anchor = $('.icon_window_anchor', this).text().split(',');
            var icon_data = {
                'iconImage': image,
                'iconShadow': shadow,
                'iconSize': new GSize(icon_size[0], icon_size[1]),
                'iconShadowSize': new GSize(shadow_size[0], shadow_size[1]),
                'iconAnchor': new GPoint(icon_anchor[0], icon_anchor[1]),
                'iconWindowAchor': new GPoint(icon_window_anchor[0], icon_window_anchor[1])
            };
            var icon = Mapifies.createIcon(icon_data);
            defined_icons[codename] = icon;
        });
        var interactive_hover_list_selector = $('.interactive-hover-list', $control_box).text();
        var interactive_list_maping = {}; // key = latitude:longitude
        var active_type = ($('.active_type', $control_box).text() || 'f')[0];

        // place markers
        var placeMarkers = function($container, center_map, clear_map, set_callback) {
            if (center_map == undefined) center_map = true;
            if (set_callback == undefined) set_callback = true;
            if (clear_map == undefined) clear_map = true;
            var area = new GLatLngBounds();
            interactive_list_maping = {}; // key = latitude:longitude
            var $interactive_hover_list = $(interactive_hover_list_selector);
            $interactive_hover_list.each(function() {
                $('tr.investment td .control-box', this).each(function() {
                    var $element_control_box = $(this);
                    var latitude = $('.latitude', $element_control_box).text();
                    var longitude = $('.longitude', $element_control_box).text();
                    var key = ""+latitude+":"+longitude;
                    interactive_list_maping[key] = $element_control_box.parents('tr');
                });
            });
            var map = Mapifies.MapObjects.Get($canvas);
            if (clear_map==true) { 
              $canvas.jmap('ClearMap');
            }
            $container.each(function(i) {
                var marker_data = {};
                var point_latitude = $('.latitude', this).text();
                var point_longitude = $('.longitude', this).text();
                var point_G = new GLatLng(point_latitude, point_longitude);
                var point_icon = $('.icon', this).text();
                var alternate_icon = $('.alternate-icon', this).text();
                /*
                if (!i) {
                    //marker_data['center_map'] = true;
                    var map = Mapifies.MapObjects.Get($canvas);
                    map.setCenter(point_G, 13);
                }
                */
                marker_data['pointLatLng'] = [point_latitude, point_longitude];
                var message = $('.point-html', this).html();
                // marker_data['pointHTML'] = $('.point-html', this).html();
                //if (set_callback == true) {
                //  marker_data['pointTitle'] = 'Zobacz szczegóły';
                //}

                point_title = $('.point-title', this).html();
                if (point_title) {
                  marker_data['pointTitle'] = point_title;

                } else {
                  marker_data['pointTitle'] = "";
                };
                if (point_icon) {
                    marker_data['pointIcon'] = defined_icons[point_icon];
                }
                /* action after clicking on the callback */
                
                if (set_callback == true) {  
                    var gopts = new Object(); 
                    var mouseover = $('.point-mouseover', this).html();            
                    var marker_callback = function(marker, options) {
                        GEvent.addListener(marker, "click", function (e) {
                          showTooltipGMarker(message);
                        });

                        if (mouseover) {
                          GEvent.addListener(marker, "mouseover", function (e) {
                              var point = map.fromLatLngToContainerPixel(e);
                              var cssobj = getTooltipCoordinates(point);
                              $('#tooltipGMarkerCLick').css(cssobj);
                              showTooltipGMarker(mouseover);
                          });
                        };


                        area.extend(point_G);
                        var maping_key = ""+point_latitude+":"+point_longitude;
                        if (maping_key in interactive_list_maping) {
                            interactive_list_maping[maping_key].hover(function() {
                                marker.setImage(defined_icons[alternate_icon].image);
                            }, function() {
                                marker.setImage(defined_icons[point_icon].image);
                            });
                        };
                    };
                };
                $canvas.jmap('AddMarker', marker_data, marker_callback);
            });
            if (center_map && $container.length) {
                map.setCenter(area.getCenter(), map.getBoundsZoomLevel(area));
            }
        };

        var placeMarkersNew = function($container, center_map, clear_map, set_callback) {
            if (center_map == undefined) center_map = true;
            if (set_callback == undefined) set_callback = true;
            if (clear_map == undefined) clear_map = true;
            var area = new GLatLngBounds();
            var $interactive_hover_list = $(interactive_hover_list_selector);
            $interactive_hover_list.each(function() {
                $('tr.investment td .control-box', this).each(function() {
                    var $element_control_box = $(this);
                    var latitude = $('.latitude', $element_control_box).text();
                    var longitude = $('.longitude', $element_control_box).text();
                    var key = ""+latitude+":"+longitude;
                    if (!(key in interactive_list_maping)) {
                        interactive_list_maping[key] = [];
                    } else {
                        //console.log('Key already exists: %o->%o',
                        //key, interactive_list_maping[key]);
                        ;
                    }
                    //console.log('Defined hover key: %o', key);
                    /* Highlighting of markers on mouseOver a search
                     * result (from the search results list).
                     */
                    // XXX
                    //console.log('Setting marker hover');
                    $element_control_box.parents('tr').hover(function() {
                        $.each(interactive_list_maping[key], function(i, marker_data) {
                            var image = defined_icons[marker_data['alternate_icon']].image;
                            try {
                            marker_data['marker'].setImage(image);
                            //console.log('%o hover in %o, %o', i,
                            //this, image);
                            } catch (e) {
                            //console.log('hin error: %o', e);
                            ;
                            }
                        });
                    }, function() {
                        $.each(interactive_list_maping[key], function(i, marker_data) {
                            var image = defined_icons[marker_data['point_icon']].image;
                            try {
                            marker_data['marker'].setImage(image);
                            //console.log('%o hover out %o, %o', i,
                            //this, image);
                            } catch (e) {
                            //console.log('hout error: %o', e);
                            ;
                            }
                        });
                    });
                });
            });
            var map = Mapifies.MapObjects.Get($canvas);
            if (clear_map==true) { 
              $canvas.jmap('ClearMap');
            }
            $container.each(function(i) {
                var marker_data = {};
                var point_latitude = $('.latitude', this).text();
                var point_longitude = $('.longitude', this).text();
                var point_G = new GLatLng(point_latitude, point_longitude);
                var point_icon = $('.icon', this).text();
                var alternate_icon = $('.alternate-icon', this).text();
                /*
                if (!i) {
                    //marker_data['center_map'] = true;
                    var map = Mapifies.MapObjects.Get($canvas);
                    map.setCenter(point_G, 13);
                }
                */
                marker_data['pointLatLng'] = [point_latitude, point_longitude];
                var message = $('.point-html', this).html();

                point_title = $('.point-title', this).html();
                if (point_title) {
                  marker_data['pointTitle'] = point_title;

                } else {
                  marker_data['pointTitle'] = "";
                };
                if (point_icon) {
                    marker_data['pointIcon'] = defined_icons[point_icon];
                }

                /* action after clicking on the callback */
                
                if (set_callback == true) {  
                    var gopts = new Object(); 
                    var mouseover = $('.point-mouseover', this).html();          
                    var mouseclick =$('.point-mouseclick', this).html();
                    var hovericon =$('.hover-icon', this).html();
                    var pointicon =$('.icon', this).html();
                    var x_start = 430;

                    /* var offset = $("div.advertMapContainer").offset() */

                    var marker_callback = function(marker, options) {
                        if (mouseclick) {
                          GEvent.addListener(marker, "click", function (e) {
                              var point = map.fromLatLngToContainerPixel(e);
                              var cssobj = getTooltipCoordinates(point);
                              $('#tooltipGMarkerCLick').css(cssobj);
                              showTooltipGMarker(mouseclick);
                          });
                          GEvent.addListener(marker, "mouseout", function (e) {
                            hideTooltipGMarkerSmooth();
                          });
                        };
                        
    
                  if (center_on_markers=="1"){};
                  
                  if (mouseover) {
                          GEvent.addListener(marker, "mouseover", function (e) {
                              if (hovericon) {
                                marker.setImage(defined_icons[alternate_icon].image);
                              };
                              var point = map.fromLatLngToContainerPixel(e);
                              var cssobj = getTooltipCoordinates(point);
                              $('#tooltipGMarkerCLick').css(cssobj);
                              showTooltipGMarker(mouseover);
                          });
                          GEvent.addListener(marker, "mouseout", function (e) {
                              if (hovericon) {
                                marker.setImage(defined_icons[point_icon].image);
                              };
                            
                            showTooltipGMarker(mouseover);
                            hideTooltipGMarkerSmooth();
                          });
                        };

                       //console.log("adding guthenberg:", point_G);
                        //area.extend(point_G);
                        area.extend(marker.getPoint());
                        var maping_key = ""+point_latitude+":"+point_longitude;
                        if (maping_key in interactive_list_maping) {
                            interactive_list_maping[maping_key].push({'marker': marker, 'alternate_icon': alternate_icon, 'point_icon': point_icon});
                        } else {
                            //console.log('maping key not found: %o',
                            //maping_key);
                            ;
                        }
                    };
                };
                $canvas.jmap('AddMarker', marker_data, marker_callback);
            });
           //console.log("coming!", center_map, area, $container.length);
            if (center_map && $container.length) {
               //console.log("ejac");
                dmap = map;
                darea = area;
                map.setCenter(area.getCenter(), map.getBoundsZoomLevel(area));
                dmap.setCenter(darea.getCenter(), dmap.getBoundsZoomLevel(darea));
            }
        };

        placeMarkersNew($('.place-marker-small', $control_box), true, true, false);
        placeMarkersNew($('.place-marker', $control_box), true, false);
       //console.log(center_on_markers);
        if (center_on_markers=="1")
        {
          //console.log("center :}");
          dmap.setCenter(darea.getCenter(), dmap.getBoundsZoomLevel(darea));
          dmap.setZoom(13);
        };
        var feed_query = function(map) {
            var what = active_type;
            var page = 1;
            var bounds = map.getBounds();
            var swLat = bounds.getSouthWest().lat();
            var swLng = bounds.getSouthWest().lng();
            var neLat = bounds.getNorthEast().lat();
            var neLng = bounds.getNorthEast().lng();
            var params = { what: what, page: page, swLat: swLat, swLng: swLng, neLat: neLat, neLng: neLng };
            var map_query = '';
            for (var key in params) {
                var value = params[key];
                map_query += key + '=' + value + '&';
            };
            return map_query
        };
        // handle map movement

        function fix_links() {
            $.map($('a.paginator_link'), function (elem) {
                elem.href = elem.href.replace('/markers/new-wave', '/query');
            });


        };

        var markers_feed_url = $('.feed_url', $control_box).text();
        var results_feed_url = $('.results-feed-url', $control_box).text();
        if (markers_feed_url && results_feed_url) {
            var map = Mapifies.MapObjects.Get($canvas);
            if ($('#searchResultsOnMapSort').length) {
                map.addControl(new SearchMapControlOnBar());
            } else {
                map.addControl(new SearchMapControl());
            }
            GEvent.addListener(map, "moveend", function() {
                if(map.allow_search){
                    hideResults();
                    var map_query = feed_query(map);
                    $('#result_list').load(results_feed_url, map_query, function() {
                        $control_box.load(markers_feed_url, map_query, function() {
                            placeMarkersNew($('.place-marker-small', this), false, true, false);
                            placeMarkersNew($('.place-marker', this), false, false);
                            $('#hidden_paginator').replaceWith($('#hidden_paginator_fake'));
                            $("#hidden_paginator_fake").attr("id", "#hidden_paginator");
                            fix_links();
                        });
                    showResults();
                    });
                }
            });
        }

        // handle inwestycje w okolicy
        //var surroundings_button = $('.surroundings_button', $control_box).text();
        var surroundings_url = $('.surroundings_url', $control_box).text();
        
        /*#ticket #36
         * Sometimes the surrounding investment caused to hide the main ones
         * so it's disabled for now 
        
        if (surroundings_url) {
            //var map = Mapifies.MapObjects.Get($canvas);
            map.setZoom(13);
            var map_query = feed_query(map);
            special_marker = $('.surroundings_special_marker', $control_box).text();
            map_query += '&special_marker='+special_marker;
            $control_box.load(surroundings_url, map_query, function() {
              placeMarkersNew($('.place-marker-small', this), false, true, false);
              placeMarkersNew($('.place-marker', this), false, false);
              $('#paginator_module').replaceWith($('#hidden_paginator_fake'));
              $("#hidden_paginator_fake").attr("id", "#hidden_paginator_fake");
              fix_links();
              map.setZoom(13);
            });
                //return false;
        }
         */ 
        if (center_on_markers=="1")
        {
         //console.log("center :}");
          dmap.setCenter(darea.getCenter(), dmap.getBoundsZoomLevel(darea)-1);
          //if zoom is to close zoom to level 13
          if(dmap.getBoundsZoomLevel(darea)-1 > 14){
        	  dmap.setZoom(13);  
          }
        };

    });//init
});//document ready

