// konfiguracni promenne skriptu mapy
var gmaxx = 5000;                // x-ove rozmery nejpodrobnejsi mapy 
var gmaxy = 3000;                // y-ove rozmery nejpodrobnejsi mapy 

var maxscale = 2;                //posledni meritko
var ZoomMap = Array (1,2,10);    //delici pomery zoomu

//pracovni promenne mapy
var maxx = 0;     
var maxy = 0;     

var gx = 0;              // x-ova souradnice na mape
var gy = 0;              // y-ova souradnice na mape

var gxclick = 0;         // x-ova souradnice na mape po kliknuti
var gyclick = 0;         // y-ova souradnice na mape po kliknuti


var dx = 50;             // x-ova velikost policka v px
var dy = 50;             // y-ova velikost policka v px

var sx = 0;              // stav posunuti policek v mapa ve smeru x
var sy = 0;              // stav posunuti policek v mapa ve smeru y

var px = 0;              // pocet horizontalnich policek
var py = 0;              // pocet vertikalnich policek

var scale = 0;           //aktualni meritko

var mapTown = new Array();                   //mapa bodu mest
for ( i = 0; i <= maxscale; i++ ) mapTown[i] = new Array();

var ImgToLoad = new Array();                 //pocitadlo nenahranych obrazku

var mapTownsHTML = "";                       // buffer pro HTML body mest

var LoadFlagTown = true;                     // priznak nahrani souboru dat
var LoadFlagImg = true;                      // priznak nahrani obrazku mapy

var ImgCutter = new Array({x:12, y:12},{x:7, y:7},{x:0, y:0}); //korekce souradnic bodu mesta na stred

//**************************************************************************************
function truncate(x)
{
  return x < 0 ? Math.ceil(x) : Math.floor(x);
}

//**************************************************************************************
function getMapFile (x) {
    return mappath+scale+'/img/'+x+'.png';
}

//**************************************************************************************
function getJsFile (x) { 
    return mappath+scale+'/js/'+x+'.htm';
}

//**************************************************************************************
function getTownImgFile (x) {
    
    return mappath+scale+'/town/'+x+'.gif';
}


//**************************************************************************************
function arrowOnOff( owner, OnOff ) {
    var i = 1;
    var color = ( OnOff ) ? arrowColorOn : arrowColorOff;
    var suffix = ( OnOff ) ? arrowImgSufOn : arrowImgSufOff;
    
    if (document.all) {
        while ( document.all[owner+i] ) {
            with ( document.all[owner+i] ) {
                bgColor = color;
            }
            i++;
        }
        if ( document.all["img"+owner] ) {
            document.all["img"+owner].src = arrowImgPath+owner+suffix;
        }
    }
        
    if (!document.all && document.getElementById) {
        while ( document.getElementById( owner+i ) ) {
            with (document.getElementById( owner+i ) ) {
                bgColor = color;
            }
            i++;
        }
        
        if ( document.getElementById( "img"+owner ) ) {
            document.getElementById( "img"+owner ).src = arrowImgPath+owner+suffix;
        }
    }                
}

//**************************************************************************************
function imgClickHandler (evt, img) {

    var newx, newy, coords, el;
    var keys = {shiftPressed: false, ctrlPressed: false, altPressed: false, newx:0, newy:0};
    var mString;

    if ( navigator.appName == "Netscape" && parseInt( navigator.appVersion ) < 5) {
        mString = ( e.modifiers+32 ).toString( 2 ).substring( 3,6 );
        with ( keys ) {
            shiftPressed = ( mString.charAt(0) == "1" );
            ctrlPressed = ( mString.charAt(1) == "1" );
            altPressed  = ( mString.charAt(2) == "1" );
        }
    }
    else {
        with ( keys ) {
            shiftPressed=evt.shiftKey;
            altPressed  =evt.altKey;
            ctrlPressed =evt.ctrlKey;
        }
    }
        
    if (window.event) {

        newx = window.event.offsetX + img.style.pixelLeft;
        newy = window.event.offsetY + img.style.pixelTop;

    }
    else if (evt.target) {

        coords = {x: 0, y: 0 };
        el = img;
    
        do {
            coords.x += el.offsetLeft;
            coords.y += el.offsetTop;
        }
        while ((el = el.offsetParent))

        newx = evt.pageX - coords.x;
        newy = evt.pageY - coords.y;
        
    }

    keys.newx = newx;
    keys.newy = newy;
    
    newx -= Math.round( ( px*dx ) / 2 );
    newy -= Math.round( ( py*dy ) / 2 );
    
    gxclick = gx + newx;
    gyclick = gy + newy;

    myOnClickFunction( keys );
    
}

