// подсказка возле типса ближайшей организации
var near_org_info = '';

var browserWidth = 1000;
var browserHeight = 500;
var browserCenterX = 500;
var browserCenterY = 250;

//-- Устанавливаем размеры рабочей области относительно разрешения экрана (пытаемся)
setScreenResolutions();

// Размеры кусочков изображения.
var tileWidth = 250;
var tileHeight = 250;
// Текущие координаты центра карты (географические).
var geoX = 5800;
var geoY = 8300;
// Текущий уровень масштаб.
var scale = 2;
// Массив масштабов. (название, коэффициент изменения координат - на сколько надо умножить координаты, чтобы получить пиксель)
var scales=new Array();
scales[0]=new Array('6%', 16);
scales[1]=new Array('12%', 8);
scales[2]=new Array('25%', 4);
scales[3]=new Array('50%', 2);
scales[4]=new Array('100%', 1);


// Предыдущие координаты (в пикселях экрана) - для mousemove
var px = null;
var py = null;

var cl_px = null;
var cl_py = null;
// Массив хранящий слоя карты.
var tileDivs=new Array(0);
var tileImg=new Array(0);
var tileDivsN=0; // По горизонтали.
var tileDivsM=0; // По вертикали.
// Массив хранящий объекты помещенные на карту.
var mapObjects = new Array(0);

// Рабочие div
var viewportDiv;
var canvasDiv;
// Параметры get запроса.
var queryParams = null;

// Переменные для хранения ссылок на объекты в которых будет размещена информация.
var objStatusBar = false;
var objLink2View = false;
var objmapCenterInfo = false;

function ver4print() {
  document.getElementById("info").style.display = "none";
  document.getElementById("pano").style.display = "none";
  document.getElementById("footer-stripe").style.display = "none";
  document.getElementById("footer").style.display = "none";
  //document.getElementById("show_find_path").style.display = "none";
  document.getElementById("show_hide_find_path").style.display = "none";
  document.getElementById("tipsList").style.display = "none";
  document.getElementById("legendInfo").style.display = "none";
  document.getElementById("link_to_page").style.display = "none";
  //document.getElementById("viewport").style.height = "100%";

  document.getElementById("logo_div").style.top = document.getElementById("viewport").offsetTop + 20;
  document.getElementById("logo_div").style.left = document.getElementById("viewport").offsetLeft + 90;
  document.getElementById("logo_div").style.display = "block";
  document.getElementById("print").innerHTML = "<a href='#' onClick='ver4view();'>Версия для просмотра</a>";
}

function ver4view() {
  document.getElementById("info").style.display = "block";
  document.getElementById("pano").style.display = "block";
  document.getElementById("footer-stripe").style.display = "block";
  document.getElementById("footer").style.display = "block";
  //document.getElementById("show_find_path").style.display = "block";
  document.getElementById("show_hide_find_path").style.display = "block";
  //document.getElementById("tipsList").style.display = "block";
  document.getElementById("legendInfo").style.display = "block";
  document.getElementById("link_to_page").style.display = "inline";
  //document.getElementById("viewport").style.height = "600px";

  document.getElementById("logo_div").style.display = "none";
  document.getElementById("print").innerHTML = "";
}

// нахождение координат мыши, в переменных tempX и tempY постоянно хранятся координаты.
var IE = document.all ? true:false;
// координаты мыши
var tempX = 0;
var tempY = 0;
function get_mouseXY(e) {
  if (IE) {
    tempX = event.clientX + document.body.scrollLeft;
    tempY = event.clientY + document.body.scrollTop;
  } else {
    tempX = e.pageX;
    tempY = e.pageY;
  }
}
document.onmousemove = get_mouseXY;

/********************************************************************************************
  Служебные функции.
********************************************************************************************/
function mapViewCenter(need){
  var obj=document.getElementById("ViewCenter");
  if( obj )
  switch(need){
    case -1:
      obj.style.left = (browserCenterX - 12) + 'px';
      obj.style.top = (browserCenterY - 12)  + 'px';
    break;
    case 1:
    case true:
      if( obj.style.display == 'block' ){
        obj.style.display = 'none';
      }else{
        obj.style.display = 'block'
      }
    break;
    case 0:
    case false:
    default:
      obj.style.display = 'none';
  }
}


