// JavaScript Document

if (!L_TOURISTIC_MAPS_NOT_AVAILABLE_IN_THIS_SCALE) {
  var L_TOURISTIC_MAPS_NOT_AVAILABLE_IN_THIS_SCALE = 'Turistické trasy se zobrazí až od měřítka 1:500000.';
}

if (!L_CYCLO_MAPS_NOT_AVAILABLE_IN_THIS_SCALE) {
  var L_CYCLO_MAPS_NOT_AVAILABLE_IN_THIS_SCALE = 'Cykloturistické trasy se zobrazí až od měřítka 1:500000.';
}

tourmapy.map.engine = 'atlas';
tourmapy.helper.directionsMarkers = [];
tourmapy.helper.directionsPolyline = null;
tourmapy.helper.atlasLayers = [];

tourmapy.icon.Default = A_DEFAULT_ICON;

tourmapy.icon.None = new AIcon({
		fastRollover: false,
		fixPng : true,
		imageSrc : null,
		shadowSrc : null,
		shadowSize : new ASize(0,0),
		iconOffset : new APoint(0,0)
});

tourmapy.helper.getScaleFromZoom = function(level) {
  return 32000000/(Math.pow(2, level-5));
}

tourmapy.map.load = function(divID) {     
  this.beforeLoad(); 
          
  tourmapy.map.set(new AMap(divID));
  
  zoomLevel = tourmapy.params.getInt('z', 8);
  if (zoomLevel > 18) {
    zoomLevel = 18;
  }
  if (zoomLevel < 5) {
    zoomLevel = 5;
  }
 
  this.mapObject.loadMaps(
    new AGeoPoint(tourmapy.params.get('lat', 50), tourmapy.params.get('lon', 15)),
      tourmapy.helper.getScaleFromZoom(zoomLevel)
  );   
     
  this.mapObject.addMapPart(new AMapControl());
  this.overviewPart = new AMapOverview();
  this.mapObject.addMapPart(this.overviewPart);
  
  this.mapObject.addEvent("onUpdateEnd", function() {
    var center = tourmapy.map.get().getGeoCenter();
    center = center.convertTo(ACoordinateSystem.Geodetic);
    tourmapy.params.set('lat', center.x);
    tourmapy.params.set('lon', center.y);
    tourmapy.params.set('z', tourmapy.map.getZoom());
    if (tourmapy.map.objectTypes.length > 0) {
      tourmapy.map.loadObjects();
    }     
    
    for (var i = 0; i < tourmapy.map.layerTypes.length; i++) {
      var id = tourmapy.map.layerTypes[i];
      for (var busId in tourmapy.map.layers[id]) {
        tourmapy.map.removeOverlay(tourmapy.map.layers[id][busId]);
      }
    }
    tourmapy.map.layers = [];
    
    tourmapy.map.showLayers();    
    if(tourmapy.map.overviewPart.div.style.display!='none') tourmapy.map.overviewPart.minimap.moveTo(center);
  });    
  
  this.afterLoad();
}

tourmapy.map.addMarker = function(marker, minZoom) {
  if (!minZoom) {
    var minZoom = 0;
  }
  marker.options.maxZoom = minZoom;
  this.addOverlay(marker);
}

tourmapy.map.addMarkers = function(markers, minZoom) {
  if (!minZoom) {
    var minZoom = 0;
  }
  
  for (var i = 0; i < markers.length; i++) {
    markers[i].options.maxZoom = minZoom;
    this.addOverlay(markers[i]);
  }  
}

tourmapy.map.getZoom = function() {
  var scale = tourmapy.map.get().getCurrentScale();
  var ratioE = Math.log(32000000/scale);
  return 5 + Math.round(ratioE/Math.log(2));
}

tourmapy.map.setZoom = function(level) {
  if (level > 18) level = 18;
  if (level < 5) level = 5;
  
  this.mapObject.zoomTo(
    this.mapObject.getNearestScaleIdx(tourmapy.helper.atlas.getScaleFromZoomLevel(level)), 
    this.mapObject.getGeoCenter(), 
    true, 
    { duration : 100, transition: Fx.Transitions.Quad.easeInOut }
  );
}

