
// iwMiniMap - Copyright (C) 2010 by infoware GmbH

MiniMap = {
  loadedUrl: 'http://iw.mapandroute.de/MiniMap/MiniMap?imagesource=bing&resulttype=js&',
  loaderId: null,
  imageContainer: null,
  imagePOI: null,
  //imageMAP: null,
  imagePOIcoords: [],
  projectionMapping: {},
  urlparams: ' vnr pnr width height projection margin displace symbolset bingmaxlod ',
  showOptions: {},
  tileOptions: { center:{lon:0,lat:0},lod:0,token:''},
  callbackMapLoaded: null,
  nearbyMidpoint: [],
  ISIE6: false,
  tileSrvIdx: 0,
  
  MSTILESOURCE: 'http://ecn.t%TS%.tiles.virtualearth.net/tiles/r%QK%.png?g=353&mkt=de-de&token=%TOKEN%',
  MAXLATITUDE: 85.05112878,
  MINLATITUDE: -85.05112878,
  
  
  loaded: function() {
	if (typeof(iwMinimapResponse) == 'function') {
	  var res = iwMinimapResponse();
	  if (this.ISIE6) {
		this.imagePOI.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + res.poiurl + '")';
	  } else {
		this.imagePOI.style.backgroundImage = 'url(' + res.poiurl + ')';
	  }
	  this.imagePOIcoords = res.coords;
	  if (res.searchmiddlepointpixel.length == 2) {
		this.nearbyMidpoint = res.searchmiddlepointpixel;
	  } else {
		this.nearbyMidpoint = [ this.showOptions.width >> 1, this.showOptions.height >> 1 ];
	  }
	  if (!!res.centrumWGS84 && res.centrumWGS84.length == 2) {
		this.tileOptions.center.lon = res.centrumWGS84[0];
		this.tileOptions.center.lat = res.centrumWGS84[1];
		this.tileOptions.token = res.bingtoken[0] || '';
		this.tileOptions.lod = res.bingzoomlevel[0] || 8;
		this.loadTiles();
	  }
	  this.drawNearbyMidpoint();
	}
	var h = document.getElementsByTagName('head');
	var o = document.getElementById(this.loaderId); 
	if (h.length && o !== null) {
		h[0].removeChild(o);
		this.loaderId = null;
	}
  },
  show: function(hitlist, container, options) {
	if (typeof container != 'string')
	  return;
	var showop = {};
	for (var k in options) {
	  showop[k] = options[k];
	}
	showop.vnr = options.vnr || '0';
	showop.pnr = options.pnr || '0';
	showop.width = options.width || 200;
	showop.height = options.height || 200;
	showop.projection = options.projection !== null ? this.projectionMapping[options.projection] : 'lcc_tao';
	showop.margin = options.margin || 10;
	showop.displace = options.displace || '';
	showop.symbolset = options.symbolset || '';
	showop.zindex = parseInt(options.zindex, 10) || 20;
	showop.bingmaxlod = options.bingmaxlod || '';
	showop.containerId = container;
	
	this.showOptions = showop;

	params = [];
	for(k in showop) {
	  if (this.urlparams.indexOf(' ' + k + ' ') < 0)
		  continue;
	  params.push(k + '=' + showop[k]);
	}
	params = params.join('&');
	
	
	// prepare hitlist
	if (!!hitlist && !(hitlist instanceof Array)) {
	  return;
	}
	strHitlist = [];
	for(var idx = 0; idx < hitlist.length; idx++) { 
	  if (!(hitlist[idx] instanceof IWCoordinate))
		  return;
	  strHitlist.push(hitlist[idx] == IWCoordinate.EMPTY ? '' : hitlist[idx].getX() + ',' + hitlist[idx].getY());
	}
	strHitlist = '&hitlist=' + strHitlist.join(';');
	
	// nearbysearch
	if (!!showop.centerPinCoordinate && showop.centerPinCoordinate instanceof IWCoordinate &&
		showop.centerPinCoordinate != IWCoordinate.EMPTY) {
	  strHitlist += '&searchmiddlepoint=' + showop.centerPinCoordinate.getX() + ',' + showop.centerPinCoordinate.getY();
	}
	
	// prepare container
	container = document.getElementById(container);
	this.imageContainer = container;
	container.innerHTML = '';
	container.style.position = 'relative';
	container.style.overflow = 'hidden';

/*@cc_on
	if (@_jscript_version==5.6 || (@_jscript_version==5.7 && navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1))
	  this.ISIE6 = true;
@*/

	// poi image
	var img = document.createElement('div');
	img.style.position = 'absolute';
	img.style.zIndex = showop.zindex;
	img.style.width = showop.width + 'px';
	img.style.height = showop.height + 'px';
	img.style.backgroundRepeat = 'no-repeat';
	container.appendChild(img);
	this.imagePOI = img;

	var h = document.getElementsByTagName('head');
	if (h.length && (!document.contentType || document.contentType == "text/html")) {
	  var s = document.createElement('script');
	  s.type = 'text/javascript';
	  s.language = 'javascript';
	  this.loaderId = 'minimap_' + (new Date().getTime());
	  s.id = this.loaderId;
	  var url = this.loadedUrl;
	  s.src = url + params + strHitlist + '&rnd=' + Math.floor(900000 * Math.random() + 100000);
	  if (navigator.userAgent.indexOf("IE") >= 0) {
		s.onreadystatechange = function() {
		  if (s && ("loaded" == s.readyState || "complete" == s.readyState)) {
			s.onreadystatechange = null;
			MiniMap.loaded();
		  }
		};
	  } else {
		s.onload = function() {
		  s.onload = null;
		  MiniMap.loaded();
		};
	  }
	  h[0].appendChild(s);
	}
  },
  highlightPOI: function(index) {
	var dv = document.getElementById('minimapPOI');
	if (index < 0 ) {
	  if (!dv)
		return;
	  dv.parentNode.removeChild(dv);
	  return;
	}
	var crds = this.imagePOIcoords[index];
	if (crds == null || !crds instanceof Array || crds.length < 2)
	  return;
	var created = false;
	if (!dv) {
	  var dv = document.createElement('div');
	  dv.id = 'minimapPOI';
	  dv.style.position = 'absolute';
	  dv.style.zIndex = this.showOptions.zindex+1;
	  dv.style.width = this.showOptions.poiWidth +'px';
	  dv.style.height = this.showOptions.poiHeight + 'px';
	  dv.style.background = 'url("'+this.showOptions.poiSet+'") no-repeat';
	  created = true;
	}
	var xpos = crds[0] - (this.showOptions.poiWidth >> 1);
	var ypos = crds[1] - (this.showOptions.poiHeight >> 1);
	dv.style.left = xpos + 'px';
	dv.style.top = ypos + 'px';
	dv.style.backgroundPosition = '-' + (index * this.showOptions.poiWidth) + 'px 0';
	if (created) {
	  var container = document.getElementById(this.showOptions.containerId);
	  container.appendChild(dv);
	}
  },
  drawNearbyMidpoint: function() {
	if (!this.showOptions.centerPinImage)
	  return;
	var img = document.getElementById('minimapNMP');
	var created = !img;
	if (created) {
	  img = document.createElement('img');
	  img.style.position = 'absolute';
	  img.style.zIndex = this.showOptions.zindex + 2;
	  img.style.left = '-100px';
	  img.style.top = '-100px';
	  img.style.border = '0';
	  img.onload = function(e) {
		var ev = e || window.event;
		var target = ev.target || ev.srcElement;;
		var dm = { w: target.width, h: target.height };
		var offset = !!MiniMap.showOptions.centerPinHotspot ? MiniMap.showOptions.centerPinHotspot : [ dm.w >> 1, dm.h >> 1];
		target.style.left = (MiniMap.nearbyMidpoint[0] - offset[0]) + 'px';
		target.style.top = (MiniMap.nearbyMidpoint[1] - offset[1]) + 'px';
	  }
	}
	if (created) {
	  var container = document.getElementById(this.showOptions.containerId);
	  container.appendChild(img);
	}
	img.src = this.showOptions.centerPinImage;	
  },
  loadTiles: function() {
	var width = this.showOptions.width;
	var height = this.showOptions.height;
	var lat = this.tileOptions.center.lat;
	var lon = this.tileOptions.center.lon;
	var lod = this.tileOptions.lod;
	if (lat == NaN || lon == NaN || lod == NaN) {
		return;
	}
	var xy = this.latLongToPixelXY(lat, lon, lod);
	// xy[1] -= 5;
	
	// Offset LeftTop
	xy[0] -= width >> 1;
	xy[1] -= height >> 1;
	var tileCoord = {x: xy[0] >> 8, y: xy[1] >> 8};
	var offset = {x : -(xy[0] & 255), y: -(xy[1] & 255)};

	var container = document.getElementById(this.showOptions.containerId);
	//container.innerHTML = '';
	var pos = {
		py : offset.y,
		ty : tileCoord.y
	};
	while (pos.py < height) {
		pos.px = offset.x;
		pos.tx = tileCoord.x;
		while (pos.px < width) {
			var img = document.createElement('img');
			img.style.position = 'absolute';
			img.style.left = pos.px + 'px';
			img.style.top = pos.py + 'px';
			container.appendChild(img);
			img.src = this.makeTileUrl(pos.tx, pos.ty, lod, this.tileOptions.token);
			pos.px += 256;
			pos.tx++;
		}
		pos.py += 256;
		pos.ty++;
	}
  },
  makeTileUrl: function(tileX, tileY, levelOfDetail, token) {
	this.tileSrvIdx = this.tileSrvIdx == 3 ? 0 : this.tileSrvIdx + 1;
	var quadKey = this.tileXYToQuadKey(tileX, tileY, levelOfDetail);
	return this.MSTILESOURCE.replace(/%TS%/, this.tileSrvIdx).replace(/%QK%/, quadKey).replace(/%TOKEN%/, token);
  },
  clip : function (n, minValue, maxValue) {
	  return Math.min(Math.max(n, minValue), maxValue);
  },
  mapSize : function (levelOfDetail) {
	  return 256 << levelOfDetail;
  },
  latLongToPixelXY : function(latitude, longitude, levelOfDetail) {
	  latitude = this.clip(latitude, this.MINLATITUDE, this.MAXLATITUDE);
	  longitude = this.clip(longitude, -180, 180);

	  var x = (longitude + 180) / 360; 
	  var sinLatitude = Math.sin(latitude * Math.PI / 180);
	  var y = 0.5 - Math.log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);

	  var mapSize = this.mapSize(levelOfDetail);
	  var pixelX = Math.round(this.clip(x * mapSize + 0.5, 0, mapSize - 1));
	  var pixelY = Math.round(this.clip(y * mapSize + 0.5, 0, mapSize - 1));
	  return [pixelX, pixelY];
  },
  tileXYToQuadKey : function (tileX, tileY, levelOfDetail) {
	  var quadKey = "";
	  for (var i = levelOfDetail; i > 0; i--)
	  {
		  var digit = '0';
		  var mask = 1 << (i - 1);
		  if ((tileX & mask) != 0) {
			  digit++;
		  }
		  if ((tileY & mask) != 0) {
			  digit++;
			  digit++;
		  }
		  quadKey += digit;
	  }
	  return quadKey;
  }
}