function setScreenResolutions(){
  if( self.screen ){
    width = screen.availWidth
    height = screen.availHeight
  }else if (self.java){
    var jkit = java.awt.Toolkit.getDefaultToolkit();
    var scrsize = jkit.getScreenSize();
    width = scrsize.width;
    height = scrsize.height;
  }
  if (width && height){
    browserWidth = width - 30;
    browserHeight = height - 200;
  }
  browserCenterX = Math.round(browserWidth / 2);
  browserCenterY = Math.round(browserHeight / 2);

} //-- f:.

function parseQueryString() {
    queryParams = {};
    var s=window.location.search;
    if (s!='') {
        s=s.substring( 1 );
        var p=s.split('&');
        for (var i=0;i<p.length;i++) {
            var q=p[i].split('=');
            queryParams[q[0]]=q[1];
            //-- дополнительные фломаты входов
            if(q[0] == 'cps'){
              var q1=q[1].split(',');
              queryParams['x']=q1[0];
              queryParams['y']=q1[1];
              queryParams['s']=2;
            }
            if(q[0] == 'p'){
              var q1=q[1].split('x');
              queryParams['x']=q1[0];
              queryParams['y']=q1[1];
              if( q1.length > 2 ) queryParams['s']=q1[2];
            }
            if(q[0] == 'on'){
              queryParams['view'] = 1;
            }
        }
      if( !queryParams['s'] ) queryParams['s'] = 2;
    }
}

function getQueryParam(p) {
    if (!queryParams) {
        parseQueryString();
    }
    if (queryParams[p]) {
        return queryParams[p];
    } else {
        return '';
    }
}

function findPosX(obj){
	var curleft = 0;
	if(obj.offsetParent)
        while(1){
		curleft += obj.offsetLeft;
		if(!obj.offsetParent) break;
		obj = obj.offsetParent;
	}
	else if(obj.x)	curleft += obj.x;
	return curleft;
}

function findPosY(obj){
	var curtop = 0;
	if(obj.offsetParent)
	while(1){
		curtop += obj.offsetTop;
		if(!obj.offsetParent) break;
		obj = obj.offsetParent;
	}
	else if(obj.y) curtop += obj.y;
	return curtop;
}


function displayStatusBar(){
  if (objStatusBar){
    var msg = "Масштаб: " + scale + " | Текущие координаты (x,y) = " + geoX + "," + geoY;
    objStatusBar.innerHTML = msg;
  }
}