tourmapy.helper.atlas.getScaleFromZoomLevel = function(level) {
  return 32000000/(Math.pow(2, level-5));
}

tourmapy.map.checkResize = function() {
  var map = tourmapy.map.get();
  if (map != null) {
    map.update();
  }
}

tourmapy.map.getBounds = function() {
  var gb = tourmapy.map.get().getGeoBounds();
  var sw = gb.southWest.convertTo(ACoordinateSystem.Geodetic);
  var ne = gb.northEast.convertTo(ACoordinateSystem.Geodetic);
  
  return [sw.x, sw.y, ne.x, ne.y];
}

tourmapy.map.pointIsVisible = function(point) {
  if (this.getZoom() > 10) return true;
  var p = point.clone();
  if (p.getCoordinateSystem() != ACoordinateSystem.S42) {
    p = point.convertTo(ACoordinateSystem.S42);
  }  
  return this.mapObject.getGeoBounds().contains(p);
}


tourmapy.map.createMarker = function(point, icon, title, html, options) {
  var opt = {icon: icon, clickable: true, title: title}
  if (options && options.maxZoom) {
    opt.maxZoom = this.mapObject.getNearestScaleIdx(tourmapy.helper.atlas.getScaleFromZoomLevel(options.maxZoom));
  }
  var marker = new AMarker(point, opt);
  if (html) {
    marker.addEvent("onClick", function() {
      marker.showBubble(html, {
        maxHeight: '300px'
        });
    });
  }
  return marker;
}

tourmapy.map.createPoint = function(lat, lng) {
  return new AGeoPoint(lat, lng, ACoordinateSystem.Geodetic);
}

tourmapy.map.createPolyline = function(points, _color, _opacity) {
  if (!_opacity) {
    var _opacity = 0.5;
  }
  if (!_color) {
    var _color = '#0000FF';
  }
  return new APolyline(points, {color: _color, opacity: _opacity});
}

tourmapy.map.createLabel = function(point, caption, html, bgcolor, options) {
  var icon = A_CAPTION_ICON;
  var opacity = 1;
  if (options && options.opacity) {
    opacity = options.opacity;
  }
  if (bgcolor) {
    caption = '<div class="label" style="padding: 2px 5px; display: inline; white-space: nowrap; float: left; text-align: left; background-color: ' + bgcolor +'; color: white; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: bold; font-size: 11px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; z-index: 30; opacity: '+opacity+'">' + caption + '</div>';
    icon = tourmapy.icon.None;
  }
  var opt = {icon: icon, clickable: true, label: caption}
  if (options && options.maxZoom) {
    opt.maxZoom = this.mapObject.getNearestScaleIdx(tourmapy.helper.atlas.getScaleFromZoomLevel(options.maxZoom));
  }
  var marker = new AMarker(point, opt);
  marker.addEvent("onClick", function() {          
    marker.showBubble(html, {
      maxHeight: '300px'
    });
  });
  return marker;
}

tourmapy.map.createBusLabel = function(point, caption, html, bgcolor, options) {
  var icon = A_CAPTION_ICON;
  if (bgcolor) {
    caption = '<div style="padding: 2px 5px; display: inline; white-space: nowrap; float: left; text-align: left; background-color: ' + bgcolor +'; color: white; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: bold; font-size: 11px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; z-index: 30; opacity: 0.7">' + caption + '</div>';
    icon = tourmapy.icon.None;
  }
  var opt = {icon: icon, clickable: true, label: caption}
  if (options && options.maxZoom) {
    opt.maxZoom = this.mapObject.getNearestScaleIdx(tourmapy.helper.atlas.getScaleFromZoomLevel(options.maxZoom));
  }
  var marker = new AMarker(point, opt);
  marker.addEvent("onClick", function() {          
    if (tourmapy.helper.checkboxClick) {
      tourmapy.helper.checkboxClick = false;
    } else {
      marker.showBubble(html, {
        maxHeight: '300px'
      });
    }
  });
  return marker;
}