if (typeof IWCoordinate == 'undefined') {
  function IWCoordinate(x, y) {
	var _x = parseFloat(x);
	var _y = parseFloat(y);
	if (typeof y == 'undefined') {
	  _x = _y = 0;
	}
	this.getX = function() {
	  return _x;
	};
	this.setX = function(x) {
	  _x = x;
	};
	this.getY = function() {
	  return _y;
	};
	this.setY = function(y) {
	  _y = y;
	};
	this.toString = function () {
	  return "(" + _x + "/" + _y + ")";
	};
  }
}
if (!IWCoordinate.WGS84) {
  IWCoordinate.EMPTY = new IWCoordinate(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);
  IWCoordinate.WGS84 = 'WGS84';
  IWCoordinate.LCC = 'LCC_EUROPE';
  IWCoordinate.LCC_TAO = 'LCC_TAO';
  IWCoordinate.MERCATOR = 'MERCATOR';
}
MiniMap.projectionMapping[IWCoordinate.WGS84] = 'wgs84';
MiniMap.projectionMapping[IWCoordinate.LCC] = 'lcc_europe';
MiniMap.projectionMapping[IWCoordinate.LCC_TAO] = 'lcc_tao';
MiniMap.projectionMapping[IWCoordinate.MERCATOR] = 'mercator';