function updateLinkToView(){
  if(objLink2View){
    var url = '/get/?p=';
    objLink2View.href = url + geoX + 'x' + geoY + 'x' + scale;
  }
  if(objLink2ViewYa){
    url = '/get/ya/?p=';
    objLink2ViewYa.href = url + geoX + 'x' + geoY + 'x' + scale;
  }
  if(objmapCenterInfo){
    var s = geoX + 'x' + geoY;
    if( queryParams['extinfo'] ){
      // Определяем координаты центральной точки C в пикселях.
      var cx = Math.floor(geoX / scales[scale][1]);
      var cy = Math.floor(geoY / scales[scale][1]);
      // Определяем номер tile в который попадает точка центра
      var tile_cx = Math.floor(cx / tileWidth);
      var tile_cy = Math.floor(cy / tileHeight);
      s = s + ' ['+ tile_cx + 'x'+ tile_cy +','+scale+']';
    }
    objmapCenterInfo.innerHTML = s;
  }
}
/********************************************************************************************
  Функция загрузки карты. Создание всех необходимых элементов.
********************************************************************************************/
function loadMap() {
  viewportDiv = document.getElementById("viewport");
  if (viewportDiv == null) {
    alert('Ошибка загрузки карты! Если вы видите это сообщение - свяжитесь с нами - office@gorod33.ru');
  } else {
    // Разбираем параметры пришедшие в скрипт.
    var queryParam;
    queryParam = getQueryParam('s');
    if (!isNaN(parseInt(queryParam))) {scale = parseInt(queryParam)};
    queryParam = getQueryParam('x');
    if (!isNaN(parseInt(queryParam))) {geoX = parseInt(queryParam)};
    queryParam = getQueryParam('y');
    if (!isNaN(parseInt(queryParam))) {geoY = parseInt(queryParam)};

    // Устанавливаем размеры окна
    viewportDiv.style.position = 'relative';
    viewportDiv.style.width = browserWidth + 'px';
    viewportDiv.style.height = browserHeight + 'px';
    viewportDiv.style.top = '0px';
    viewportDiv.style.left = '0px';
    viewportDiv.style.zIndex = 1;

    //Создаем буфер из слоев!
    tileDivsN = Math.ceil(browserWidth/tileWidth) + 1;
    tileDivsM = Math.ceil(browserHeight/tileHeight) + 1;
    tileDivs=new Array(tileDivsN);
    tileImg=new Array(tileDivsN);
    for (var i=0; i<tileDivsN; i++){
      tileDivs[i]=new Array(tileDivsM);
      tileImg[i]=new Array(tileDivsM);

      for (var j=0; j<tileDivsM; j++){
        tileDivs[i][j] = document.createElement('div');
        tileDivs[i][j].style.position = 'absolute';
        tileDivs[i][j].style.width = tileWidth + 'px';
        tileDivs[i][j].style.height = tileHeight + 'px';
        tileDivs[i][j].style.border = '0px';
        //tileDivs[i][j].style.border = '1px solid #aaaaaa';
        tileDivs[i][j].style.zIndex = 2;
        tileDivs[i][j].style.display='none';

        //09.04.2008
        //tileImg[i][j] = document.createElement('img');
        ////tileDivs[i][j].appendChild(tileImg[i][j]);
        //tileImg[i][j].style.position = 'absolute';
        //tileImg[i][j].lowsrc='/images/scales/edges-map.png';
        //tileImg[i][j].style.width='100%';
        //tileImg[i][j].style.height='100%';
        //viewportDiv.appendChild(tileImg[i][j]);
        //09.04.2008


        viewportDiv.appendChild(tileDivs[i][j]);
      }
    }
    // Создаем прозрачный div - поверх всех растров - canvasDiv;
    canvasDiv = document.createElement('div');
    canvasDiv.style.position = 'absolute';
    canvasDiv.style.width = browserWidth + 'px';
    canvasDiv.style.height = browserHeight + 'px';
    canvasDiv.style.top = '0px';
    canvasDiv.style.left = '0px';
    canvasDiv.style.border = '1px solid #000000';
    canvasDiv.style.zIndex = 3;
    viewportDiv.appendChild(canvasDiv);
    // Назначаем обработчики событий
    canvasDiv.ondblclick = mouseHandler;
    canvasDiv.onmouseup = mouseHandler;
    canvasDiv.onmousedown = mouseHandler;
    canvasDiv.onmouseout = mouseHandler;
    canvasDiv.onmousemove = null;
    objStatusBar = document.getElementById("label");
    objLink2View = document.getElementById("linkToView");
		objLink2ViewYa = document.getElementById("linkToViewYa");
    objmapCenterInfo = document.getElementById("mapCenterInfo");

    // подгрузка пользовательских значков, если есть параметр um (user map)
  }
  // Создаем zoomer
  createZoomer();
  load_js("/?mod=map_tips&act=user_tips&a=1");
  if ( getQueryParam("um") != "" ) {
    user_map_id = parseInt(getQueryParam("um"));
    load_js("/?mod=map_tips&act=user_tips&vm=1&a=3&umid=" + user_map_id);
  }
  // Сдвигаем карту в начальное положение.
  shiftMap();
  create_near_org_tip();
}



/********************************************************************************************
  Функция сдвига карты в точку geoX, geoY  - в гео координатах координаты нового центра).
********************************************************************************************/
function shiftMapDelta(x, y){
    geoX=geoX + parseInt(x);
    geoY=geoY + parseInt(y);
    shiftMap();
    updateZoomer();
}


function shiftMapTo(x, y, zoom){
  geoX=parseInt(x);
  geoY=parseInt(y);
  zoom=parseInt(zoom);
  if ((-1<zoom)&&(zoom<scales.length)) scale=zoom;
  shiftMap();
  updateZoomer();
}