//**************************************************************************************    
function setSize( owner, sHTML, x, y, w, h) {
    if(document.layers) {
        if (sHTML != '') eval('document.'+owner+'.innerHTML = sHTML')
        eval('document.'+owner+'.height = h');
        eval('document.'+owner+'.width = w');      
        eval('document.'+owner+'.left = x');
        eval('document.'+owner+'.top = y');        
    }
    
    if(document.all) {
        with ( document.all[owner] ) {
            if (sHTML != '') innerHTML = sHTML;
            style.height = h;
            style.width = w;
            style.left = x;
            style.top = y;
        }
    }
        
    if(!document.all && document.getElementById) {
        with (document.getElementById(owner)) {
            if (sHTML != '') innerHTML = sHTML;
            style.height = h + 'px';
            style.width = w + 'px';
            style.left = x + 'px';
            style.top = y + 'px';
        }
    }                
}

//**************************************************************************************    
function setInnerHTML( owner, sHTML ) {
    if(document.layers) {
        eval('document.'+owner+'.innerHTML = sHTML');
    }
    
    if(document.all) {
        with ( document.all[owner] ) {
            innerHTML = sHTML;
        }
    }
        
    if(!document.all && document.getElementById) {
        with (document.getElementById(owner)) {
            innerHTML = sHTML;
        }
    }                
}

//**************************************************************************************
function makeSkelet( vgx, vgy, vpx, vpy, vscale, centre) {
    var pom = "";
    var pom2 = "";
    var pom3 = "";
    
    scale = vscale;
    
    maxx = truncate( gmaxx / ZoomMap[scale] );
    maxy = truncate( gmaxy / ZoomMap[scale] );
    
    px = vpx;
    py = vpy;
    
    gx = ( centre ) ? vgx - truncate( px*dx / 2 ) : vgx;
    gy = ( centre ) ? vgy - truncate( py*dy / 2 ) : vgy;
    
    ImgToLoad[px*py-1] = 0;
    
    for (x = 0; x < px; x++) {
        for (y = 0; y < py; y++) {
            pom += '<img name="mapa'+(x+y*px)+'" id="mapa'+(x+y*px)+'" alt=""  OnLoad="javascript:afterLoadImg('+(x+y*px)+')" width="'+dx+'" height="'+dy+'" border="0" style="position: absolute; top:'+(((dy*y)-(gy%dy) >= -dy && (dy*y)-(gy%dy) <= (py-1)*dy) ? (dy*y)-(gy%dy):-dy)+'px; left:'+(((dx*x)-(gx%dx) >= -dx && (dx*x)-(gx%dx) <= (px-1)*dx) ? (dx*x)-(gx%dx):-dx)+'px; ">';
        }
    }
    
    pom2 = '<img id="mapaEnd2" name="mapaEnd2" src="mapa/transpar.gif" left="0" top="0" width="'+(dx*px)+'" height="'+(dy*py)+'" alt="" border="0" onMouseDown="javascript:imgClickHandler(window.event, this)" style:"position:absolute; z-index:1">';

    setSize ( SkeletName, pom, mx, my, px * dx, py * dy );
    setSize ( Border1Name, '', mx - relBor1.rleft, my - relBor1.rheight, px * dx + relBor1.rleft + relBor1.rright, dy + relBor1.rheight );
    setSize ( Border2Name, '', mx + (px - 1) * dx, my + dy, dx + relBor2.rright, (py - 2) * dy );
    setSize ( Border3Name, '', mx - relBor3.rleft, my + (py - 1) * dy, px * dx + relBor3.rleft + relBor3.rright, dy + relBor3.rheight );
    setSize ( Border4Name, '', mx - relBor4.rleft, my + dy, dx + relBor4.rleft, (py - 2) * dy );
    setSize ( ClickName, pom2, mx, my, px * dx, py * dy );
    
    shiftMap(0,0,true);
        
}