tourmapy.map.setMapType = function(type) {
  switch (type) {
		case 'photo':
			this.mapObject.setMapType('Letecká');
      break;
		case 'normal':
		default:
			this.mapObject.setMapType('Základní');
			break;
	}
}

tourmapy.map.toggleLayer = function(id, on) {
  var allow = false;
  if (id != 998 && id != 999) {
    if (on) { // toggle on
      if (this.layerTypes.length >= 3) {
        return false;
      }        
      this.addLayer(id);
      this.loadLayers();
    } else { // off
      this.removeLayer(id);
      //this.loadLayers();
    }
      
    return true;
  } else {
    allow = on ? tourmapy.map.layerTypes.length < 2 : true;
    
    if (id == 998) {				
  		var layer = A_TOURISTIC_MAP;
  	} else {
  		var layer = A_CYCLE_MAP;
  	}
    
    if (on) {
      var found = false;
      for (var i = 0; i < tourmapy.map.layerTypes.length; i++) {
        if (tourmapy.map.layerTypes[i] == id) {
          found = true;
          break;
        }
      }
         
      if (allow && !found) {
        tourmapy.map.layerTypes.push(id);      
        if (id == 998) {				
      		if (tourmapy.map.getZoom() < 11) {
      		  alert(L_TOURISTIC_MAPS_NOT_AVAILABLE_IN_THIS_SCALE);
          }
      	} else {
      		if (tourmapy.map.getZoom() < 11) {
            alert(L_CYCLO_MAPS_NOT_AVAILABLE_IN_THIS_SCALE);
          }
      	}
      	for (var i=0; i < tourmapy.helper.atlasLayers.length;i ++) {
      		if (tourmapy.helper.atlasLayers[i] == layer) {
      			return true;
      		}
      	}
        tourmapy.helper.atlasLayers.push(layer);
      }
    } else { // off
      var newLayerTypes = [];
      for (var i = 0; i < tourmapy.map.layerTypes.length; i++) {
        if (tourmapy.map.layerTypes[i] != id) {
          newLayerTypes.push(tourmapy.map.layerTypes[i]);
        }
      }
      tourmapy.map.layerTypes = newLayerTypes;
      
      var newLayers = new Array();
    	for (var i = 0; i < tourmapy.helper.atlasLayers.length; i++) {
    		if (tourmapy.helper.atlasLayers[i] != layer) {
    			newLayers.push(tourmapy.helper.atlasLayers[i]);
    		}
    	}
    	tourmapy.helper.atlasLayers = newLayers;
    }
    tourmapy.map.get().registerLayers(tourmapy.helper.atlasLayers);
  }
  
  return allow;
}

tourmapy.map.addOverlay = function(overlay) {
  try {
    var hidden = overlay.isHidden();
  } catch (e) {
    var hidden = false;
  }       
  if (!hidden) {    
    if (!overlay._added) this.mapObject.addOverlay(overlay);
  } else {
    overlay.show();
  }
}

tourmapy.map.removeOverlay = function(overlay) {
  if (overlay) {
    if (overlay.hide) overlay.hide();  
    else if (overlay.remove) overlay.remove();  
  }
}


/* Routing */