function shiftMap (){
  // Определяем координаты центральной точки C в пикселях.
  var cx = Math.floor(geoX / scales[scale][1]);
  var cy = Math.floor(geoY / scales[scale][1]);
  // Находим координаты (в пикселях) точки V, попадающей в верхний левый угол Viewport
  var vx = Math.floor(cx - browserWidth/2);
  var vy = Math.floor(cy - browserHeight/2);
  // Определяем номер tile в который попадает точка V верхний левый угол Viewport.
  var tile_vx = Math.floor(vx / tileWidth);
  var tile_vy = Math.floor(vy / tileHeight);
  // Определяем на сколько отстоит от верхнего левого угла этого tile эта точка.
  // На эту величину сдвигаются все tile
  var dx = vx - tile_vx*tileWidth;
  var dy = vy - tile_vy*tileHeight;
  var left, top, right, bottom;
  var tw, th;
  var img_url;

  // Сдвигаем все div на определенную величину.
  for (var i=0; i<tileDivsN; i++){
    for (var j=0; j<tileDivsM; j++){
      //Расчитываем координаты верхнего левого угла tile, относительно viewport.
      left = i*tileWidth - dx;
      top = j*tileHeight - dy;
      //Расчитываем координаты нижнего правого угла tile, относительно viewport.
      right = left + tileWidth;
      bottom = top + tileHeight;

      // Calc real height and width of this tile
      tw = Math.min(right, browserWidth) - Math.max(left, 0);
      th = Math.min(bottom, browserHeight) - Math.max(top, 0) ;
      if ((tw>0)&&(th>0)){

        // "Пересекаем" с VIEWPORT
        tileDivs[i][j].style.left = Math.max(left, 0)+'px';
        tileDivs[i][j].style.top = Math.max(top, 0)+'px';
        tileDivs[i][j].style.width = tw+'px';
        tileDivs[i][j].style.height = th+'px';
        // выставляем backgroundPosition и размер div - чтобы обрезать по размерам div
        // Формат имени файла - /images/scale/vm-i-j-scale
        tileDivs[i][j].style.backgroundPosition = Math.min(left, 0) +  'px ' + Math.min(top, 0)  + 'px';
        img_url = 'url(/images/scales/'+scale+'/vm'+scale+'-'+(tile_vx+i)+'-'+(tile_vy+j)+'.png)';
	//img_url = 'url(/img.php?x='+(tile_vx+i)+'&y='+(tile_vy+j)+'&s='+scale+')';
	if (tileDivs[i][j].style.backgroundImage != img_url){
	   tileDivs[i][j].style.backgroundImage=img_url;
	   //tileDivs[i][j].innerHTML='new ' + i + ' | ' + j;
	}// else {
	//  tileDivs[i][j].innerHTML='loaded ' + i + ' | ' + j;
	//}
	if (tileDivs[i][j].style.display!='block') tileDivs[i][j].style.display='block';
        //09.04.2008
        //img_url = '/images/scales/'+scale+'/vm'+scale+'-'+(tile_vx+i)+'-'+(tile_vy+j)+'.png';
        //tileImg[i][j].src=img_url;
        //tileImg[i][j].style.left = Math.max(left, 0);
        //tileImg[i][j].style.top = Math.max(top, 0);
        //tileImg[i][j].style.width = tw;
        //tileImg[i][j].style.height = th;
        //if (tileImg[i][j].style.display=='none') tileImg[i][j].style.display='block';
        //09.04.2008

      } else {
        tileDivs[i][j].style.display='none';
        //09.04.2008
        //tileImg[i][j].style.display='none';
        //09.04.2008
      }
    }
  }
  // Сдвигаем все объекты на карте.
  shiftMapObjects();
  // Обновляем ссылку.
  updateLinkToView();
  displayStatusBar();
}

var near_org_tip_id = -1;

function create_near_org_tip( is_google ){
  is_google = is_google || false;
  if ( is_google ) {
    
  } else {
    near_org_tip_id = addMapObject("<img src='/images/icons/red-dot.gif'>", 0, 0, 7, 7, true);
    return near_org_tip_id;
  }
}

// при перемещении карты необходимо вызывать эту функцию, чтоб показывать типс ближайшей организации.
function update_near_org_tip(pos_x, pos_y, str ){
  mapObjects[near_org_tip_id][1] = pos_x;
  mapObjects[near_org_tip_id][2] = pos_y;
  near_org_info = "Ближайшая организация: <br><b>" + str + "</b>";
  editMapObject( near_org_tip_id, "<img  onMouseOut='hideOLegend();' onMouseOver='show_legend_near_org(near_org_info)' src='/images/icons/red-dot.gif'>" );
  shiftMapObjects();
}