//**************************************************************************************
function shiftMap ( shiftx, shifty, DrawAll ) {

    var lcc, lff;
    var gx1 = gx;
    var gy1 = gy;
    var i = 0;

    var gx2 = gx + shiftx;
    var gy2 = gy + shifty;
    
    if ( gx2 < 0 || gx2 > maxx - ( px - 2 ) * dx ) gx2 = ( gx2 < 0 ) ? 0 : maxx - ( px - 2 ) * dx;
    if ( gy2 < 0 || gy2 > maxy - ( py - 2 ) * dy ) gy2 = ( gy2 < 0 ) ? 0 : maxy - ( py - 2 ) * dy;

    if ( maxx < px * dx ) gx2 = 0;
    if ( maxy < py * dy ) gy2 = 0;

    gx = gx2;
    gy = gy2;

    mapTownsHTML = '';
    ShowTowns();

    var sx2 = Math.max( truncate( gx2 / dx ), truncate( gx1 / dx ) );
    var sx1 = Math.min( truncate( gx2 / dx ), truncate( gx1 / dx ) );

    var sy2 = Math.max( truncate( gy2 / dy ), truncate( gy1 / dy ) );
    var sy1 = Math.min( truncate( gy2 / dy ), truncate( gy1 / dy ) );

    sx = truncate( gx / dx );
    sy = truncate( gy / dy );

    var kx = ( maxx < px * dx ) ? truncate(((( px - 2 ) * dx - maxx ) / dx ) / 2 ) : 0;
    var ky = ( maxy < py * dy ) ? truncate(((( py - 2 ) * dy - maxy ) / dy ) / 2 ) : 0;

    LoadFlagImg = true;
    LoadFlagTown = true;

    mySetLoadFlag();
        
    var ImgTLL = ImgToLoad.length;
    for ( i = 0; i < ImgTLL; i++ ) {
        ImgToLoad[i] = 0;
    }
//    alert(i)
    
    for (x = sx ; x < sx+px; x++) {
        for (y = sy ; y < sy+py; y++) {

            xpos = ( (x - sx) % px ) * dx - (gx % dx); 

            if ( xpos < 0 || xpos > ( px - 1 ) * dx ) xpos = 0;

            ypos = ( (y - sy) % py ) * dy - (gy % dy); 

            if ( ypos < 0 || ypos > ( py - 1 ) * dy ) ypos = 0;

            ff = ( x % px ) + ( y % py ) * px;

            cc = (( x - kx < 0 || x - kx > Math.ceil( maxx/dx ) + 1 ) ? 0 : x - kx ) + ( ( ( y - ky < 0 || y - ky > Math.ceil( maxy/dy ) + 1 ) ? 0 : y - ky) * (Math.ceil( maxx/dx )+2) );


            if (document.layers) {
                eval('document.mapa'+(ff)+'.left = xpos');
                eval('document.mapa'+(ff)+'.top = ypos');

            }

            if (document.all) {
                document.all["mapa"+(ff)].style.left = xpos;
                document.all["mapa"+(ff)].style.top = ypos;
            }

            if (!document.all && document.getElementById) {
                document.getElementById("mapa"+(ff)).style.left = xpos+"px";
                document.getElementById("mapa"+(ff)).style.top = ypos+"px";
            }

            if ( ( x >= sx1 + ((shiftx > 0) ? px : 0) && x < sx2 + ((shiftx > 0) ? px : 0)) || (y >=  sy1 + ((shifty > 0) ? py : 0) && y < sy2 + ((shifty > 0) ? py : 0)) || DrawAll ) {

                ImgToLoad[ff] = 1;
                LoadFlagImg = false;
                newTown ( cc );                
                document.getElementById("mapa"+(ff)).src = getMapFile(cc);
                
            } else {
                newTown ( cc );
            }
            



        }
    }
    
    if ( LoadFlagTown && LoadFlagImg ) {
        myClearLoadFlag();
        ShowTowns();
    }
}

