var curScale = 0;

function init(width, height, lang)
{
 $("map").onclick = (lang == "en" ? doItEN : doItRU);
 document.onkeypress = clearInfo;
 setCursor("zoomout");
 var map = $("mapdiv");

 var incx = Math.floor(width / 10);
 var incy = Math.floor(height / 10);
 Drag.init(map, null, null, null, null, null, false, false,
    function(x) { return Math.floor(x / incx) * incx; },
    function(y) { return Math.floor(y / incy) * incy; }
 );
 Drag.suspend(map);
 map.onDragEnd = function(x, y) {
    if (x == 0 && y == 0) return;
    var params = {
      mode: 'move',
      cx: $('cx').value * 1.0 - $('zoom').value * x / width,
      cy: $('cy').value * 1.0 + $('zoom').value * y / width,
      scale: curScale,
      zoom: $('zoom').value,
      reg: $('reg').value,
      layer: getLayers()
    }
    ajaxCaller.postForXML("Default.aspx", params, onMapLoaded);
 }
}

function stopDrag()
{
 Drag.suspend($("mapdiv"));
}

function startDrag()
{
 Drag.resume($("mapdiv"));
}

function onInfoLoaded(text, headers, context)
{
 var container = $("mapcont");
 var legend = $("legend");
 legend.style.left = 0;
 legend.style.top = 0;
 legend.style.height = "auto";
 legend.style.width = "auto";
 legend.style.display = "block";

 $("infotext").innerHTML = text;

 /* Account for paddings and borders (see styles) */
 if (document.all) {
    fudgeX = -8; fudgeY = -4;
 }
 else {
    fudgeX = -4; fudgeY = -2;
 }
 
 var crossOffset = (legend.offsetHeight > container.offsetHeight ? -32 : -20);
 $("cross").style.top = "1px";
 $("cross").style.left = Math.min(legend.offsetWidth, container.offsetWidth) + crossOffset + 16 + "px";

 legend.style.width = Math.min(legend.offsetWidth + fudgeX + 16, container.offsetWidth) + "px";
 legend.style.height = Math.min(legend.offsetHeight, container.offsetHeight) + fudgeY + "px";

 var x = context.x;
 var offsetX = Math.max(container.offsetWidth - legend.offsetWidth, 0);
 if (x > offsetX) x = offsetX;

 var y = context.y;
 var offsetY = container.offsetHeight - legend.offsetHeight;
 if (offsetY < 0) {
    y = 0;
 }
 else if (y > offsetY) y = offsetY;
 legend.style.left = x + "px";
 legend.style.top = y + "px";
}

function onMapLoaded(xml)
{
 $('waiting').style.display = "none";
 var map = xml.documentElement;
 if (map == null || map.tagName != "MAP") return;
 $('cx').value = map.getAttribute('cx');
 $('cy').value = map.getAttribute('cy');
 $('zoom').value = map.getAttribute('zoom');
 var mapDiv = $('mapdiv');
 mapDiv.style.left = mapDiv.style.top = 0;
 setScale(map.getAttribute('scale'));
 $('searchResults').style.display = "none";
 $('notFound').style.display = "none";
 $('legend').style.display = "none";
 $('panelMap').style.display = "block";

 ctx = map.getAttribute('ctx');
 
 if (map.hasChildNodes) {
    for (var i = 0, children = map.childNodes, len = children.length; i < len; ++i) {
        if (children[i].tagName.toLowerCase() == "img") {
           $('map').src = children[i].firstChild.nodeValue;
           break;
        }
    }
 }
}

function onSearchResultsLoaded(xml)
{
 var found = false;
 var node = xml.documentElement.firstChild.firstChild;
 if (node != null) {
    var srch = $('searchResults');
    var inner = srch.firstChild;
    if (inner != null) srch.removeChild(inner);
    inner = $C('DIV');
    inner.className = "srchres";
    if (node.tagName == "STREETS") {
       found = showObjects(inner, node, 's');
       node = node.nextSibling;
    }
    if (node != null && node.tagName == "METROS") {
       found |= showObjects(inner, node, 'm');
    }
    srch.appendChild(inner);
 }
 $('panelMap').style.display = "none";
 if (found) {
    $('notFound').style.display = "none";
    $('searchResults').style.display = "block";
 }
 else {
    $('searchResults').style.display = "none";
    $('notFound').style.display = "block";
 }
}