function editMapObject( ind, inner_html ){
  // Удаляем старый элемент
  mapObjects[ind][0].style.display='none';
  // Создаем новый слой.
  var obj_div = document.createElement('div');
  // Задаем параметры отображения слоя.
  obj_div.style.border = '0px';
  obj_div.style.zIndex = 4;
  obj_div.style.display='none';
  // Задаем координаты отображения слоя.
  obj_div.style.position = 'absolute';
  obj_div.innerHTML = inner_html;
  mapObjects[ind][0] = obj_div;
  viewportDiv.appendChild(obj_div);
}

// х,y - геокординаты положения объекта. Функция возвращает индекс добавленного элемента в массиве.
function addMapObject(obj, x, y, w, h, enabled){
  // Создаем новый слой.
  var obj_div = document.createElement('div');
  // Задаем параметры отображения слоя.
  obj_div.style.border = '0px';
  obj_div.style.zIndex = 4;
  obj_div.style.display='none';
  // Задаем координаты отображения слоя.
  obj_div.style.position = 'absolute';
  obj_div.innerHTML = obj;
  viewportDiv.appendChild(obj_div);
  mapObjects[mapObjects.length] = new Array(5);
  mapObjects[mapObjects.length-1][0] = obj_div;
  mapObjects[mapObjects.length-1][1] = x;
  mapObjects[mapObjects.length-1][2] = y;
  mapObjects[mapObjects.length-1][3] = w;
  mapObjects[mapObjects.length-1][4] = h;
  mapObjects[mapObjects.length-1][5] = enabled; // enabled, disabled
  return mapObjects.length-1;
}


function shiftMapObjects(){
  // Определяем пиксельные координаты углов VIEWPORT (из гео).
  var gx1 = Math.floor((geoX / scales[scale][1]) - browserWidth / 2);
  var gy1 = Math.floor((geoY / scales[scale][1]) - browserHeight / 2);
  var gx2 = gx1 + browserWidth;
  var gy2 = gy1 + browserHeight;

  var i, x1, x2, y1, y2, obj;

  for (i=0; i<mapObjects.length; i++){
    // Определяем пиксельные координаты углов слоя (из гео).
    x1 = Math.floor(mapObjects[i][1] / scales[scale][1]);
    y1 = Math.floor(mapObjects[i][2] / scales[scale][1]);
    x2 = x1 + Math.floor(mapObjects[i][3]/scales[scale][1]);
    y2 = y1 + Math.floor(mapObjects[i][4]/scales[scale][1]);
    // Определяем попадает ли объект в экран - т.е. нужно ли его отображать.
    obj = mapObjects[i][0];

    // ТУТ ПРОВЕРЯЕМ ЛЕЖИТ ЛИ DIV ЦЕЛИКОМ В VIEWPORT !!!
    if ((mapObjects[i][5])&&(gx1<=x1)&&(x1<=gx2)&&(gx1<=x2)&&(x2<=gx2)&&(gy1<=y1)&&(y1<=gy2)&&(gy1<=y2)&&(y2<=gy2)){
      obj.style.left = x1-gx1 + 'px';
      obj.style.top = y1-gy1 + 'px';
      // Масштабируем значек.
      obj.style.width = Math.floor(mapObjects[i][3]/scales[scale][1]) + 'px';
      obj.style.height = Math.floor(mapObjects[i][4]/scales[scale][1]) + 'px';
      obj.style.display='block';
    } else {
      obj.style.display='none';
    }
  }
}

/********************************************************************************************
  Функции обработки событий.
********************************************************************************************/
// если переменная = true, то по событию mouseup, типа происходит событие onClick.
// по событию mousedown переменной присваивается значение true
// по событию mousemove переменной присваивается значение false
var onclick_event = false;