//**************************************************************************************
function setScaleMap( zoom ) {

    var kx,ky,zx,zy,gx2,gy2;
    
    if ( zoom < 0 ) zoom = 0;
    if ( zoom > maxscale ) zoom = maxscale;
    
    kx = ( maxx < px * dx ) ? truncate(((( px - 2 ) * dx - maxx) / dx) / 2 ) : 0;
    ky = ( maxy < py * dy ) ? truncate(((( py - 2 ) * dy - maxy) / dy) / 2 ) : 0;
    
    zx = gx + truncate(  px * dx / 2 ) - dx - kx*dx;
    zy = gy + truncate(  py * dy / 2 ) - dy - ky*dy;
    
    zx *= ZoomMap[scale];
    zy *= ZoomMap[scale];
    
    scale = zoom;

    maxx = truncate( gmaxx / ZoomMap[scale] );
    maxy = truncate( gmaxy / ZoomMap[scale] );
    
    kx = ( maxx < px * dx ) ? truncate(((( px - 2 ) * dx - maxx ) / dx) / 2 ) : 0;
    ky = ( maxy < py * dy ) ? truncate(((( py - 2 ) * dy - maxy ) / dy) / 2 ) : 0;

    gx2 = truncate ( zx / ZoomMap[zoom] ) - truncate( px * dx / 2 ) + dx + kx*dx;
    gy2 = truncate ( zy / ZoomMap[zoom] ) - truncate( py * dy / 2 ) + dy + ky*dy;
     
    if ( gx2 < 0 || gx2 > maxx - ( px - 2 ) * dx ) gx2 = ( gx2 < 0 ) ? 0 : maxx - ( px - 2 ) * dx;
    if ( gy2 < 0 || gy2 > maxy - ( py - 2 ) * dy ) gy2 = ( gy2 < 0 ) ? 0 : maxy - ( py - 2 ) * dy;
    if ( maxx < px * dx ) gx2 = 0;
    if ( maxy < py * dy ) gy2 = 0;
    
    gx = gx2;
    gy = gy2;
    
    shiftMap (0,0,true);
}

//**************************************************************************************
function addToLoad ( index ) { 

    if ( LoadFlagTown ) {
        LoadFlagTown = false;
        document.getElementById(LoadName).src = getJsFile( index );
    }
    else {
         TownToLoad[scale][index] = 2;
    }
}

//**************************************************************************************
function afterLoadImg ( ffx ) {

    var ii = 0
    
    if ( ! LoadFlagImg ) {
    
        ImgToLoad[ffx] = 0;
       
        while ( ii < ImgToLoad.length && ImgToLoad[ii] == 0 ) {
            ii++;
        }


//        alert( 'afterImg:'+ImgToLoad.length+':'+cc+';'+i )
    
        if ( ii >= ImgToLoad.length ) {
            LoadFlagImg = true;
            if ( LoadFlagTown ) {
                ShowTowns ();
                myClearLoadFlag();
            }
        }
    }
}

