//[k]    copyright Actis Wundermann 2009
//[k] класс реализует контрол произвольного вида
function GActisMapBug(){}

GActisMapBug.prototype = new GControl();

GActisMapBug.prototype.initialize = function(a) {
  var b = document.createElement("div");

  b.id='GActisMapBug';
  b.style.zIndex=25500;
  b.innerHTML='+ <a href="http://actis.ru" style="display: inline; font: 12px arial; text-decoration: none; padding: 4px; border: 1px dotted black; color: black;">Actis Wunderman</a>';
  a.getContainer().appendChild(b);
  var c=1;
  var d=document.getElementById(b.id);
  if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+c*100+')';}
  if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
  if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
  if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}
  a.GActisMapBugged=1;

  a.getContainer().appendChild(b);
  return b;
}

GActisMapBug.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(65, 5));
}

GActisMapType.prototype.addBug=function(a){
  if(!a.GActisMapBugged){
        a.addControl(new GActisMapBug());
  }
}

function GActisMapType(a, baseUrl, ext, levels){

	//[k] добавление произвольного контрола, пока заблокировано
	//[k] this.addBug(a);

	var copyCollection = new GCopyrightCollection('');
	var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-10, -10), new GLatLng(10, 10)), 0, "");
	copyCollection.addCopyright(copyright);

	var tilelayers = [new GTileLayer(copyCollection, 0, levels-1)];
	tilelayers[0].getTileUrl = CustomTiles(baseUrl, ext, levels);
	return new GMapType(tilelayers, new EuclideanProjection(18), "GActisMap", {errorMessage:"Изображение для этого участка и разрешения недоступно, извините."});
}

GActisMapMultiMapType.prototype.addBug=function(a){
  if(!a.GActisMapBugged){
        a.addControl(new GActisMapBug());
  }
}

function GActisMapMultiMapType(a, baseUrl, mapIds, ext, tilesPerSide, levels){
	//[k] добавление произвольного контрола, пока заблокировано
	//[k] this.addBug(a);
        var copyCollection = new GCopyrightCollection('GActisMap');
        var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-10, -10), new GLatLng(10, 10)), 0, "");
        copyCollection.addCopyright(copyright);
        var tilelayers = [new GTileLayer(copyCollection, 0, levels)];
        tilelayers[0].getTileUrl = MultiCustomTiles(baseUrl, mapIds, ext, tilesPerSide, levels);
        return new GMapType(tilelayers, new EuclideanProjection(18), "GActisMap", {errorMessage:"Изображение для этого участка и разрешения недоступно, извините."});

}

//[k] функция реализует адресацию картинок для карты
function CustomTiles(baseUrl, ext, levels){
	function CustomGetTileUrl(tile,zoom) {
		//[k] так как нам пока что нет нужды делать фрагментарные наложения, весь функционал отключен, возвращается пустая картинка
		/*/[k] var tilesPerSide = Math.pow(2, zoom);
		if(zoom >= 0 && zoom < levels && tile.x >= 0 && tile.y >= 0 && tile.x < tilesPerSide && tile.y < tilesPerSide){
				var n = tile.y * tilesPerSide + tile.x;
				var newBaseUrl = baseUrl.replace(/http:\/\/mt.GActisMap.com\//, "http://mt" + n % 3 + ".GActisMap.com/");
				return newBaseUrl + "/tile-" + zoom + "-" + n + "." + ext;
		}else{*/
			return "/media/system/maps/bg.png";
		//[k] }
	};

	return CustomGetTileUrl;
}

function MultiCustomTiles(baseUrl, mapIds, ext, tilesPerSide, levels){
        function MultiCustomGetTileUrl(tile,zoom) {
		//[k] так как нам пока что нет нужды делать фрагментарные наложения, весь функционал отключен, возвращается пустая картинка
		/*/[k]
			var newTilesPerSide = Math.pow(2, zoom-3);
                if(zoom >= 0 && zoom < levels + 3 && tile.x >= 0 && tile.y >= 0 && tile.x < tilesPerSide*newTilesPerSide && tile.y < tilesPerSide*newTilesPerSide){
			zoom -= 3;
                	var n = Math.floor(tile.y/newTilesPerSide) * tilesPerSide + Math.floor(tile.x/newTilesPerSide);
			var mapId = mapIds[n];
			var CustomGetTileUrl = CustomTiles(baseUrl + '/' + mapId, ext, levels);
			tile.x -= newTilesPerSide*Math.floor(tile.x/newTilesPerSide);
			tile.y -= newTilesPerSide*Math.floor(tile.y/newTilesPerSide);
			return CustomGetTileUrl(tile,zoom);
                }else{*/
                        return "/media/system/maps/bg.png";
                //[k] }
        };

        return MultiCustomGetTileUrl;
}

      //[k] ====== создание евклидовой проекции для плоской карты ======
      //[k] конструктор
      function EuclideanProjection(a){
        this.pixelsPerLonDegree=[];
        this.pixelsPerLonRadian=[];
        this.pixelOrigo=[];
        this.tileBounds=[];
        var b=256;
        var c=1;
        for(var d=0;d<a;d++){
          var e=b/2;
          this.pixelsPerLonDegree.push(b/360);
          this.pixelsPerLonRadian.push(b/(2*Math.PI));
          this.pixelOrigo.push(new GPoint(e,e));
          this.tileBounds.push(c);
          b*=2;
          c*=2
        }
      }

      //[k] прицепляем к GProjection()
      EuclideanProjection.prototype=new GProjection();


      //[k] метод преобразует геокоординаты в пиксели
      EuclideanProjection.prototype.fromLatLngToPixel=function(a,b){
        var c=Math.round(this.pixelOrigo[b].x+a.lng()*this.pixelsPerLonDegree[b]);
        var d=Math.round(this.pixelOrigo[b].y+(-2*a.lat())*this.pixelsPerLonDegree[b]);
        return new GPoint(c,d);
      };

      //[k] метод преобразует пиксели обратно
      EuclideanProjection.prototype.fromPixelToLatLng=function(a,b,c){
        var d=(a.x-this.pixelOrigo[b].x)/this.pixelsPerLonDegree[b];
        var e=-0.5*(a.y-this.pixelOrigo[b].y)/this.pixelsPerLonDegree[b];
        return new GLatLng(e,d,c);
      };

      //[k] проверяет что y в доступном диапазоне
      EuclideanProjection.prototype.tileCheckRange=function(a,b,c){
        var d=this.tileBounds[b];
        if (a.y<0||a.y>=d) {
          return false;
        }

        if(this.pan && (a.x<0||a.x>=d)){
          a.x=a.x%d;
          if(a.x<0){
            a.x+=d;
          }
        }
        return true
      }

//[k] метод возвращает ширину tilespace
	EuclideanProjection.prototype.getWrapWidth=function(zoom)
	{
		if(this.pan)
		{
			return this.tileBounds[zoom]*256;
		}
		else
		{
			return this.tileBounds[zoom]*2048;
		}
	}

	EuclideanProjection.prototype.setPanoramic=function(pan)
	{
		this.pan = pan;
	}