function mouseHandler(mouseEvent)
{
  if (!mouseEvent) mouseEvent = window.event;
  var element = (mouseEvent.target)?mouseEvent.target:mouseEvent.srcElement;
  var mouseX = mouseEvent.clientX - findPosX(canvasDiv) - Math.floor(browserWidth / 2);
  var mouseY = mouseEvent.clientY - findPosY(canvasDiv) - Math.floor(browserHeight / 2);

  if (mouseEvent.type =="mousedown" ) {
    onclick_event = true;
    // Ставим обработчик события onmousemove
    canvasDiv.onmousemove = mouseHandler;
  }

  if (mouseEvent.type == "mouseup" ) {
    // Убираем обработчик события onmousemove
    canvasDiv.onmousemove = null;
    px = null;
    py = null;
    if ( onclick_event ) { // имитация события onClick
      if ( user_points_on ) {
        // вычисляем координаты нажатия мышки
        cl_px = geoX + mouseX*scales[scale][1];
        cl_py = geoY + mouseY*scales[scale][1];
        show_edit_form_um( add_to_usertips( "Маркер " + ( user_tips.length + 1 ), cl_px, cl_py, 1 ), true ); //!!!
        user_points_on = false;
        //map.clearOverlays();
        //create_markers();
      }
    } else { // как только передвинули(!) карту и отпустили мышку, выводим ближайшую организацию
      near_org( geoX, geoY );
    }
  }

  if (mouseEvent.type == "mouseout" ) {
    // Убираем обработчик события onmousemove
    canvasDiv.onmousemove = null;
    px = null;
    py = null;
  }

  //mouseEvent.button не во всех браузерах работает
  if (mouseEvent.type == "mousemove" ) {
    onclick_event = false;
    if ((px!=null) && (py!=null)) {
      // Двигаем координаты ((px - mouseX)- расстояние в экранных пикселях)
      geoX = geoX + (px - mouseX)*scales[scale][1];
      geoY = geoY + (py - mouseY)*scales[scale][1];
      shiftMap();
    }
    px = mouseX;
    py = mouseY;
  }

  if (mouseEvent.type == "dblclick") {
    // Двигаем координаты
    geoX = geoX + mouseX*scales[scale][1];
    geoY = geoY + mouseY*scales[scale][1];
    shiftMap();
  }
}

/********************************************************************************************
  Функции смены масштаба изображения.
********************************************************************************************/
function mapZoomIn(){
  if (scale<scales.length-1){
    scale = scale + 1;
    shiftMap();
    updateZoomer();
  }
}

function mapZoomOut(){
  if (scale>0){
    scale = scale - 1;
    shiftMap();
    updateZoomer();
  }
}

function mapZoomChange(nscale){
  // Проверку бы аргумента сделать!
  if ((0<=nscale)&&(nscale<scales.length)) {
    scale = nscale;
    shiftMap();
    updateZoomer();
  }
}

function mapZoomMin(){
  scale = 0;
  shiftMap();
  updateZoomer();
}

function createZoomer(){
  var zoomer='';
  for(var i=0; i<scales.length; i++) {
        var zoomTo = 'mapZoomChange(' + i +')';
	var zoomImg = 'scale-middle';
	if (i==0){zoomImg = 'scale-top';}
	if (i==scales.length-1){zoomImg = 'scale-bottom';}
        if (i==scale) {
            zoomImg = '<img src="/images/btn/new/'+zoomImg+'-selected.gif" border="0" onclick="'+zoomTo+'"  title="Масштаб ' + scales[i][0] + '" alt="Масштаб ' + scales[i][0] + '"  id="zoomImg' + i + '"/>';
        } else {
            zoomImg = '<img src="/images/btn/new/'+zoomImg+'.gif"  border="0" onclick="'+zoomTo+'"  title="Масштаб ' + scales[i][0] + '" alt=" Масштаб ' + scales[i][0] + '" id="zoomImg' + i + '"/>';
        }
        zoomer = zoomer  + zoomImg ;
  }
  document.getElementById('zoomer').innerHTML = zoomer;
  document.getElementById('zoomer').style.zIndex = 100;
}

function updateZoomer(){
  for(var i=0; i<scales.length; i++) {
    var zoomImg = 'scale-middle';
	if (i==0){zoomImg = 'scale-top';}
	if (i==scales.length-1){zoomImg = 'scale-bottom';}
	// if img exist
        var imgScale = document.getElementById('zoomImg'+i);
	if(imgScale) {
          if (i==scale) {imgScale.src = '/images/btn/new/'+zoomImg+'-selected.gif';}
                   else {imgScale.src = '/images/btn/new/'+zoomImg+'.gif';}
	}
  }
  //!!!
  onChangeScale();
  //!!!
}
