var MaptypeUtils = new function()
{
	var tilesize = new Array();
	var appCopyright = '';
	var copyright = '';
	var iwCnr = 0;
	var iwPnr = 0;
	//TODO: should be in config
	var mapApiName = "";//'MapAPI-1.00_Mercator';
	var mapApiHost = "";//'http://www.mapandroute.de/';
	
	this.MODE_MAP = 0;
	this.MODE_AIR = 1;
	this.MODE_HYBRID = 2;
	this.MODE_BIRDSVIEW = 3;
//	this.MODE_BIRDSVIEWAREA = 4;
	
	this.PREMIUM_ROADMAP_ZOOM = 13;
	this.PREMIUM_AIR_ZOOM = 16;
	this.PREMIUM_HYBRID_ZOOM = 16;
	this.BIRDSVIEWAREA_ZOOM = 18;
	
	this.getRoadmap = function(){
		var aliases = new Array();
		aliases.push('http://m0.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwpr/r');
		aliases.push('http://m1.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwpr/r');
		aliases.push('http://m2.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwpr/r');
		aliases.push('http://m3.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwpr/r');
		return aliases;
	};
	this.getBingRoadmap = function(){
		var aliases = new Array();	
		aliases.push('http://ecn.t0.tiles.virtualearth.net/tiles/r%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t1.tiles.virtualearth.net/tiles/r%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t2.tiles.virtualearth.net/tiles/r%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t3.tiles.virtualearth.net/tiles/r%1?g=304&mkt=de-de&token=%2');
		return aliases;
	};
	this.getAir = function(){
		var aliases = new Array();
		aliases.push('http://a0.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a1.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a2.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a3.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		return aliases;
	};
	this.getBingAir = function(){
		var aliases = new Array();	
		aliases.push('http://ecn.t0.tiles.virtualearth.net/tiles/a%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t1.tiles.virtualearth.net/tiles/a%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t2.tiles.virtualearth.net/tiles/a%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t3.tiles.virtualearth.net/tiles/a%1?g=304&mkt=de-de&token=%2');
		return aliases;
	};
	this.getHybrid = function(){
		var aliases = new Array();
		aliases.push('http://a0.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a1.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a2.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		aliases.push('http://a3.md.mapandroute.de/mapdispatcher/' +iwCnr+ '-' +iwPnr+ '/msiwae/a');
		return aliases;
	};
	this.getBingHybrid = function(){
		var aliases = new Array();	
		aliases.push('http://ecn.t0.tiles.virtualearth.net/tiles/h%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t1.tiles.virtualearth.net/tiles/h%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t2.tiles.virtualearth.net/tiles/h%1?g=304&mkt=de-de&token=%2');
		aliases.push('http://ecn.t3.tiles.virtualearth.net/tiles/h%1?g=304&mkt=de-de&token=%2');
		return aliases;
	};
	
	this.setPropertiesForBing_mapdispatcher = function(map, maptype) {
		maptype.setType('IW_MAPDISPATCHER');
		maptype.setProjection(new IWParallelProjection(map));

		maptype.setTilesizeMeter(tilesize);

		var mapServerConfig = maptype.getTilesServerConfig();
		if(!mapServerConfig)
		{
			mapServerConfig = new IWServerConfig();
		}
		mapServerConfig.setAliases(MaptypeUtils.getBingRoadmap());
		mapServerConfig.setBaseDir(mapApiName);
		mapServerConfig.setImageType('png');
		maptype.setTilesServerConfig(mapServerConfig);
		
		// POIs
		var labelsConfig = maptype.getLabelsServerConfig();
		if(!labelsConfig)
		{
			labelsConfig = new IWServerConfig();
		}

		labelsConfig.setBaseDir(mapApiName);
		labelsConfig.setImageType('gif');
		labelsConfig.setAliases([mapApiHost]);
		maptype.setLabelsServerConfig(labelsConfig);
	};
	
	this.updateTilesAliases = function(map, mapMode, zoom, reloadable)
	{
		var options = map.getOptions(); 

		if(typeof zoom == 'undefined')
			zoom = map.getZoom();
		
		var mapType = null;
		
		// Roadmap
		if(mapMode == this.MODE_MAP)
		{
			options.setBorderTiles(0);
			
			if (zoom >= this.PREMIUM_ROADMAP_ZOOM)
			{
				mapType = roadmap_mapdispatcher;
				copyright = 'Navteq' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getRoadmap();						
				mapType.getTilesServerConfig().setAliases(aliases);
				
			}
			
			if (zoom < this.PREMIUM_ROADMAP_ZOOM)
			{
				mapType = bing_mapdispatcher;
				copyright = 'Bing&nbsp;Maps' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getBingRoadmap();
				mapType.getTilesServerConfig().setAliases(aliases);
				
			}
		}
		
		// Air
		if(mapMode == this.MODE_AIR)
		{
			options.setBorderTiles(1);
			mapType = bing_mapdispatcher;
			if (zoom >= this.PREMIUM_AIR_ZOOM)
			{
				copyright = 'GeoContent' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getAir();
				mapType.getTilesServerConfig().setAliases(aliases);
			}
			
			if (zoom < this.PREMIUM_AIR_ZOOM)
			{
				copyright = 'Bing&nbsp;Maps' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getBingAir();
				mapType.getTilesServerConfig().setAliases(aliases);
			}
		}
		
		// Hybrid
		if(mapMode == this.MODE_HYBRID)
		{
			options.setBorderTiles(1);
			if (zoom >= this.PREMIUM_HYBRID_ZOOM)
			{
				mapType = hybrid_mapdispatcher;
				copyright = 'GeoContent,&nbsp;Navteq' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getHybrid();						
				mapType.getTilesServerConfig().setAliases(aliases);
			}
			
			if (zoom < this.PREMIUM_HYBRID_ZOOM)
			{
				mapType = hybridBing_mapdispatcher;
				copyright = 'Bing&nbsp;Maps' + ",&nbsp;TMCpro";
				var aliases = MaptypeUtils.getBingHybrid();
				mapType.getTilesServerConfig().setAliases(aliases);
			}			
		}

		// Birdsview
		if(mapMode == this.MODE_BIRDSVIEW)
		{
			mapType = mapTypeBirdsview;
			copyright = '';
			map.getOptions().setBorderTiles(0);
		}

		if(map.getCurrentMapType().getName() != mapType.getName())
		{
			if (reloadable)
			{
				map.setCenter(map.getCenter(), zoom, mapType);
			}
		}

		options.setApplicationCopyright(appCopyright + copyright);

		map.triggerOnMapTypeChange();
		
		return mapType;
	};
	
	this.getCopyright = function()
	{
		return copyright;
	};

	this.initMapTypes = function(map, apiName, apiHost)
	{
		mapApiName = apiName;
		mapApiHost = apiHost;
		
		tilesize.push(20037508.352); // 0
		tilesize.push(10018754.176); // 1
		tilesize.push(5009377.088); // 2
		tilesize.push(2504688.544); // 3
		tilesize.push(1252344.272); // 4
		tilesize.push(626172.136); // 5
		tilesize.push(313086.068); // 6
		tilesize.push(156543.034); // 7
		tilesize.push(78271.517); // 8
		tilesize.push(39135.7585); // 9
		tilesize.push(19567.87925); // 10
		tilesize.push(9783.939625); // 11
		tilesize.push(4891.9698125); // 12
		tilesize.push(2445.98490625); // 13
		tilesize.push(1222.992453125); // 14
		tilesize.push(611.4962265625); // 15
		tilesize.push(305.74811328125); // 16
		tilesize.push(152.874056640625); // 17
		tilesize.push(76.4370283203125); // 18
		tilesize.push(38.2185141601563); // 19
		tilesize.push(19.1092570800781); // 20
		
		iwCnr = IWAccessFilter.getCNR();
		iwPnr = IWAccessFilter.getPNR();
		
		var options = map.getOptions();
		appCopyright = options.getApplicationCopyright();
		   
		roadmap_mapdispatcher = new IWMapType(map);
		roadmap_mapdispatcher.setName('roadmap_mapdispatcher');
		roadmap_mapdispatcher.setMinLevel(5);
		roadmap_mapdispatcher.setPreferredLevel(16);
		roadmap_mapdispatcher.setMaxLevel(18);
		roadmap_mapdispatcher.setRequestParameters('&type=roadmap-mar');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, roadmap_mapdispatcher);

		bing_mapdispatcher = new IWMapType(map);
		bing_mapdispatcher.setName('dasoertliche');
		bing_mapdispatcher.setMinLevel(5);
		bing_mapdispatcher.setPreferredLevel(16);
		bing_mapdispatcher.setMaxLevel(18);
		bing_mapdispatcher.setRequestParameters('&type=roadmap-bing');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, bing_mapdispatcher);

		air_mapdispatcher = new IWMapType(map);
		air_mapdispatcher.setName('air_mapdispatcher');
		air_mapdispatcher.setMinLevel(5);
		air_mapdispatcher.setPreferredLevel(16);
		air_mapdispatcher.setMaxLevel(18);
		air_mapdispatcher.setRequestParameters('&type=air-geoc');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, air_mapdispatcher); 
		
		airBing_mapdispatcher = new IWMapType(map);
		airBing_mapdispatcher.setName('airBing_mapdispatcher');
		airBing_mapdispatcher.setMinLevel(5);
		airBing_mapdispatcher.setPreferredLevel(16);
		airBing_mapdispatcher.setMaxLevel(18);
		airBing_mapdispatcher.setRequestParameters('&type=air-bing');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, airBing_mapdispatcher);          
		
		hybrid_mapdispatcher = new IWMapType(map);
		hybrid_mapdispatcher.setName('dastelefonbuch-hybrid');
		hybrid_mapdispatcher.setMinLevel(5);
		hybrid_mapdispatcher.setPreferredLevel(16);
		hybrid_mapdispatcher.setMaxLevel(18);
		hybrid_mapdispatcher.setRequestParameters('&type=air-geoc&type=roadmap-navt');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, hybrid_mapdispatcher);
		
		hybridBing_mapdispatcher = new IWMapType(map);
		hybridBing_mapdispatcher.setName('hybridBing_mapdispatcher');
		hybridBing_mapdispatcher.setMinLevel(5);
		hybridBing_mapdispatcher.setPreferredLevel(16);
		hybridBing_mapdispatcher.setMaxLevel(18);
		hybridBing_mapdispatcher.setRequestParameters('&type=hybrid-bing');
		MaptypeUtils.setPropertiesForBing_mapdispatcher(map, hybridBing_mapdispatcher);

        mapTypeBirdsview = options.getMapTypeByName("birdsview") ;
        mapTypeBirdsview.setMinLevel(18);
        mapTypeBirdsview.setMaxLevel(19) ;
        mapTypeBirdsview.setPreferredLevel(18);
        mapTypeBirdsview.setRequestParameters('&type=bv-blom');

        mapTypeBirdsviewarea = options.getMapTypeByName("birdsviewarea") ;
        mapTypeBirdsviewarea.setMinLevel(5);
        mapTypeBirdsviewarea.setMaxLevel(19);
        mapTypeBirdsviewarea.setPreferredLevel(16);
        //TODO: copyright
        //mapTypeBirdsviewarea.setRequestParameters('&type=bv-blom');
        MaptypeUtils.setPropertiesForBing_mapdispatcher(map, mapTypeBirdsviewarea);
	};
}