tourmapy.routing.load = function(elementID) {
  var element = document.getElementById(elementID);
  this.directions = new google.maps.Directions(null, element);
  
  google.maps.Event.addListener(this.directions, 'load', function() {    
    if (tourmapy.helper.directionsPolyline !== null && tourmapy.helper.directionsPolyline.remove) {
      tourmapy.helper.directionsPolyline.remove();
    }
    var gPoly = tourmapy.routing.get().getPolyline();
    var aVertices = [];
    var cnt = gPoly.getVertexCount();
    for (var i = 0; i < cnt; i++) {
      var vertex = gPoly.getVertex(i);
      aVertices.push(tourmapy.map.createPoint(vertex.lat(), vertex.lng()));
    }
    var aPoly = new APolyline(aVertices, {color: 'blue', opacity: 0.5});
    tourmapy.map.addOverlay(aPoly);
    tourmapy.helper.directionsPolyline = aPoly;
    tourmapy.map.get().setBestZoomAndCenter(aVertices);
    tourmapy.helper.directionsMarkers.push(new AMarker(aVertices[0], {label: 'A'}));
    tourmapy.map.addOverlay(tourmapy.helper.directionsMarkers[0]);
    if (aVertices.length > 1) {          
      var nr = tourmapy.routing.get().getNumRoutes();
      for (var i = 0; i < nr; i++) {
        var r = tourmapy.routing.get().getRoute(i);
        var latLng = r.getEndLatLng();        
        var point = tourmapy.map.createPoint(latLng.lat(), latLng.lng());
        tourmapy.helper.directionsMarkers[i+1] = new AMarker(point, {label: tourmapy.utilities.alphabet[i+1].toUpperCase()});
        tourmapy.map.addOverlay(tourmapy.helper.directionsMarkers[i+1])
      } 
      /*tourmapy.helper.directionsMarkers[1] = new AMarker(aVertices[cnt-1], {label: 'B'});
      tourmapy.map.addOverlay(tourmapy.helper.directionsMarkers[1]);*/
    }
       
  });
  this.initialize();
}


tourmapy.routing.clear = function() {
  this.directions.clear();
  this.waypoints = [];
  if (tourmapy.helper.directionsPolyline !== null && tourmapy.helper.directionsPolyline.remove) {
    tourmapy.helper.directionsPolyline.remove();
  }
  tourmapy.helper.directionsPolyline = null;
  
  for (var i = 0; i < tourmapy.helper.directionsMarkers.length; i++) {
    tourmapy.helper.directionsMarkers[i].remove();
    delete tourmapy.helper.directionsMarkers[i];
  }  
  tourmapy.helper.directionsMarkers = [];
}

/* Custom map parts */



var AMapOverview = AMapPartBase.extend({

    options: {
    },

    mapPartInit: function(map, wrapper){
        this.map = map;
        this.wrapper = wrapper;
        this.createDiv();
    },

    createDiv: function() {
        this.maximize = new Element("div")
            .setStyles('display: none; width:13px; height:13px; background: white; border-top: 1px solid silver; border-left: 1px solid silver; background: url(/resource/img/maximize_minimap.png);')
            .injectInside(this.wrapper);
        this.maximize.setAttribute('id', 'minimap_maximize');
        this.maximize.setAttribute('class', 'clickable');
        
        this.div = new Element("div")
            .setStyles('width:111px; height:111px; background: white; border-top: 1px solid silver; border-left: 1px solid silver; padding: 7px 0 0 7px;')
            .injectInside(this.wrapper);
            
        this.minimize = new Element("div")
            .setStyles('z-index: 15; bottom: 0; right: 0; position: absolute; width:13px; height:13px; background: white; border-top: 1px solid silver; border-left: 1px solid silver; background: url(/resource/img/minimize_minimap.png);')
            .injectInside(this.div);
        this.minimize.setAttribute('class', 'clickable');
        
        this.div.setAttribute('id', 'minimap');        
        
        this.div2 = new Element("div")
            .setStyles('width:111px; height:111px; background: white;  border-top: 1px solid silver; border-left: 1px solid silver;')
            .injectInside(this.div);        
            
        this.minimize.onclick = function() {
          document.getElementById('minimap').style.display = "none";
          document.getElementById('minimap_maximize').style.display = ""
        }
        
        
        
        this.maximize.onclick = function() {
          document.getElementById('minimap').style.display = "";
          document.getElementById('minimap_maximize').style.display = "none"
          tourmapy.map.overviewPart.minimap.moveTo(tourmapy.map.get().getGeoCenter())
        }
        
        
            
        this.minimap = new AMap(this.div2, {showAtlasLogo: false, zoomingEnabled: false, draggingEnabled: false});
        this.minimap.loadMaps(this.map.getGeoCenter());  
               
    },    

    // pčepsaná metoda, vrací novou výchozí pozici web partu
    getDefaultPosition: function(){
        return new APosition(ACorner.RIGHT_BOTTOM, new ASize(0,0));
    }
});

/* Custom overlays */
