/**
  * Add marker to passed map to passed point location
  *
  * @param map map object
  * @param point location
  * @param customIcon custom icon object
  * @param group group name
  */
function addPointTo(map, point, customIcon, group)
{
    map.map.setCenter(point, map.zoomLevel);
    if (!customIcon) {
        customIcon = new GIcon(map.baseIcon);
    }    
    var marker = new GMarker(point, {
        icon: customIcon
    });
    GEvent.addListener(marker, "click", function() {
        map.panTo(point);
    });
    map.map.addOverlay(marker);
    addMarkerToGroup(map, marker, group);
}

/**
  * Add marker to passed map to passed point location with box filled with html and name
  * If html list element exists, insert infrormation about this point to list
  *
  * @param map map object
  * @param point location
  * @param html box text
  * @param name box name
  * @param infobox_open is infobox open? (only last added to passed map)
  * @param customIcon custom icon object
  * @param group group name
  */
function addHtmlTo(map, point, html, name, infobox_open, customIcon, group)
{
    map.map.setCenter(point, map.zoomLevel);
    if (!customIcon) {
        customIcon = new GIcon(map.baseIcon);
    }
    var marker = new GMarker(point, {
        icon: customIcon
    });
    marker.html = html;
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(marker.html);
        map.map.panTo(point);
    });
    if (name && $('#map_list_' + map.id)) {
        var li = $('<li><a href="#" onclick="return ">' + name + '</a></li>');
        var i = getMarkerGroupSize(map, group);
        li.click(function() {
            gotoMarker(map, map.objects[group][i], 0);
            return false;
        });
        $('#map_list_' + map.id).append(li);
    }
    map.map.addOverlay(marker);
    if (infobox_open) {
        marker.openInfoWindowHtml(html);
    }
    addMarkerToGroup(map, marker, group);
}

/**
 * Add marker to passed group in passed map
 *
 * @param map map object
 * @param marker marker object
 * @param group group name
 */
function addMarkerToGroup(map, marker, group) {
    size = getMarkerGroupSize(map, group);
    map.objects[group][size] = marker;
}

/**
 * Returns size of target group of target map
 * If group doesnt exists, creates new one
 *
 * @param map map object
 * @param group group name
 * @return size of group
 */
function getMarkerGroupSize(map, group) {
    if (!map.objects[group]) {
        map.objects[group] = new Array();        
    }
    return map.objects[group].length;
}

function hideMarkerGroup(map, group) {    
    size = getMarkerGroupSize(map, group);
    for(i = 0; i < size; i ++) {
        map.objects[group][i].hide();
    }
}

function showMarkerGroup(map, group) {
    size = getMarkerGroupSize(map, group);
    for(i = 0; i < size; i ++) {
        map.objects[group][i].show();
    }
}

/**
  * Přidá obyčejný bod bez bubliny na mapu podle adresy
  *
  * bod neni mozne vracet, jelikoz vnorena funkce skonci dyl nez tato volana.
  */
//function addPointToAdress(address, name)
//{
//    if (geocoder)
//    {
//        geocoder.getLatLng(
//            address,
//            function(point)
//            {
//                if (!point) alert(address + " nebyla nalezena");
//                else
//                {
//                    addPointTo(point, name);
//                }
//            }
//            );
//    }
//}

/**
  * Přidá obyčejný bod s bublinou s vloženým html na mapu podle adresy
  *
  * bod neni mozne vracet, jelikoz vnorena funkce skonci dyl nez tato volana.
  */
//function addHtmlToAdress(address, html, name)
//{
//    if (geocoder)
//    {
//        geocoder.getLatLng(
//            address,
//            function(point)
//            {
//                if (!point) alert(address + " nebyla nalezena");
//                else
//                {
//                    addHtmlTo(point, html, name)
//                }
//            }
//            );
//    }
//}

/**
  * Presune se na zadany bod se zadanym zoomem
  */
function gotoPoint(map, point, zoom)
{
    if (zoom)
    {
        map.map.setZoom(zoom);
    }
    map.map.panTo(point);
    return false;
}

/**
  * Presune se na marker se zadanym zoomem
  */
function gotoMarker(map, marker, zoom)
{    
    if (zoom)
    {
        map.map.setZoom(zoom);
    }
    map.map.panTo(marker.getLatLng());
    if (marker.html)
    {
        marker.openInfoWindowHtml(marker.html);
    }
    return false;
}
    