function search()
{
 var params = {
   mode: 'srch',
   qry: $('txtSearch').value,
   reg: $('reg').value,
   layer: getLayers()
 }
 ajaxCaller.postForXML("Default.aspx", params, onSearchResultsLoaded);
 return false;
}

function showObjects(div, parent, type)
{
 if (! parent.hasChildNodes()) return false;
 var header = $C('STRONG');
 header.innerHTML = (type == 's' ? MSG_STREETS : MSG_METROS);
 div.appendChild(header);
 var mode = (type == 's' ? "gos" : "gom");
 for (var child = parent.firstChild; child != null; child = child.nextSibling) {
     var node = $C('A');
     node.href = "javascript:gotoObject('" + mode + "', " + child.getAttribute('id') + ")";
     node.innerHTML = child.firstChild.nodeValue;
     div.appendChild(node);
     div.appendChild($C("BR"));
 }
 return true;
}

function gotoObject(mode, id)
{
 var params = {
   mode: mode,
   id: id,
   reg: $('reg').value,
   layer: getLayers()
}
 ajaxCaller.postForXML("Default.aspx", params, onMapLoaded);
}

function backToMap()
{
 $('notFound').style.display = "none";
 $('panelMap').style.display = "block";
}

function setCursor(val)
{
 $(val).src = "../img/" + val + "_active.gif";
 $('map').className = "map_" + val;
}

function setScale(scale)
{
 var temp = 5 - curScale;
 if (temp >= 1 && temp <= 5)
    $('z' + temp).src = "../img/zoom" + temp + ".gif";
 curScale = parseInt(scale);
 temp = 5 - curScale;
 if (temp >= 0 && temp <= 5)
    $('z' + temp).src = "../img/zoom" + temp + "_active.gif";
}

function cursorChanged(val)
{
 var old_mode = $('mode').value;
 $(old_mode).src = "../img/" + old_mode + ".gif";
 $('mode').value = val;
 setCursor(val);
}

function showIndicatorAndPost(params)
{
 $("waiting").style.display = "block";
 ajaxCaller.postForXML("Default.aspx", params, onMapLoaded);
}

function getLayers()
{
 var layers = new Array();
 var cb = document.getElementsByName("layer");
 for (var i = 0; i < cb.length; ++i) {
     if (cb[i].checked)
        layers.push(cb[i].value);
 }
 return layers.join(',');
}

function createParams(evt, container, mode)
{
 var params = {
   mode: mode,
   cx: $('cx').value,
   cy: $('cy').value,
   scale: curScale,
   zoom: $('zoom').value,
   scx: evt.clientX - leftOffset(container) + document.documentElement.scrollLeft,
   scy: evt.clientY - topOffset(container) + document.documentElement.scrollTop,
   reg: $('reg').value,
   layer: getLayers()
 }
 return params;
}

function scale(newScale)
{
 var params = {
   mode: 'scale',
   cx: $('cx').value,
   cy: $('cy').value,
   scale: newScale,
   zoom: $('zoom').value,
   reg: $('reg').value,
   layer: getLayers()
 }
 showIndicatorAndPost(params);
}

function position(dir)
{
 var params = {
   mode: dir,
   cx: $('cx').value,
   cy: $('cy').value,
   scale: curScale,
   zoom: $('zoom').value,
   reg: $('reg').value,
   layer: getLayers()
 }
 showIndicatorAndPost(params);
}

function gohome()
{
 var params = {
   mode: 'move',
   cx: $('homecx').value,
   cy: $('homecy').value,
   scale: 4,
   reg: $('reg').value,
   layer: getLayers()
 }
 showIndicatorAndPost(params);
}

function doItRU(evt)
{ return doIt(evt, "ru"); }

function doItEN(evt)
{ return doIt(evt, "en"); }

function doIt(evt, lang)
{
 var evt = evt || window.event;
 var mode = $("mode").value;
 var container = $("mapcont");
 var params = createParams(evt, container, mode);

 if (mode == "info") {
    ajaxCaller.postVars("Default.aspx", params, null, onInfoLoaded, false,
      {x: evt.clientX - leftOffset(container) + 1 + document.documentElement.scrollLeft,
       y: evt.clientY - topOffset(container) - 1 + document.documentElement.scrollTop});
    return false;
 }
 else {
    clearInfo();
 }

 if (mode == "zoomout" || mode == "zoomin") {
    showIndicatorAndPost(params);
 }
 return true;
}
 
function clearInfo()
{
   $('legend').style.display = "none";
}