//**************************************************************************************
function afterLoad ( index , jsscale ) {

    if ( ! LoadFlagTown ) {
        if (typeof( TownToLoad[jsscale] ) != "undefined" ) {
            TownToLoad[jsscale][index] = 3;
            
            if ( scale == jsscale ) TownDraw( index );
            
            var i = 0;
        
            while (i < TownToLoad[scale].length && TownToLoad[scale][i] != 2) {
                i++
            }
        
            if ( i < TownToLoad[scale].length ) {
        
                document.getElementById(LoadName).src = getJsFile( i );
            }
            else {
                LoadFlagTown = true
                if ( LoadFlagImg ) {
                    ShowTowns ();
                    myClearLoadFlag();
                }
            }
        }
    }
}

//**************************************************************************************
function newTown( index ) {

//    if ( typeof(mapTown[scale]) == "undefined" ) mapTown[scale] = new Array()

    if (TownToLoad[scale][index] == 3) {
        TownDraw( index );
    }
    
    if (TownToLoad[scale][index] == 1) {
        addToLoad ( index );    
    }
}

//**************************************************************************************
function newMap( cc2, ff2 ) {

    ImgToLoad[ff2] = cc2;
    
}

//**************************************************************************************
function TownDraw ( index ) {

    var i , tx, ty, tn, tt, kx, ky;
    
    kx = ( maxx < px * dx ) ? truncate(((( px - 2 ) * dx - maxx ) / dx) / 2 ) : 0;
    ky = ( maxy < py * dy ) ? truncate(((( py - 2 ) * dy - maxy ) / dy) / 2 ) : 0;
    
    if (typeof( mapTown[scale][index] ) == "undefined" ) alert('chyba'+scale+' - '+index);

    for ( i = 0; i < mapTown[scale][index].length; i++) {

        tt = getTownImgFile(mapTown[scale][index][i].typ);
        tx = mapTown[scale][index][i].x - gx + kx * dx - ImgCutter[scale].x;
        ty = mapTown[scale][index][i].y - gy + ky * dy - ImgCutter[scale].y;

        if ( !( tx < 0 || tx > ( px - 1 ) * dx ||  ty < 0 || ty > ( py - 1 ) * dy) && mapTown[scale][index][i].typ == 1) {

            tn = mapTown[scale][index][i].town;

            mapTownsHTML += '<img src="'+tt+'" alt="'+tn+'" hspace="0" vspace="0" border="0" style="position:absolute; z-index:2; left:'+tx+'px; top:'+ty+'px; margin:0px 0px 0px 0px; padding:0px 0px 0px 0px;" onMouseOver="javascript:myOnOverTown('+index+','+i+')" onMouseOut="javascript:myOnOutTown('+index+','+i+')" onClick="javascript:myOnClickTown('+index+','+i+')" style="cursor:pointer">';
        }
    }
}

//**************************************************************************************
function ShowTowns ( addText ) {
        
    if ( typeof( addText ) == "undefined" ) addText='';
    pom2 = '<img id="mapaEnd2" name="mapaEnd2" src="mapa/transpar.gif" left="0" top="0" width="'+(dx*px)+'" height="'+(dy*py)+'" alt="" border="0" onClick="javascript:imgClickHandler(event, this)" style:"position:absolute; z-index:1">';
    setSize ( ClickName, pom2+mapTownsHTML+addText, mx, my, px * dx, py * dy );
}

//**************************************************************************************
function ShowTowns2 ( addText ) {

    if ( typeof( addText ) == "undefined" ) addText='';
    pom2 = '<img id="mapaEnd2" name="mapaEnd2" src="mapa/transpar.gif" left="0" top="0" width="'+(dx*px)+'" height="'+(dy*py)+'" alt="" border="0" onClick="javascript:imgClickHandler(event, this)" style:"position:absolute; z-index:1">';
    setSize ( ClickName, pom2+addText, mx, my, px * dx, py * dy );
}


