//
// part of myWMSClient
//
// Copyright (C) BT-GIS & Dietmar Stolz, 2005
//

var AlphaImageLoader = false;

var navImgBar = new Array();
 navImgBar[0] = new Image(); navImgBar[0].src = "images/navbarN.gif";
 navImgBar[1] = new Image(); navImgBar[1].src = "images/navbarE.gif";
 navImgBar[2] = new Image(); navImgBar[2].src = "images/navbarS.gif";
 navImgBar[3] = new Image(); navImgBar[3].src = "images/navbarW.gif";
 navImgBar[4] = new Image(); navImgBar[4].src = "images/navbarNE.gif";
 navImgBar[5] = new Image(); navImgBar[5].src = "images/navbarSE.gif";
 navImgBar[6] = new Image(); navImgBar[6].src = "images/navbarSW.gif";
 navImgBar[7] = new Image(); navImgBar[7].src = "images/navbarNW.gif";
var myNaviBar = true;
var myNaviCol = "rgb(255,187,51)";
var myNaviBarWidth = 12;

var resizeImg = new Image(); resizeImg.src = "images/resize.gif";
var transparentImg = new Image(); transparentImg.src = "images/transparent.gif";
var folderOpenImg = new Image(); folderOpenImg.src = "images/open.gif";
var folderCloseImg = new Image(); folderCloseImg.src = "images/close.gif";
var changeXYScImg = new Image(); changeXYScImg.src = "images/go.gif";
var scalebarImg = new Image(); scalebarImg.src = "images/scalebar.gif";
var highlightImg = new Image(); highlightImg.src = "images/highlight.gif";
var markerImg = new Image(); markerImg.src = "images/marker.gif"; //"symbole/test.gif";
var waitImg = new Image(); waitImg.src = "images/sandclock.gif";
var maxImg = new Image(); maxImg.src = "images/maximize.gif";
var minImg = new Image(); minImg.src = "images/minimize.gif";

var myWMS = new Array();
var myUsemap = new Array();
var myFeatureInfoURL = "";
var saveFeatureInfoURL = "";
var myBBox = new Array();
var myMaxBBox = new Array(0,0,0,0);
var myMapSize = new Array(500,500);
var myXY = new Array();
var myHome = new Array(); // x,y,scale
var myScale = 5000;
var myMinMaxScale = new Array(0,999999999);
var myMapPos = new Array(20,20);
var myAddNav = 0.5;
var myDebug = false;
var ie = document.all?1:0;
  if(navigator.userAgent.indexOf("Opera")>-1) { ie=0; }
var myResolution = 28.35;
var myMaxScaleMeasure = 9999999;
var msgList = new Array();
var imgTitle = new Array();
var myVendorSpecific = new Array();
var myQualityFillPoly = 2;
var myClickXY = new Array();
var myStartXY = new Array();
var myEndXY = new Array();
var myMapresizeDiff = new Array(0,0);
var myMapResize;
var myMapSizeMax = new Array(2200,1600);
var myMapSizeMin = new Array(600,400);
var myMapFrame;
var myMarker = new Array(-1,-1,myScale,""); // x,y,scale,objName
var mySlidePixel = new Array();
var mySlideActive = false;
var mySliderScale = myScale;
var mySliderPreview = true;

var myIFrameActiveId = "myIFrame0";
var myMoveIFrame = true;
var myLanguage = "german";
var mySelection = false; // selection mode
var mySelectionAutoClose = true; // automa. poly close
var myCheckWMSComplete = true;
var myCount = 0;
var myColorBG = "url(images/bgYellow.gif)";
var myActivButtonStyle = new Array(null,"1px solid rgb(253,186,51)");
var myActivButton = "";
var mySlideBarVertical = false;
var myScaleList = new Array(500,1000,2500,5000,10000,25000); //"scale|scale text"
var myScaleMatching = new Array();
var mySliderScaleMatching = false;

var myPanActive = false;
var myZoomBoxActive = false;
var zbb = new Array();
var myMapHistory = new Array(); // x,y,sc
var myMeasure = new Array(); // x,y,dist,totaldist
var myMeasureActive = false;
var myMeasurePolyClosed = false;
var myShowMeasure = "myWMSClientShowCoords.html";
var myMaxMeasurePoints = 50;
var myMeasureDashDist = 6
var myMeasureFormat = 1; // 0:nothing; 1:tt+list; 2:list; 3:tt

var myMarkerID = "";
var myShowXYSc = true;
var myShowScalebar = true;
var myShowMapresize = true;
var myShowXYoutput = 2; // 1:Statuszeil; 2:XY-Feld

var myUMArea = "";
var myUMObject = new Object();

if(ie) { myFrameBorder = 4; } else { myFrameBorder = 0; }

if(!document.getElementById) {
  alert('Your browser needs DOM:\n\nNetscape >6.x\nInternet Explorer >5.x\nOpera >5.12\nMozilla Firefox >1.0\Konqueror >3.3\nSafari >1.2');
  this.location.href = transparentImg.src;
}

function my_setSkin() {

  if(myMapSize[0]>myMapSizeMax[0]) { myMapSize[0] = myMapSizeMax[0]; }
  if(myMapSize[1]>myMapSizeMax[1]) { myMapSize[1] = myMapSizeMax[1]; }

  document.write("<div id='layerMapBorder' style='position:absolute;left:"+(myMapPos[0])+"px;top:"+(myMapPos[1])+"px;width:"+(myMapSize[0])+"px;height:"+(myMapSize[1])+"px;overflow:hidden;border-width:2px'>");
    document.write("<div id='layerAll' style='position:absolute;left:0px;top:0px;width:"+(myMapSize[0])+"px;height:"+(myMapSize[1])+"px;background-color:white'>");
      for(var i=0;i<myWMS.length;i++) {
        my_createDiv("layerWMS"+i,0,0,0,0,true,"");
      }
      content = "<img id='divMarkerImg' src='"+markerImg.src+"' border='0'><span id='divMarkerInfo' style='visibility:hidden'></span>";
      my_createDiv("layerMarker",0,0,0,0,false,content);
      my_createDiv("layerUsemapHighlight",0,0,0,0,true,"");
      for(var i=0;i<myUsemap.length;i++) {
        my_createDiv("layerUsemap"+i,0,0,0,0,true,"");
      }
      my_createDiv("layerMeasureLine",0,0,0,0,true,"");
      my_createDiv("layerMeasureRun",0,0,0,0,true,"");
      my_createDiv("layerZoomBox",0,0,0,0,false,"");
      content="<img src='"+highlightImg.src+"'>";
      my_createDiv("divHighlightIcon",0,0,0,0,false,content);
    document.write("</div>");
    my_createDiv("layerEventHandling",0,0,myMapSize[0],myMapSize[1],false,"");
    my_createDiv("layerPrintPreview1",0,0,0,0,false,"");
    my_createDiv("layerPrintPreview2",0,0,0,0,false,"");
    my_createDiv("layerPrintPreview3",0,0,0,0,false,"");
    my_createDiv("layerPrintPreview4",0,0,0,0,false,"");
  document.write("</div>");
  // dummy frame for usemap
  for(var i=0;i<myUsemap.length;i++) {
    document.write("<iframe name='layerUsemapFrame"+i+"' id='layerUsemapFrame"+i+"' style='position:absolute;left:0px;top:0px;width:0px;height:0px;display:none'></iframe>");
  }
  // mapresizedivMapResize
  if(myShowMapresize) {
    document.write("<div id='divMapResize' style='position:absolute;left:"+(myMapSize[0]+myMapPos[0]-8-myFrameBorder)+"px;top:"+(myMapSize[1]+myMapPos[1]-8-myFrameBorder)+"px;width:13px;height:13px;background-image:url("+resizeImg.src+");background-repeat:no-repeat' onmousedown=my_mapResize() title='"+msgList[0]+"'></div>");
  }
  my_createDiv("divTooltip",0,0,0,0,false,"");
  my_createDiv("divWaitIcon",(myMapSize[0]/2)+myMapPos[0],(myMapSize[1]/2)+myMapPos[1],-1,-1,true,"");
  my_createDiv("divMapResizeBG",0,0,0,0,false,"");
  my_createDiv("divScalebar",0,0,0,0,myShowScalebar,"");
  if(myNaviBar) { my_setNaviBar(); }
  // statusbar
  var content = "";
  if(myShowXYSc) {
    content += "<form name='frmXYSc' action='javascript:my_dialogXYSc()'>";
    content += "<font>"+msgList[1]+"</font>";
    content += "<input name='x' class='divStatusXY' value='' onfocus='document.onkeydown=null' title='"+msgList[7]+"'></input>";
    content += "<font>"+msgList[2]+"</font>";
    content += "<input name='y' class='divStatusXY' value='' onfocus='document.onkeydown=null' title='"+msgList[7]+"'></input>";
    content += "<img id='imgScList' src='"+folderOpenImg.src+"' title='"+msgList[6]+"' onclick=my_setScaleFromList() onmouseover=my_mOverEl(this) onmouseout=my_mOutOfEl(this) style='position:absolute;left:0px;top:0px;'>";
    content += "<input name='sc' class='divStatusSc' value='' onfocus='document.onkeydown=null' title='"+msgList[7]+"'></input>";
    content += "<input type='image' src='"+changeXYScImg.src+"' id='divChangeXYSc' onmouseover=my_mOverEl(this) onmouseout=my_mOutOfEl(this) title='"+msgList[5]+"' style='border:none;background-color:transparent'>";
    content += "</form>";
  }
  my_createDiv("divStatusbar",0,-100,0,0,true,content);
  my_createDiv("divInfo",-100,-100,0,0,true,"");

  // scale list
  var content = "";
  for(var i=0;i<myScaleList.length;i++) {
    tmp = myScaleList[i].toString().split('|');
    if(!tmp[1]) { tmp[1] = "1:"+tmp[0]; }
    content += "<a href='#' onclick=my_repaintXYSc(null,null,"+tmp[0]+")>1:"+tmp[0]+"</a>";
  }
  my_createDiv("divScaleList",0,myMapPos[0]+myMapSize[1]-(myScaleList.length*12),62,myScaleList.length*12,true,content);
  //dummy frame
  content = "<iframe name='DUMMY'></iframe>";
  my_createDiv("DUMMY",0,0,0,0,false,content);
}

function init() {
  my_sliderInit();
  my_getCGIParams1();
  myHome[0] = myXY[0];
  myHome[1] = myXY[1];
  myHome[2] = myScale;
  if(my_checkDIV("divWaitIcon")) { // for position
    my_arrangeElement("divWaitIcon",(myMapSize[0]/2)+myMapPos[0]-(waitImg.width/2),(myMapSize[1]/2)+myMapPos[1]-(waitImg.height/2));
  }
  my_subHide(); // show/hide submenu
  my_repaintXYSc(myXY[0],myXY[1],myScale);
  my_mapResizeNaviBar();
}

////////////////////////////
  // calling parameters
////////////////////////////

function my_getCGIParams1() {
  var obj = "";
  var argstr = location.search.substring(1,location.search.length);
  if(argstr.length > 0) {
    var args = argstr.toString().split('&');
    for(var i=0;i<args.length;i++) {
      var tmp = args[i].split('=');
      var nam = unescape(tmp[0]);
      var val = unescape(tmp[1]);
      if(nam.search(/\blanguage\b/i)> -1) { myLanguage = val; }
      if(nam.search(/\bx\b/i)> -1) { myXY[0] = Math.round(val); }
      if(nam.search(/\by\b/i)> -1) { myXY[1] = Math.round(val); }
      if(nam.search(/\bscale\b/i)> -1) { myScale = Math.round(val); }
      if(nam.search(/\blayers\b/i)> -1) {
        var lay = val.split(",");
        if(val != "") {
          for (var j=0;j<myWMS.length;j++) { myWMS[j][5] = false; }
          for (var j=0;j<lay.length;j++) { myWMS[lay[j]][5] = true; }
        }
      }
      if(nam.search(/\busemaplayer\b/i)> -1) {
        var lay = val.split(",");
        if(val != "") {
          for (var j=0;j<myUsemap.length;j++) { myUsemap[j][5] = false; }
          for (var j=0;j<lay.length;j++) { myUsemap[lay[j]][5] = true; }
        }
      }
      if(nam.search(/\bobject\b/i)> -1) {
        myMarker = new Array();
        myMarker = val.split(",");
        if(myMarker[2]) { myScale=myMarker[2]; }
      }
      if(nam.search(/\bbbox\b/i)> -1) { my_bb2Scale(val.split(",")); }
      if(nam.search(/\bmeasure\b/i)> -1 && val != "") {
        var co = val.split(",")
        myMeasureFormat = 0;
        if(co.length > 4) {
          my_measureDelete();
          var k = 0;
          for(var j=0;j<co.length;j+=4) {
            myMeasure[k] = new Array(co[j]*1,co[j+1]*1,co[j+2]*1,co[j+3]*1);
            k++;
          }
          if(myMeasure[0][0]==myMeasure[myMeasure.length-1][0] && myMeasure[0][1]==myMeasure[myMeasure.length-1][1]) {
            myMeasurePolyClosed = true;
          } else { myMeasurePolyClosed = false; }
        }
      }
      if(nam.search(/\bdebug\b/i)> -1) {
        if(val == "true") { myDebug = true; }
      }
    }
  }
}

function my_getCGIParams() {
  var obj = "";
  var argstr = location.search.substring(1,location.search.length);
  if(argstr.length > 0) {
    var args = argstr.toString().split('&');
    for(var i=0;i<args.length;i++) {
      var tmp = args[i].split('=');
      var nam = unescape(tmp[0]);
      var val = unescape(tmp[1]);
      if(nam.search(/\bleft\b/i)> -1) { myMapPos[0] = Math.round(val); }
      if(nam.search(/\btop\b/i)> -1) { myMapPos[1] = Math.round(val); }
      if(nam.search(/\bwidth\b/i)> -1) { myMapSize[0] = Math.round(val); }
      if(nam.search(/\bheight\b/i)> -1) { myMapSize[1] = Math.round(val); }
    }
  }
  saveFeatureInfoURL = myFeatureInfoURL; // save featurInfoURL for continue after finish other functions (online registartion etc.)
}


////////////////////////////
  // maprequests: input 0=all, WMS or USEMAP:
////////////////////////////

function my_setMapRequest(val) {

  my_MapRequestPreFunctions();

  var requ = "&WIDTH=" + myMapSize[0]
   +"&HEIGHT=" + myMapSize[1]
   +"&SCALE=" + myScale
   + my_getVendorSpecificString();

  if(val==0 || val=="WMS" && myWMS.length>0) {
    requ += "&BBOX="+Math.floor(myBBox[0])+","+Math.floor(myBBox[1])+","+Math.floor(myBBox[2])+","+Math.floor(myBBox[3]); // round for better cache
    for(var i=0;i<myUsemap.length;i++) {
      my_getID("layerUsemap"+i).innerHTML = "";
      my_getID("layerUsemap"+i).style.width = "0px";
      my_getID("layerUsemap"+i).style.height = "0px";
    }
    for(var i=0;i<myWMS.length;i++) {
      if(myWMS[i][0].indexOf('?') == -1) { myWMS[i][0] += "?"; }
      var newWMS = myWMS[i][0] + requ +"&LAYERS=" + my_checkLayer(i,"WMS");
      if(myWMS[i][5] == false || my_checkLayer(i,"WMS") == "") { newWMS = transparentImg.src; }
      if(myDebug && myWMS[i][5] == true && newWMS.indexOf(transparentImg.src)==-1) { prompt("",newWMS); }

      if (AlphaImageLoader && ie && navigator.userAgent.indexOf("Opera")<0 && (newWMS.toUpperCase().search(/format=png/i)> -1 || newWMS.toUpperCase().search(/format=image\/png/i)> -1)) {
        my_getID("layerWMS"+i).innerHTML = "<img id='map"+i+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\""+newWMS+"\",sizingmethod=\"scale\")' src='"+transparentImg.src+"' onError=my_WMSError("+i+") onAbort=my_stopWMS("+i+")>";
      } else {
        my_getID("layerWMS"+i).innerHTML = "<img id='map"+i+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px' src='"+newWMS+"' onError=my_WMSError("+i+") onAbort=my_stopWMS("+i+")>";
      }

      my_sandclock(true,"map"+i);
    }
  }

  if(myUsemap.length>0 && (val==0 || val=="USEMAP")) {
    requ += "&BBOX="+myBBox; // no round for usemap
    out(); // disable usemap
    for(var i=0;i<myUsemap.length;i++) {
      if(myUsemap[i][0].indexOf('?') == -1) { myUsemap[i][0] += "?"; }
      var newUm = myUsemap[i][0] + requ + "&LAYERS=" + my_checkLayer(i,"USEMAP") + "&USEMAPLAYER=layerUsemap" + i;
      if(myUsemap[i][5] == false || my_checkLayer(i,"USEMAP") == "") {
        my_getID("layerUsemap"+i).innerHTML = "";
        my_getID("layerUsemap"+i).style.width = "0px";
        my_getID("layerUsemap"+i).style.height = "0px";
      } else {
        if(myDebug) { prompt("",newUm); }
        my_arrangeElement("layerUsemap"+i,0,0,myMapSize[0],myMapSize[1]);
        window.frames["layerUsemapFrame"+i].location.replace(newUm);
      }
    }
  }
  my_changeLayerInScale();// layer in scale?
  my_MapRequestSubFunctions();
  my_arrangeElement("layerMapBorder",myMapPos[0],myMapPos[1],myMapSize[0],myMapSize[1]);
  my_arrangeElement("layerAll",0,0,myMapSize[0],myMapSize[1]);
  my_arrangeElement("layerEventHandling",0,0,myMapSize[0],myMapSize[1]);
  if(myMeasure.length>0) { my_drawDashedLine(); }
  if(my_checkDIV("layerMarker")) { my_setMarker(myMarker[0],myMarker[1],myMarker[2],myMarker[3],1); }
}

function my_WMSError(id) {
  clearTimeout(aktiv);
  my_getID("divWaitIcon").innerHTML = "";
  my_getID("layerWMS"+id).innerHTML = "<img id='map"+id+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px' src='"+transparentImg.src+"'>";
  alert("Error: "+myWMS[id][2]+" is not accessible!\n\n("+myWMS[id][0]+")");
}

function my_stopWMS(id) {
  clearTimeout(aktiv);
  my_getID("divWaitIcon").innerHTML = "";
  if(id) {
    my_getID("layerWMS"+id).innerHTML = "<img id='map"+id+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px' src='"+transparentImg.src+"'>";
  }
}

function my_checkLayer(id,typ) {
  var thisLayer = "";
  var myMinSc = false;
  var myMaxSc = false;
  if(typ == "WMS") {
    if(myWMS[id][3] == 0 || myScale > myWMS[id][3]) { myMinSc = true; }
    if(myWMS[id][4] == 0 || myScale <= myWMS[id][4]) { myMaxSc = true; }
    if(myMinSc == true && myMaxSc == true) {
      thisLayer = myWMS[id][1];
    } else { thisLayer = ""; }
  }
  if(typ == "USEMAP") {
    if(myUsemap[id][3] == 0 || myScale > myUsemap[id][3]) { myMinSc = true; }
    if(myUsemap[id][4] == 0 || myScale <= myUsemap[id][4]) { myMaxSc = true; }
    if(myMinSc == true && myMaxSc == true) {
      thisLayer = myUsemap[id][1];
   } else { thisLayer = ""; }
  }
  return thisLayer;
}

function my_getLayers(typ) {
  var thisLayers = new Array();
  var thisLayersName = new Array();
  var thisLayersID = new Array();
  var thisLayersTitle = new Array();
  if(typ == "WMS") {
    for(var i=0;i<myWMS.length;i++) {
      if(myWMS[i][5] == true && my_checkLayer(i,"WMS") != "") {
        thisLayersName.push(myWMS[i][1]);
        thisLayersID.push(i);
        thisLayersTitle.push(myWMS[i][2]);
      }
    }
  }
  if(typ == "USEMAP") {
    for(var i=0;i<myUsemap.length;i++) {
      if(myUsemap[i][5] == true && my_checkLayer(i,"USEMAP") != "") {
        thisLayersName.push(myUsemap[i][1]);
        thisLayersID.push(i);
        thisLayersTitle.push(myUsemap[i][2]);
      }
    }
  }
  thisLayers = new Array(thisLayersName,thisLayersID,thisLayersTitle);
  return thisLayers;
}

////////////////////////////
  // featureinfo requests
////////////////////////////

function my_setFeatureRequest(val) { //0:point;1:poly
  my_eventLayer(false);
  my_featureInfoPreFunctions();
  if(myFeatureInfoURL == "") { return; }
  var layWMS = my_getLayers("WMS");
  var layUsemap = my_getLayers("USEMAP");
  var pos = my_pixel2Meter(myClickXY[0]-myFrameBorder,myClickXY[1]-myFrameBorder);
  if(myFeatureInfoURL.indexOf('?') == -1) { myFeatureInfoURL += "?"; }
  var newFI = myFeatureInfoURL
   +"&BBOX="+Math.floor(myBBox[0])+","+Math.floor(myBBox[1])+","+Math.floor(myBBox[2])+","+Math.floor(myBBox[3])
   +"&WIDTH=" + myMapSize[0]
   +"&HEIGHT=" + myMapSize[1]
   +"&X=" + myClickXY[0]
   +"&Y=" + myClickXY[1]
   +"&SCALE=" + myScale
   +"&QUERY_LAYERS=" + layUsemap[0];
  if(myFeatureInfoURL.search(/\bLAYERS\b/i)> -1) {} else {
   newFI += "&LAYERS=" + layWMS[0]+","+layUsemap[0]
  }
  newFI += my_getVendorSpecificString();
  newFI += "&ID="+myMarkerID;

  var co = new Array();
  if(val==1) {
    for(var j=0;j<myMeasure.length;j++) {
      co.push(myMeasure[j][0],myMeasure[j][1]);
      my_setMarker(-1,-1,myScale,"");
    }
  } else { // point
    co.push(pos[0],pos[1]);
    my_setMarker(pos[0],pos[1],null,"",1);
  }
  newFI += "&SELAREA=" + co;
  mySelection = false;
  my_getFeatureFrame(newFI);
  if(myDebug) { prompt("",newFI); }
}

function my_featureInfoPreFunctions() {}

// view feature info
function my_getFeatureFrame(url) {
  my_changeIFrame("myIFrame1",url);
}

// view measure statistic
function my_getMeasureFrame(url) {
  if(myMeasure.length>0) { my_changeIFrame("myIFrame1",myShowMeasure); }
}

function my_getOverviewFrame() {
  try {
    window.frames["myOverviewFrame"].my_setOverviewBBox(); // set overview marker
  } catch (e) {}
}

function my_registerVendorSpecific(stringFunction) {
  myVendorSpecific[myVendorSpecific.length] = stringFunction;
}

function my_getVendorSpecificString() {
  content = "";
  for(var j=0;j<myVendorSpecific.length;j++) {
    if(eval(myVendorSpecific[j])) {
      content += "&" + eval(myVendorSpecific[j]);
    }
  }
  return content;
}

////////////////////////////
  // navigation
////////////////////////////

function my_repaintXYSc(x,y,sc) {

  if(isNaN(x) == true || isNaN(y) == true || isNaN(sc) == true) { return; }
  if(!my_checkWMSComplete()) { return; }
  myCount++;
  var pos = new Array();
  if(x == null && y == null){
    pos = my_getXYSc();
    x = pos[0];
    y = pos[1];
  }
  if(sc == null || sc == "" || sc == "undefined") {
    pos = my_getXYSc();
    sc = pos[2];
  }
  if(sc<myMinMaxScale[0]) {
    my_repaintXYSc(x,y,myMinMaxScale[0]);
    if(msgList[14] != "") { alert(msgList[14]+ " 1:"+myMinMaxScale[0]); }
    return;
  }
  if(sc>myMinMaxScale[1]) {
    my_repaintXYSc(null,null,myMinMaxScale[1]);
    if(msgList[13] != "") { alert(msgList[13]+ " 1:"+myMinMaxScale[1]); }
    return;
  }

  sc = my_checkScaleMatching(sc);

  var bbtmp = new Array(myBBox[0],myBBox[1],myBBox[2],myBBox[3]);
  // bbox for ogc maprequest
  myBBox[0] = Math.round((x-(myMapSize[0]/(myResolution*100*2)*sc))*100)/100;
  myBBox[1] = Math.round((y-(myMapSize[1]/(myResolution*100*2)*sc))*100)/100;
  myBBox[2] = Math.round((x+(myMapSize[0]/(myResolution*100*2)*sc))*100)/100;
  myBBox[3] = Math.round((y+(myMapSize[1]/(myResolution*100*2)*sc))*100)/100;
  if(myMaxBBox[0]!=0 && (myBBox[0]<myMaxBBox[0] || myBBox[1]<myMaxBBox[1] || myBBox[2]>myMaxBBox[2] || myBBox[3]>myMaxBBox[3])) {
    myBBox = new Array(bbtmp[0],bbtmp[1],bbtmp[2],bbtmp[3]);
    my_arrangeElement("layerAll",0,0);
    my_eventLayer(false);
    alert(msgList[12]);
    my_setXYSc(myXY[0],myXY[1],null);
    return;
  }

  pos = my_getXYSc();
  myXY[0] = pos[0];
  myXY[1] = pos[1];
  myScale = pos[2];
  if(visSc==1) { my_setScaleFromList(); }
  my_setXYSc(myXY[0],myXY[1],myScale);
  if(my_checkDIV("divScalebar")) { my_getID("divScalebar").innerHTML = my_scalebar(28.35); }
  my_eventLayer(false);
  my_measureStop();
  my_setSlider(myScale);
  my_setHistoryObj();
  my_setMapRequest(0);
  my_setKeyhandler();
  my_getOverviewFrame();
}

function my_checkScaleMatching(sc) {
  if(myScaleMatching.length>0 && myMapHistory[myMapHistory.length-1]) {
    var oldSc = myMapHistory[myMapHistory.length-1].toString().split(",");
    if(sc < oldSc[2]) { var tmp=1; }
    if(sc > oldSc[2]) { var tmp=0; }
    if(sc != oldSc[2]) {
      for(var i=0;i<myScaleMatching.length;i++) {
        if(sc==myScaleMatching[i]){break;}
        if(sc<=myScaleMatching[i]*1.01) { sc=myScaleMatching[i-tmp];break; }
      }
    }
  }
  return(sc);
}


function my_setXYSc(x,y,sc) {
  if(myShowXYSc) {
    if(x != null) { document.frmXYSc.x.value = x; }
    if(y != null) { document.frmXYSc.y.value = y; }
    if(sc != null) { document.frmXYSc.sc.value = "1:"+sc; }
  }
}

var visSc=0;
function my_setScaleFromList() {
  my_eventLayer(false);
  vis=visSc;
  vis=(vis-1)*(vis-1);
  visSc=vis;
  if(visSc==1) {
    my_getID("divScaleList").style.display = "inline";
    document.images["imgScList"].src = folderCloseImg.src;
    my_getID("divScaleList").style.top=myMapPos[0]+myMapSize[1]-(myScaleList.length*12);
  } else {
    my_getID("divScaleList").style.display = "none";
    document.images["imgScList"].src = folderOpenImg.src;
  }
}

function my_dialogXYSc() {
  var x = document.frmXYSc.x.value;
  var y = document.frmXYSc.y.value;
  var sc = document.frmXYSc.sc.value;
  sc = sc.replace(/1:/g,"");
  x = x.replace(/[.,]/g,"");
  y = y.replace(/[.,]/g,"");
  sc = sc.replace(/[.,]/g,"");
  if(isNaN(x) == true || isNaN(y) == true || isNaN(sc) == true) {
    alert(msgList[4]);
    my_setXYSc(myXY[0],myXY[1],myScale);
    my_eventLayer(false);
    return;
  }
  my_repaintXYSc(Math.abs(x),Math.abs(y),Math.abs(sc));
}

//maprequest is only possible when all WMS complete
function my_checkWMSComplete() {

  //needed for: key,nav,pan,slider-click,slider-drag,overview-click,overview-zoom,link,mapresize
  if(myCount>1 && myCheckWMSComplete && my_getID("divWaitIcon").innerHTML != "") {
    my_arrangeElement("layerAll",0,0);
    my_eventLayer(false);
    if(my_getID("divWaitIcon").innerHTML.search(/\berror\b/i) == -1) {
      my_getID("divWaitIcon").innerHTML+="<p class='error'>"+msgList[10]+"</p>";
    }
    return false;
  }
  return true;
}

function my_getXYSc() {
  var pos = new Array();
  pos[0] = Math.round(((myBBox[2]-myBBox[0])/2)+myBBox[0]);
  pos[1] = Math.round(((myBBox[3]-myBBox[1])/2)+myBBox[1]);
  pos[2] = Math.round(((myBBox[3]-myBBox[1])/myMapSize[1])*(myResolution*100));
  return pos;
}

function my_zoomMap(factor) {
 var pos = my_getXYSc();
 pos[2] *= factor;
 my_repaintXYSc(pos[0],pos[1],pos[2]);
}

function my_moveMap(addX,addY) {
  var pos = my_getXYSc();
  if(addX==-1 && addY==-1) { // center
     pos[0] = myHome[0];
     pos[1] = myHome[1];
     pos[2] = myHome[2];
     if(my_getID("myIFrame0")) { my_changeIFrame("myIFrame0"); }
  } else {
    var addX = (myBBox[2]-myBBox[0])*addX;
    var addY = (myBBox[3]-myBBox[1])*addY;
    pos[0] += addX;
    pos[1] += addY;
  }
  my_repaintXYSc(Math.round(pos[0]),Math.round(pos[1]),pos[2]);
}

function my_mOverEl(elName) {
  elName.style.cursor = "default";
  elName.style.border = myActivButtonStyle[1];
}

function my_mOutOfEl(elName) {
  elName.style.border = "none";
}

function my_mClickEl(elName) {
  if(!elName && my_checkDIV(myActivButton)) { // default function:pan
    my_getID(myActivButton).style.backgroundColor = "transparent";
    my_getID(myActivButton).style.border = "none";
  }
  var t = typeof(elName);
  if(t == "object") { elName = elName.id; }
  if(my_checkDIV(elName)) {
    if(my_checkDIV(myActivButton)) {
      my_getID(myActivButton).style.backgroundColor = "transparent";
      my_getID(myActivButton).style.border = "none";
    }
    if(myActivButtonStyle[0] != null) {
      my_getID(elName).style.backgroundColor = myActivButtonStyle[0];
    }
    if(myActivButtonStyle[1] != null) {
      my_getID(elName).style.border = myActivButtonStyle[1];
    }
    my_getID(elName).style.fontSize = "0px";
    myActivButton = elName;
  }
}

function my_setInfo(val) {
  if(!val) { val = ""; }
  if(my_checkDIV("divInfo")) {
    my_getID("divInfo").innerHTML = val;
  }
}

function my_createDiv(elName,left,top,width,height,visible,content) {
  if(width>0 && height>0) {
    document.writeln('<div id="'+elName+'" style="position:absolute;left:'+left+'px;top:'+top+'px;width:'+width+'px;height:'+height+'px;visibility:'+(visible ? 'visible;' : 'hidden;')+'">');
  } else {
    document.writeln('<div id="'+elName+'" style="position:absolute;left:'+left+'px;top:'+top+'px;visibility:'+(visible ? 'visible;' : 'hidden;')+'">');
  }
  document.writeln(content);
  document.writeln('</div>');
}

function my_checkDIV(elName) {
  if(my_getID(elName)) { return true; } else { return false; }
}

function my_arrangeElement(elName,left,top,width,height) {
  var t =typeof(elName);
  if(t == "string") { elName = new Object(my_getID(elName)); }
  if(left != null) { elName.style.left = left; }
  if(top != null) { elName.style.top = top; }
  if(width) { elName.style.width = width; }
  if(height) { elName.style.height = height; }
}

function my_getMousePos(e) {
  if(ie) {
    myClickXY[0]=event.clientX+document.body.scrollLeft-myMapPos[0];
    myClickXY[1]=event.clientY+document.body.scrollTop-myMapPos[1];
  } else {
    myClickXY[0] = e.pageX-myMapPos[0];
    myClickXY[1] = e.pageY-myMapPos[1];
  }
}

function my_pixel2Meter(pixX,pixY) {
  var posX = myBBox[0]+(pixX/myMapSize[0])*(myBBox[2]-myBBox[0]);
  var posY = myBBox[3]-(pixY/myMapSize[1])*(myBBox[3]-myBBox[1]);
  posX = Math.round(posX*100)/100;
  posY = Math.round(posY*100)/100;
  return new Array(posX,posY);
}

function my_meter2Pixel(meterX,meterY) {
  var posX =((meterX-myBBox[0])/(myBBox[2]-myBBox[0]))*myMapSize[0];
  var posY =((myBBox[3]-meterY)/(myBBox[3]-myBBox[1]))*myMapSize[1];
  return new Array(posX,posY);
}

function my_bb2Scale(bb) {
  myXY[0] = ((bb[2]-bb[0])/2)+Math.round(bb[0]);
  myXY[1] = ((bb[3]-bb[1])/2)+Math.round(bb[1]);
  if( (bb[2]-bb[0]) > (bb[3]-bb[1]) ) {
    myScale = Math.round((((bb[2]-bb[0])/myMapSize[0])*1000*3.5)+(bb[2]-bb[0])/10);
  } else {
    myScale = Math.round((((bb[3]-bb[1])/myMapSize[1])*1000*3.5)+(bb[3]-bb[1])/10);
  }
}

function my_showHighlight(x,y) {
  if(my_checkDIV("divHighlightIcon")) {
    var pos = my_meter2Pixel(x,y);
    my_arrangeElement("divHighlightIcon",pos[0]-(highlightImg.width/2),pos[1]-(highlightImg.height/2));
    my_getID("divHighlightIcon").style.visibility = "visible";
  }
  return false;
}

function my_hideHighlight() {
  if(my_checkDIV("divHighlightIcon")) {
    my_arrangeElement("divHighlightIcon",-20,-20);
    my_arrangeElement("divHighlightIcon",-20,-20);
    my_getID("divHighlightIcon").style.visibility = "hidden";
  }
  return false;
}

////////////////////////////
  // mapresize
////////////////////////////

function my_mapResize() {

  // wait until WMS request is complete
  if(!my_checkWMSComplete()) { return; }
  window.scrollTo(0,0);
  document.onmousemove = my_mapResizeRun;
  document.onmouseup = my_mapResizeStop;
  my_eventLayer(true);
  myMapResize = my_getID("divMapResize");
  myMapResize.style.borderWidth = "2px";
  my_arrangeElement(myMapResize,myMapPos[0],myMapPos[1],myMapSize[0],myMapSize[1]);
}

function my_mapResizeRun(e) {
  my_getMousePos(e);
  myClickXY[0] += myMapPos[0];
  myClickXY[1] += myMapPos[1];
  if((myClickXY[0]-myMapPos[0])>myMapSizeMax[0] || (myClickXY[1]-myMapPos[1])>myMapSizeMax[1]) {
    my_mapResizeStop(e);
    alert(msgList[11]+" ("+myMapSizeMax[0]+"x"+myMapSizeMax[1]+")");
    return false;
  }
  my_arrangeElement(myMapResize,null,null,myClickXY[0]-myMapPos[0],myClickXY[1]-myMapPos[1]);
  return false;
}

function my_mapResizeStop(e) {
  document.onmousemove = null;
  document.onmouseup = null;
  if(isNaN(myClickXY[0]) == true || isNaN(myClickXY[0]) == true) {
    myClickXY = new Array(myMapPos[0]+myMapSize[0]+2,myMapPos[1]+myMapSize[1]+2);
  }
  if(myClickXY[0]-myMapPos[0] < myMapSizeMin[0]) {
    myClickXY[0] = myMapSizeMin[0];
  }
  if(myClickXY[1]-myMapPos[1] < myMapSizeMin[1]) {
    myClickXY[1] = myMapSizeMin[1];
  }
  if(myClickXY[0]-myMapPos[0] < myMapSizeMin[0] || myClickXY[1]-myMapPos[1] < myMapSizeMin[1]) {
    alert(msgList[11]+" ("+myMapSizeMin[0]+"x"+myMapSizeMin[1]+")");
  }
  myMapresizeDiff[0] = myClickXY[0]-myMapPos[0]-myMapSize[0];
  myMapresizeDiff[1] = myClickXY[1]-myMapPos[1]-myMapSize[1];
  var newMeterX = myBBox[0]+((((myBBox[2]-myBBox[0])/myMapSize[0])*(myClickXY[0]-myMapPos[0]))/2);
  var newMeterY = myBBox[3]-((((myBBox[3]-myBBox[1])/myMapSize[1])*(myClickXY[1]-myMapPos[1]))/2);
  myMapSize[0] = myClickXY[0]-myMapPos[0];
  myMapSize[1] = myClickXY[1]-myMapPos[1];
  my_arrangeElement(myMapResize,myMapSize[0]+myMapPos[0]-8-myFrameBorder,myMapSize[1]+myMapPos[1]-8-myFrameBorder,13,13);
  myMapResize.style.borderWidth = "0px";
  my_repaintXYSc(newMeterX,newMeterY,myScale);
  my_mapResizeNaviBar();
  my_mapResizeSubFunctions();
}

function my_mapResizeSubFunctions() {}

////////////////////////////
  // panning
////////////////////////////

function my_panInit() {
  myMapFrame.style.cursor = "pointer";
  myMapFrame.onmousedown = my_panStart;
  myMapFrame.onmousemove = my_panRun;
  myMapFrame.onmouseup = my_panStop;
}

function my_panStart(e) {

  // wait until WMS request is complete
  if(my_checkWMSComplete()) {
    myPanActive = true;
  } else {
    myPanActive = false;
  }

  myMapFrame.style.cursor = "move";
  my_getMousePos(e);
  myStartXY[0] = myClickXY[0];
  myStartXY[1] = myClickXY[1];
  myEndXY[0] = myClickXY[0];
  myEndXY[1] = myClickXY[1];
  return false;
}

function my_panRun(e) {
  my_getMousePos(e);
  if(myPanActive) {
    if(myClickXY[0]>0 && myClickXY[1]>0 && myClickXY[0]<myMapSize[0] && myClickXY[1]<myMapSize[1]) {
      myEndXY[0] = myClickXY[0];
      myEndXY[1] = myClickXY[1];
      var pos1 = my_pixel2Meter(myStartXY[0],myStartXY[1]);
      var pos2 = my_pixel2Meter(myEndXY[0],myEndXY[1]);
      my_arrangeElement("layerAll",myEndXY[0]-myStartXY[0],myEndXY[1]-myStartXY[1]);
    }
  }

  if(myShowXYoutput == 1) {
    var pos = my_pixel2Meter(myClickXY[0],myClickXY[1]);
    window.status = "XY: "+pos[0]+","+pos[1];
  }
  if(myShowXYoutput == 2) {
    var pos = my_pixel2Meter(myClickXY[0],myClickXY[1]);
    document.frmXYSc.x.value = Math.round(pos[0]);
    document.frmXYSc.y.value = Math.round(pos[1]);
  }

  return false;
}

function my_panStop(e) {
 if(myPanActive) {
   out();
   myPanActive = false;
//   window.status = "";
   var dif_x = myEndXY[0]-myStartXY[0];
   var dif_y = myEndXY[1]-myStartXY[1];
   if(Math.abs(dif_x)>10 || Math.abs(dif_y)>10) {
     var newMeterX = ((myBBox[2]-myBBox[0])/myMapSize[0])*dif_x;
     var newMeterY = (((myBBox[3]-myBBox[1])/myMapSize[1])*dif_y)*-1;
     var pos = my_getXYSc();
     my_repaintXYSc(pos[0]-newMeterX,pos[1]-newMeterY,null);
   } else {
     my_arrangeElement("layerAll",0,0);
     my_eventLayer(false);
   }
   // start feature request
   if(dif_x == 0 && dif_y == 0) {
     //alert("clickpoint: "+myClickXY);
     if(ie) { var code = event.button; } else { var code = e.button; }
     if(code != 2) { my_setFeatureRequest(0); }
   }
 }
 if(mySlideActive) { my_sliderStop(e); }
}


////////////////////////////
  // slidebar
////////////////////////////
function my_sliderInit() {
 if(my_checkDIV("divSlideBarIcon") && my_checkDIV("divSliderIcon")) {
  var mySlideBar = my_getID("divSlideBarIcon");
  var mySlideIcon = my_getID("divSliderIcon");
  if(parseInt(mySlideBar.style.width) > parseInt(mySlideBar.style.height)) { mySlideBarVertical = true; }
  if(mySlideBarVertical) {
    mySlidePixel[1] = parseInt(mySlideBar.style.left)+parseInt(mySlideIcon.style.width)/2+1; //left
    mySlidePixel[0] = parseInt(mySlideBar.style.left)+parseInt(mySlideBar.style.width)-parseInt(mySlideIcon.style.width)/2; // -1:for shaddow;
  } else {
    mySlidePixel[0] = parseInt(mySlideBar.style.top)+parseInt(mySlideIcon.style.height)/2-1+(myFrameBorder/2); //top
    mySlidePixel[1] = parseInt(mySlideBar.style.top)+parseInt(mySlideBar.style.height)-parseInt(mySlideIcon.style.height)/2-2+(myFrameBorder/2);
  }
  mySlideBar.onclick = my_sliderRun;
  mySlideIcon.onmousedown = my_sliderStart;
 }
}

function my_sliderStart(e) {
  if(!my_checkWMSComplete()) {return;}
  document.onmousemove = my_sliderRun;
  document.onmouseup = my_sliderStop;
  my_eventLayer(true);
  mySlideActive = true;
  my_getID("layerMeasureLine").style.visibility = "hidden";
  my_getID("layerMeasureRun").style.visibility = "hidden";
  for(var i=0;i<myUsemap.length;i++) {
    my_getID("layerUsemap"+i).style.visibility = "hidden";
  }
  my_getID("layerMarker").style.visibility = "hidden";
  return false;
}

function my_sliderRun(e) {
  if(!my_checkWMSComplete()) {return;}
  my_getMousePos(e);
  if(mySlideBarVertical) {
    myClickXY[0] += myMapPos[0];
      var proc = (100/(mySlidePixel[0]-mySlidePixel[1]))*(myClickXY[0]-mySlidePixel[1]);
  } else {
    myClickXY[1] += myMapPos[1];
    var proc = 100-((100/(mySlidePixel[1]-mySlidePixel[0]))*(myClickXY[1]-mySlidePixel[0]));
  }
  if(proc>100) { proc = 100; }
  if(proc<0) { proc = 0; }
  proc=proc/100;
  mySliderScale =Math.round((1-proc)*myMinMaxScale[1]+(proc*myMinMaxScale[0])-(proc*(1-proc)*myMinMaxScale[1]));

  if(mySliderScale && mySliderScale>=myMinMaxScale[0] && mySliderScale<=myMinMaxScale[1]) {

    if(mySliderScaleMatching) { mySliderScale=my_checkScaleMatching(mySliderScale); }
    my_setXYSc(null,null,mySliderScale);
    my_setSlider(mySliderScale);
    if(mySliderPreview) { my_sliderMapframe(mySliderScale); } // mapframe resizen
  }
  if(mySlideActive==false) { my_sliderStop(e); } else { return false; } //after slidebarclick->redraw, no mapslide
}

function my_setSlider(sc) {
 if(my_checkDIV("divSlideBarIcon") && my_checkDIV("divSliderIcon")) {
   var eqPart=Math.sqrt((myMinMaxScale[0]*myMinMaxScale[0])+(4*myMinMaxScale[1]*sc)-(4*myMinMaxScale[1]*myMinMaxScale[0]));
   var newPos = ((2*myMinMaxScale[1])-myMinMaxScale[0]+eqPart)/(2*myMinMaxScale[1]);
   if(newPos<0 || newPos>1) {
     newPos=((2*myMinMaxScale[1])-myMinMaxScale[0]-eqPart)/(2*myMinMaxScale[1]);
   }
   if(newPos>1 || isNaN(newPos)) { newPos = 1; }
   if(mySlideBarVertical) {
     my_getID("divSliderIcon").style.left = mySlidePixel[1]-((mySlidePixel[1]-mySlidePixel[0])*newPos)-parseInt(my_getID("divSliderIcon").style.width)/2-1; //-1: shaddow
   } else {
     newPos=1-newPos;
     my_getID("divSliderIcon").style.top = mySlidePixel[0]+((mySlidePixel[1]-mySlidePixel[0])*newPos)-parseInt(my_getID("divSliderIcon").style.height)/2-myFrameBorder+1;
   }
 }
}

function my_sliderMapframe(sc) {

  var scRatio = myScale/sc;
  var oldW = myMapSize[0];
  var oldH = myMapSize[1];
  var newW = oldW*scRatio;
  var newH = oldH*scRatio;
  var newLeft = (oldW-newW)/2;
  var newTop = (oldH-newH)/2;

  try {
    for(var i=0;i<myWMS.length;i++) {
      if(my_getID("map"+i).src.indexOf("transparent.gif")<0) {
        my_arrangeElement("map"+i,newLeft,newTop,newW,newH);
        var diffW = Math.round((newW-oldW)/2);
        var diffH = Math.round((newH-oldH)/2);
        var clip = new Array(diffH,diffW+oldW,diffH+oldH,diffW);
        my_getID("map"+i).style.clip='rect('+clip[0]+'px '+clip[1]+'px '+clip[2]+'px '+clip[3]+'px)';
      }
    }
  } catch (e) {}
}

function my_sliderStop(e) {
  document.onmousemove = null;
  document.onmouseup = null;
  mySlideActive = false;
  for(var i=0;i<myUsemap.length;i++) {
    my_getID("layerUsemap"+i).style.visibility = "visible";
  }
  my_getID("layerMarker").style.visibility = "visible";
  my_getID("layerMeasureLine").style.visibility = "visible";
  my_getID("layerMeasureRun").style.visibility = "visible";
  my_repaintXYSc(null,null,mySliderScale);
}

////////////////////////////
  // scalebar
////////////////////////////
function my_scalebar(res) {
  if(myScale<10){
    var unit = '10&nbsp;cm';
    var factor = 10/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale>= 10 && myScale< 100){
    var unit = '1&nbsp;m';
    var factor = 100/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 1000 && myScale>= 100){
    var unit = '10&nbsp;m';
    var factor = 1000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 10000 && myScale>= 1000){
    var unit = '100&nbsp;m';
    var factor = 10000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 100000 && myScale>= 10000){
    var unit = '1&nbsp;km';
    var factor = 100000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 1000000 && myScale>= 100000){
    var unit = '10&nbsp;km';
    var factor = 1000000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 10000000 && myScale>= 1000000){
    var unit = '100&nbsp;km';
    var factor = 10000000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale< 100000000 && myScale>= 10000000){
    var unit = '1000&nbsp;km';
    var factor = 100000000/myScale;
    var img_width = Math.round(factor * res);
  }
  if(myScale>= 100000000){
    var unit = '1000&nbsp;km';
    var factor = 100000000/myScale;
    var img_width = Math.round(factor * res);
  }
  var tmp = "<img src='"+scalebarImg.src+"' width='"+img_width+"'>";
  tmp+="<font style='position:absolute;left:"+(img_width+5)+";top:-5;color:white'>"+unit+"</font>";
  tmp+="<font style='position:absolute;left:"+(img_width+4)+";top:-6'>"+unit+"</font>";
  return tmp;
}


////////////////////////////
  // zoombox
////////////////////////////

function my_zoomBoxInit() {
  my_measureStop();
  my_eventLayer(true);
  myMapFrame.style.cursor = "crosshair";
  myMapFrame.onmousedown = my_zoomBoxStart;
  myMapFrame.onmousemove = my_zoomBoxRun;
  myMapFrame.onmouseup = my_zoomBoxStop;
}

function my_zoomBoxStart(e) {
  myZoomBoxActive = true;
  my_getMousePos(e);
  myStartXY[0] = myClickXY[0];
  myStartXY[1] = myClickXY[1];
  zbb = new Array(myClickXY[0],myClickXY[1],myClickXY[0],myClickXY[1]);
  return false;
}

function my_zoomBoxRun(e) {
  my_getMousePos(e);
  var pos = my_pixel2Meter(myClickXY[0],myClickXY[1]);
  window.status = "XY: "+pos[0]+","+pos[1];
  if(myZoomBoxActive) {
    if(ie) { var ad = 3; } else { var ad = 1; }
    if(myStartXY[0] > myClickXY[0]) {
      zbb[0] = myClickXY[0]-ad;
      zbb[2] = myStartXY[0]-ad;
    } else {
      zbb[0] = myStartXY[0]-4;
      zbb[2] = myClickXY[0]-4;
    }
    if(myStartXY[1] > myClickXY[1]) {
      zbb[3] = myStartXY[1]-ad;
      zbb[1] = myClickXY[1]-ad;
    } else {
      zbb[1] = myStartXY[1]-4;
      zbb[3] = myClickXY[1]-4;
    }
    if((zbb[2]-zbb[0])>0 && (zbb[3]-zbb[1])>0 && zbb[0]>0 && zbb[1]>0 && zbb[2]<myMapSize[0] && zbb[3]<myMapSize[1]) {
      var myZoomBox = my_getID("layerZoomBox");
      myZoomBox.style.borderWidth = "1px";
      myZoomBox.style.visibility = "visible";
      my_arrangeElement("layerZoomBox",zbb[0],zbb[1],zbb[2]-zbb[0],zbb[3]-zbb[1]);
    }
  }
  return false;
}

function my_zoomBoxStop(e) {
  myZoomBoxActive = false;
  myMapFrame.onmousedown = null;
  myMapFrame.onmousemove = null;
  myMapFrame.onmouseup = null;
  var pos1 = my_pixel2Meter(zbb[0],zbb[3]); //zbb(left-top,right-bottom)
  var pos2 = my_pixel2Meter(zbb[2],zbb[1]);
  var mapX = ((pos2[0]-pos1[0])/2)+pos1[0];
  var mapY = ((pos2[1]-pos1[1])/2)+pos1[1];
  if((pos2[0]-pos1[0])>(pos2[1]-pos1[1])) {
    var newSc = (myScale/(myBBox[2]-myBBox[0]))*(pos2[0]-pos1[0]);
  } else {
    var newSc = (myScale/(myBBox[3]-myBBox[1]))*(pos2[1]-pos1[1]);
  }
  my_getID("layerZoomBox").style.visibility = "hidden";
  if(mySelection) {
    if((zbb[2]-zbb[0]<10) || (zbb[3]-zbb[1]<10) || zbb[0]==zbb[2] || zbb[1]==zbb[3]) { // point selection
      my_setMarker(mapX,mapY,myScale,"",1);
    } else {
      myMeasureFormat = 0;
      my_measureDelete();
      myMeasure[0] = new Array(pos1[0],pos1[1],0,0);
      var dt = pos2[0]-pos1[0];
      myMeasure[1] = new Array(pos2[0],pos1[1],pos2[0]-pos1[0],dt);
      dt = pos2[1]-pos1[1]+dt;
      myMeasure[2] = new Array(pos2[0],pos2[1],pos2[1]-pos1[1],dt);
      dt = pos2[0]-pos1[0]+dt;
      myMeasure[3] = new Array(pos1[0],pos2[1],pos2[0]-pos1[0],dt);
      dt = pos2[1]-pos1[1]+dt;
      myMeasure[4] = new Array(pos1[0],pos1[1],pos2[1]-pos1[1],dt);
      myMeasurePolyClosed = true;
      my_drawDashedLine();
    }
    my_setFeatureRequest(1);
  } else {
    my_repaintXYSc(mapX,mapY,newSc);
  }
  zbb = new Array();
  window.status = "";
}


////////////////////////////
  // measure
////////////////////////////

function my_measureInit(val) { // 0:nothing; 1:tt+list; 2:list; 3:tt
  if(val) { myMeasureFormat = val; }
  if(myMeasurePolyClosed == true) { my_measureDelete(); }
  my_eventLayer(true);
  myMeasureActive = true;
  myMapFrame.style.cursor = "crosshair";
  myMapFrame.onmousedown = my_measureStart;
  myMapFrame.onmousemove = my_measureRun;
  myMapFrame.ondblclick = my_polyClose;
  myMapFrame.onmouseup = null;
}

function my_measureStart(e) {
  myMeasurePolyClosed = false;
  my_getMousePos(e);
  // right mouseclick -> stop

  if(ie) { var code = event.button; } else { var code = e.button; }
  if(code == 2) { my_polyClose(); return; }

  var pos = my_pixel2Meter(myClickXY[0],myClickXY[1]);
  myMeasure[myMeasure.length] = new Array(0,0,0,0);
  myMeasure[myMeasure.length-1][0] = (pos[0]*100)/100;
  myMeasure[myMeasure.length-1][1] = (pos[1]*100)/100;
  if(myMeasure.length > 1) {
    var dist_x = Math.abs(myMeasure[myMeasure.length-2][0]-myMeasure[myMeasure.length-1][0]);
    var dist_y = Math.abs(myMeasure[myMeasure.length-2][1]-myMeasure[myMeasure.length-1][1]);
    if(dist_x==0 && dist_y==0) { myMeasure.pop(); }
    else {
      var dist = Math.round(Math.sqrt(Math.pow(dist_x,2)+Math.pow(dist_y,2))*100)/100;
      myMeasure[myMeasure.length-1][2] = dist;
      var totalDist = myMeasure[myMeasure.length-2][3]+dist;
      myMeasure[myMeasure.length-1][3] = Math.round(totalDist*100)/100;
    }
  }
  // poly closed
  var d = my_getDistance(myMeasure[0][0],myMeasure[0][1],myMeasure[myMeasure.length-1][0],myMeasure[myMeasure.length-1][1]);
  var tol = 5*(myBBox[2]-myBBox[0])/myMapSize[1];
  if(tol<0.5) { tol = 0.3; }
  if(myMeasure.length>2 && d<tol) {
    myMeasurePolyClosed = true;
    myMeasure[myMeasure.length-1][0] = myMeasure[0][0];
    myMeasure[myMeasure.length-1][1] = myMeasure[0][1];
    my_polyClose();
  }
  my_drawDashedLine();
  if(myMeasure.length>myMaxMeasurePoints) {
    my_measureStop();
    alert(msgList[8]);
  }
  return false;
}

function my_measureRun(e) {
  my_setKeyhandler();
  my_getMousePos(e);
  var pos = my_pixel2Meter(myClickXY[0],myClickXY[1]);
  window.status = "XY: "+(Math.round(pos[0]*100)/100)+","+(Math.round(pos[1]*100)/100);
  if(myMeasure.length>0){
    var dist_x = Math.abs(myMeasure[myMeasure.length-1][0]-pos[0]);
    var dist_y = Math.abs(myMeasure[myMeasure.length-1][1]-pos[1]);
    if(isNaN(dist_x) == false) {
      // rubberline
      var posn = my_meter2Pixel(myMeasure[myMeasure.length-1][0],myMeasure[myMeasure.length-1][1]);
      var str_display = my_evaluateDashes(posn[0],posn[1],myClickXY[0],myClickXY[1],0);

      if(mySelection && mySelectionAutoClose) { //autom. close poly; 1st point to mousepos
        posn = my_meter2Pixel(myMeasure[0][0],myMeasure[0][1]);
        str_display += my_evaluateDashes(posn[0],posn[1],myClickXY[0],myClickXY[1],0);
      }
      str_display += "<div style='position:absolute;left:"+(myClickXY[0])+"px;top:"+(myClickXY[1]-20)+"px;z-index:2'><font class='divMeasureText'>"+(Math.round(Math.sqrt(Math.pow(dist_x,2)+Math.pow(dist_y,2))*1)/1)+"&nbsp;m</font></div>";
    } else {
      var str_display = "";
    }
    my_getID("layerMeasureRun").innerHTML = str_display;
  }
  return false;
}

function my_measureStop() {
  myMeasureActive = false;
  window.status = "";
  my_getID("layerMeasureRun").innerHTML = "";
  myMapFrame.onmousedown = null;
  myMapFrame.onmousemove = null;
  myMapFrame.ondblclick = null;
  myMapFrame.onmouseup = null;
  my_eventLayer(false);
}

function my_measureDelete() {
  myMeasureActive = false;
  myMeasure = new Array();
  my_getID("layerMeasureLine").innerHTML = "";
  my_getID("layerMeasureRun").innerHTML = "";
  myMeasurePolyClosed = false;
  my_eventLayer(false);
  window.status = "";
}

function my_drawDashedLine() {
  var str_mPoints = "";
  for(var i=0;i<myMeasure.length;i++) {
    var pos = my_meter2Pixel(myMeasure[i][0],myMeasure[i][1]);
    // 1. point
    if(i==0 && myMeasurePolyClosed == false) {
      if(ie) { wz=8;pz=5; } else { wz=5;pz=6; }
      str_mPoints += "<div class='divMeasure1stPoint' style='position:absolute;top:"+(pos[1]-pz)+"px;left:"+(pos[0]-pz)+"px;width:"+wz+"px;height:"+wz+"px'></div>";
    } else {
      // measure labels
      if(myScale<myMaxScaleMeasure && isNaN(myMeasure[i][3]) == false) {
        if(myMeasureFormat==1 || myMeasureFormat==3) { // output tooltip
          str_mPoints += "<div style='position:absolute;top:"+(pos[1])+"px;left:"+(pos[0])+"px;z-index:2'><font class='divMeasureText'>"+i+":"+Math.round(myMeasure[i][3])+"m (+"+Math.round(myMeasure[i][2])+")</font></div>";
        }
      }
    }
/*
    if(myMeasureActive && (myMeasureFormat==2 || myMeasureFormat==3)) {
      my_getMeasureFrame(myShowMeasure);
    }
*/
  }
  if(myMeasure.length>1) {
    for(var k=1;k<myMeasure.length;k++){
      var pos0 = my_meter2Pixel(myMeasure[k][0],myMeasure[k][1]);
      var pos1 = my_meter2Pixel(myMeasure[k-1][0],myMeasure[k-1][1]);
      str_mPoints += my_evaluateDashes(pos1[0],pos1[1],pos0[0],pos0[1],0);
    }
  }
  my_getID("layerMeasureLine").innerHTML = str_mPoints;

}

function my_evaluateDashes(x1,y1,x2,y2,count) {
  var str_dashedLine = "";
  var s = myMeasureDashDist;
  var d = Math.sqrt(Math.pow((y1-y2),2)+Math.pow((x1-x2),2)) ;
  var n = Math.round(d/s);
  var s_x = (x2-x1)/n;
  var s_y = (y2-y1)/n;
  for(var i=0;i<=n;i++) {
    var x = Math.round(x1+i*s_x)-3;
    var y = Math.round(y1+i*s_y)-3;
    if(isNaN(x) == false && isNaN(y) == false) {
      if(i == 0 || i == n) { var myCl = "divMeasurePoint"; } else { var myCl = "divMeasureLine"; }
      if(ie) { myCl += "IE"; } else { myCl += "NS"; } // div's in print:only border, not bgcolor
      str_dashedLine += "<div class='"+myCl+"' style='position:absolute;top:"+y+"px;left:"+x+"px'></div>";
    }
  }
  return str_dashedLine;
}

function my_polyClose() {
  if(myMeasure[0][0]==myMeasure[myMeasure.length-1][0] && myMeasure[0][1]==myMeasure[myMeasure.length-1][1]) {
    myMeasurePolyClosed = true;
  } else { myMeasurePolyClosed = false; }
  my_measureStop();
  if(mySelection) {
   if(mySelectionAutoClose) {
    if(myMeasure[0][0]!=myMeasure[myMeasure.length-1][0]) {
      myMeasure.push(myMeasure[0]);
      myMeasurePolyClosed = true;
      my_drawDashedLine();
    }
    my_setFeatureRequest(1);
   } else {
    if(myMeasure[0][0]==myMeasure[myMeasure.length-1][0]) { my_setFeatureRequest(1); }
   }
  } else {
    if(myMeasureFormat==1 || myMeasureFormat==2) { my_getMeasureFrame(myShowMeasure); }
  }
}

function my_getDistance(dx1,dy1,dx2,dy2) {
  return Math.sqrt((dx1-dx2)*(dx1-dx2)+(dy1-dy2)*(dy1-dy2));
}

function my_measureArea() {
  var a = 0;
  if(myMeasurePolyClosed == true) {
    for(var i=1;i<myMeasure.length;i++) {
      a += (myMeasure[i-1][1]-myMeasure[i][1])*(myMeasure[i-1][0]+myMeasure[i][0]);
    }
    a = Math.abs(a/2);
    a = Math.round(a*1)/1;
  }
  return a;
}

function my_measureCenter() {
  if(myMeasure.length>0) {
    var bbPoly = my_getBBoxPoly();
    var w = Math.round(bbPoly[2]-bbPoly[0]);
    var h = Math.round(bbPoly[3]-bbPoly[1]);
    var ppm = 3.5;
    if(w > h) { sc = Math.round(((w/myMapSize[0])*1000*ppm)+w/1); }
    else { sc = Math.round(((h/myMapSize[1])*1000*ppm)+h/1); }
    myXY = new Array(Math.round((w/2)+parseFloat(bbPoly[0])),Math.round((h/2)+parseFloat(bbPoly[1])));
    if(sc<100) { sc = 100; }
    my_repaintXYSc(myXY[0],myXY[1],sc);
  }
}
function my_getBBoxPoly() {
  sortX = new Array();
  sortY = new Array();
  for(var i=0;i<myMeasure.length;i++) { sortX.push(myMeasure[i][0]);sortY.push(myMeasure[i][1]) }
  sortX.sort(my_numsort);
  sortY.sort(my_numsort);
  return new Array(sortX[0],sortY[0],sortX[sortX.length-1],sortY[sortY.length-1]);
}
function my_numsort(a,b) { return a-b; }

function my_measureInput() {
  n=prompt(msgList[15],"");
  if(n != null && n!="") {
    n=n.replace(/[ ;]/g,",");
    my_measureDelete();
    args=n.toString().split(',');
    var j = 0;
    for(var i=0;i<args.length;i++) {
      if(isNaN(args[i]) == false && args[i]>0 && isNaN(args[i+1]) == false && args[i+1]>0) {
        myMeasure[j] = new Array(args[i],args[i+1],0,0);
        if(myMeasure.length > 1) {
          var dist_x = Math.abs(myMeasure[myMeasure.length-2][0]-myMeasure[myMeasure.length-1][0]);
           var dist_y = Math.abs(myMeasure[myMeasure.length-2][1]-myMeasure[myMeasure.length-1][1]);
           var dist = Math.round(Math.sqrt(Math.pow(dist_x,2)+Math.pow(dist_y,2))*100)/100;
           myMeasure[myMeasure.length-1][2] = dist;
           var totalDist = myMeasure[myMeasure.length-2][3]+dist;
           myMeasure[myMeasure.length-1][3] = Math.round(totalDist*100)/100;
         }
        j++;i++;
      }
    }
    myMeasureFormat = 0;
    my_drawDashedLine();
    my_polyClose();
  } else { my_eventLayer(false); }
}

////////////////////////////
  // keyhandler
////////////////////////////

function my_setKeyhandler() {
  window.focus();
  //window.document.onkeydown = my_Keyhandler;
}

function my_Keyhandler(k) {
  if(ie) { code = event.keyCode; } else { code = k.which; }
  if(code == 107 || code == 61 || code == 187) { my_zoomMap(0.7); }
  if(code == 109 || code == 189) { my_zoomMap(1.3); }
  if(code == 38) { my_moveMap(0,myAddNav); }
  if(code == 40) { my_moveMap(0,-myAddNav); }
  if(code == 39) { my_moveMap(myAddNav,0); }
  if(code == 37) { my_moveMap(-myAddNav,0); }
  if(code == 27) {
   if(my_getID("divWaitIcon").innerHTML != "") {
    my_stopWMS(); //NS: stop WMS request
   } else { my_measureDelete(); } //esc
  }
  if(code == 32) { my_measureStop(); }  //space
}

////////////////////////////
  // marker, highlight
////////////////////////////

function my_setMarker(x,y,sc,tooltip,obj) {
  //alert(x+" "+y+" "+sc+" "+tooltip+" "+obj);
  if(x>0) {
    myMarker = new Array();
    myMarker[0] = x;
    myMarker[1] = y;
    if(sc != null) { myMarker[2] = sc; } else { myMarker[2] = myScale; }
    if(!tooltip) { tooltip = ""; }
    if(tooltip != "") { myMarker[3] = tooltip; } else { myMarker[3] = ""; }
    // if obj==number -> called by my_setMapRequest() -> no redraw
    if(obj!=1) { // new marker is set
      my_repaintXYSc(myMarker[0],myMarker[1],myMarker[2]);
      myMarker[4] = obj;
    }
    if(my_checkDIV("layerMarker")) {
      var pos = my_meter2Pixel(myMarker[0],myMarker[1]);
      my_getID("layerMarker").style.visibility = "visible";
      my_getID("layerMarker").style.left = pos[0]-(markerImg.width/2);
      my_getID("layerMarker").style.top = pos[1]-(markerImg.height/2);
      my_getID("layerMarker").style.width = markerImg.width;
      my_getID("layerMarker").style.height = markerImg.height;
      if(my_checkDIV("divMarkerInfo") && myMarker[3]!="") {
        my_getID("divMarkerInfo").innerHTML = myMarker[3];
        my_getID("divMarkerInfo").style.visibility = "visible";
      } else {
        my_getID("divMarkerInfo").innerHTML = "";
        my_getID("divMarkerInfo").style.visibility = "hidden";
      }
    }
  } else {
    my_getID("layerMarker").style.visibility = "hidden";
    my_getID("divMarkerInfo").style.visibility = "hidden";
    myMarker = new Array(-1,-1,myScale,"");
  }
}

function my_eventLayer(val) {
  if(val == true) {
    myMapFrame = my_getID("layerEventHandling");
    myMapFrame.style.visibility = "visible";
  } else {
    my_setInfo(msgList[9]);
    if(my_checkDIV("divPanIcon")) { my_mClickEl('divPanIcon'); } else { my_mClickEl(); }
    my_getID("layerEventHandling").style.visibility = "hidden";
    myMapFrame = my_getID("layerAll");
    my_panInit();
  }
}


////////////////////////////
  // usemap highlight
////////////////////////////
function over(val) {
  var tmp = typeof val;
  if (tmp == "string" && my_checkDIV(val)) { val = my_getID(val); }
  myUMObject = val;
  if(val.title) { myMarkerID = val.title; }
  if(val.coords) {
    var coords = val.coords.split(',');
    if(val.shape.toUpperCase() == "RECT") {
      coords = new Array(coords[0],coords[1],coords[0],coords[3],coords[2],coords[3],coords[2],coords[1],coords[0],coords[1]);
    }
    if(val.shape.toUpperCase() == "CIRCLE") {
      var x = coords[0]-coords[2];
      var y = coords[1]-coords[2];
      var t = Math.round(coords[2]*2/3);
      coords = new Array(x,y,x,y+t*3,x+t*3,y+t*3,x+t*3,y); // to rect
    }
    var Xcoords = my_umXCoords(coords);
    var Ycoords = my_umYCoords(coords);
    var pgx = Xcoords.split(',');
    var pgy = Ycoords.split(',');
    for (var i=0;i<pgx.length;i++) {
     pgx[i] = Math.round(pgx[i]);
     pgy[i] = Math.round(pgy[i]);
    }
    my_umFillPoly(pgx,pgy);
    my_getID("layerUsemapHighlight").innerHTML = myUMArea;
  }
  return true;
}

function out() {
  myUMArea = "";
  my_getID("layerUsemapHighlight").innerHTML = myUMArea;
  myMarkerID = "";
  return true;
}

function my_umXCoords(coords) {
  var Xcoords = '';
  for(var i=0;i<coords.length;i=i+2) {
    if(i>0) { Xcoords += ', '; }
    Xcoords += Math.round(coords[i]);
  }
  return Xcoords;
}
function my_umYCoords(coords) {
  var Ycoords = '';
  for(var i=1;i<coords.length;i=i+2) {
    if(i>1) { Ycoords += ', '; }
    Ycoords += Math.round(coords[i]);
  }
  return Ycoords;
}

function my_umFillPoly(array_x,array_y) {
  var i;
  var y;
  var miny, maxy;
  var x1, y1;
  var x2, y2;
  var ind1, ind2;
  var ints;
  var n = array_x.length;
  if (!n) return;
  miny = array_y[0];
  maxy = array_y[0];
  for(var i=1;i<n;i++) {
    if(array_y[i] < miny) miny = array_y[i];
    if (array_y[i] > maxy) maxy = array_y[i];
  }
  for(y=miny;y<=maxy;y+=myQualityFillPoly) {
    var polyInts = new Array();
    ints = 0;
    for(var i=0;i<n;i++) {
      if(!i) {
        ind1 = n-1;
        ind2 = 0;
      } else {
        ind1 = i-1;
        ind2 = i;
      }
      y1 = array_y[ind1];
      y2 = array_y[ind2];
      if(y1 < y2) {
        x1 = array_x[ind1];
        x2 = array_x[ind2];
      } else if(y1 > y2) {
        y2 = array_y[ind1];
        y1 = array_y[ind2];
        x2 = array_x[ind1];
        x1 = array_x[ind2];
      } else continue;
      if ((y >= y1) && (y < y2))
        polyInts[ints++] = Math.round((y-y1)*(x2-x1)/(y2-y1) + x1);
      else if ((y == maxy) && (y > y1) && (y <= y2))
        polyInts[ints++] = Math.round((y-y1)*(x2-x1)/(y2-y1) + x1);
      }
    polyInts.sort(my_IntegerCompare);
    for(var i=0;i<ints;i+=2) {
     my_umMakeDiv(polyInts[i],y,polyInts[i+1]-polyInts[i]+1,myQualityFillPoly);
    }
  }
}

function my_IntegerCompare(x,y) {
  return (x < y) ? -1 : ((x > y)*1);
}

function my_umMakeDiv(x,y,w,h) {
  if(x<0) { w += x; x = 0; }
  if((x+w)>myMapSize[0]){ w = myMapSize[0]-x; }
  if(w>=0 && x<myMapSize[0] && y>=0 && y<myMapSize[1]) {
    myUMArea += '<div class="divUsemapHighlight" style="'+
    'left:' + x + 'px;'+
    'top:' + y + 'px;'+
    'width:' + w + 'px;'+
    'height:' + h + 'px;'+
    'clip:rect(0,'+w+'px,'+h+'px,0);' +
    '"><\/div>';
  }
}


////////////////////////////
  // sandclock
////////////////////////////

var myWaitMaxTime = 20000 * 60;
var myWaitMinTime = 5000;

function my_sandclock(start,myMapId){
 if(my_checkDIV("divWaitIcon")) {
  if(start) {
    myWaitCount = myWaitMaxTime;
    var tmp = "<img src='"+waitImg.src+"'>";
    my_getID("divWaitIcon").innerHTML = tmp;
  }
  aktiv = setTimeout("my_sandclock('','"+myMapId+"')",100);
  myWaitCount -= 1000;
  var allMaps = document.getElementsByName("mapimage");
  var cnt = 0;
  for(var i=0;i<allMaps.length;i++) {
   if(allMaps[i].complete == true) { cnt++; }
  }
  if((myWaitCount <= 0 || cnt >= allMaps.length) && myWaitCount < (myWaitMaxTime - myWaitMinTime)){
    clearTimeout(aktiv);
    my_getID("divWaitIcon").innerHTML = "";

  }
 }
}

////////////////////////////
 // back
////////////////////////////
function my_setHistoryObj() {
  var pos = my_getXYSc();
  if(myMapHistory.length <= 25) {
    myMapHistory.push(pos);
  } else {
    myMapHistory.shift();// fifo
    myMapHistory.push(pos);
  }
}
function my_setHistoryBack() {
  if(myMapHistory.length > 1) {
    myMapHistory.pop();// del actual
    var tmp = myMapHistory[myMapHistory.length-1];
    myMapHistory.pop();
    my_repaintXYSc(tmp[0],tmp[1],tmp[2]);
  }
}

function my_MapRequestPreFunctions() {}
function my_MapRequestSubFunctions() {}

// update layers in menu (layer in scale?)
function my_changeLayerInScale() {
  for(var i=0;i<myWMS.length;i++) {
    if(my_checkDIV("myWMS"+i)) {
      my_getID("myWMS"+i).checked = myWMS[i][5];
      // layer not in scale
      if(my_checkLayer(i,"WMS") == "") {
        my_getID("myWMS"+i).disabled = "disabled";
      } else {
        my_getID("myWMS"+i).disabled = "";
      }
    }
  }
  for(var i=0;i<myUsemap.length;i++) {
    if(my_checkDIV("myUsemap"+i)) {
      my_getID("myUsemap"+i).checked = myUsemap[i][5];
      // layer not in scale
      if(my_checkLayer(i,"USEMAP") == "") {
        my_getID("myUsemap"+i).disabled = "disabled";
      } else {
        my_getID("myUsemap"+i).disabled = "";
      }
    }
  }
}

function my_getLink() {
  var layWMS = my_getLayers("WMS");
  var layUsemap = my_getLayers("USEMAP");
  var url = window.location.protocol+"//"+window.location.host+window.location.pathname
   +"?X="+myXY[0]+"&Y="+myXY[1]+"&SCALE="+myScale+"&LAYERS="+layWMS[1]
   +"&OBJECT="+myMarker[0]+","+myMarker[1]+","+myMarker[2]+","+escape(myMarker[3])
   +"&USEMAPLAYER="+layUsemap[1]
   +"&MEASURE="+myMeasure
   +"&LEFT="+myMapPos[0]
   +"&TOP="+myMapPos[1]
   +"&WIDTH="+myMapSize[0]
   +"&HEIGHT="+myMapSize[1];
  return url;
}

function my_getCurrentStyle(element,cssPropertyName) {
  if(window.getComputedStyle) {
    return window.getComputedStyle(element,"").getPropertyValue(cssPropertyName.replace(/([A-Z])/g,"-$1").toLowerCase());
  } else if(element.currentStyle) {
    return element.currentStyle[cssPropertyName];
  } else { return ""; }
}


////////////////////////////
 // iframe
////////////////////////////

var winDragElement=null;
function my_moveIFrame() {
  if(myMoveIFrame && my_checkDIV("layerMenu")) {
    winDragElement = my_getID("layerMenu");
    document.onmousedown = my_dragStart;
    document.onmousemove = my_dragRun;
    document.onmouseup = my_dragStop;
  }
}
function my_dragStart(e) {
  try {
    my_getID("divMapResizeBG").style.width = myMapPos[0]+myMapSize[0]+5;
    my_getID("divMapResizeBG").style.height = myMapPos[1]+myMapSize[1]+5;
    my_getID("divMapResizeBG").style.visibility = "visible";
    my_getMousePos(e);
    myStartXY[0] = myClickXY[0];
    myStartXY[1] = myClickXY[1];
  } catch (e) {}
  return false;
}

function my_dragRun(e) {
  try {
    parent.frames[0].focus(); // no focus lost
    my_getMousePos(e);
    winDragElement.style.left = (parseInt(winDragElement.style.left)+myClickXY[0]-myStartXY[0]);
    winDragElement.style.top = (parseInt(winDragElement.style.top)+myClickXY[1]-myStartXY[1]);
    myStartXY[0] = myClickXY[0];
    myStartXY[1] = myClickXY[1];
  } catch (e) {}
  return false;
}
function my_dragStop(e) {
  my_getID("divMapResizeBG").style.visibility = "hidden";
  document.onmousedown = null;
  document.onmousemove = null;
  document.onmouseup = null;
  my_setKeyhandler();
}

function my_minMaxMenu() {
  if(my_getID("myMenuMinMax").src == minImg.src) {
    my_getID(myIFrameActiveId).style.display = "none";
    my_getID("myMenuMinMax").src = maxImg.src;
  } else {
    my_getID(myIFrameActiveId).style.display  = "block";
    my_getID("myMenuMinMax").src = minImg.src;
  }
}

// change menu frames
function my_changeIFrame(frm,url) {
  if(myCount==0 && !ie) { // for ie: border+2
    var obj = my_getID("layerMenu");
    if(obj && obj.getElementsByTagName("table")[0]) {
      obj.getElementsByTagName("table")[0].style.width=parseInt(obj.getElementsByTagName("table")[0].style.width)+2;
    }
  }

  my_changeIFramePreFunctions(frm,url);

  myIFrameActiveId = frm;
  for(var i=0;i<5;i++) {
    if(my_checkDIV("myIFrame"+i) && my_checkDIV("myIFrame"+i+"Div")) {
      my_getID("myIFrame"+i+"Div").style.borderWidth = "0px";
      my_getID("myIFrame"+i).style.display = "none";
      my_getID("myIFrame"+i+"Div").style.backgroundImage= "";
   }
  }
  if(url) {
    window.frames[frm].location.replace(url);
  }
  if(my_checkDIV(frm) && my_checkDIV(frm+"Div")) {
    my_getID(frm+"Div").style.border = "1px solid rgb(0,0,0)";
    my_getID(frm+"Div").style.backgroundImage= myColorBG;
    my_getID(frm).style.display = "block";
    my_getID("myMenuMinMax").src = minImg.src;
  }

  if(frm != "myIFrame2") { // hide print preview
    my_getID("layerPrintPreview1").style.visibility = "hidden";
    my_getID("layerPrintPreview2").style.visibility = "hidden";
    my_getID("layerPrintPreview3").style.visibility = "hidden";
    my_getID("layerPrintPreview4").style.visibility = "hidden";
  }
  my_eventLayer(false);
}

function my_changeIFramePreFunctions(frame,url) {}

////////////////////////////
 // menu
////////////////////////////

function my_subShow(obj,el) {
  var t = typeof(obj);
  if(t == "string") { obj= my_getID(obj); }

  if(!obj.getElementsByTagName) { return; }
  var mylis = obj.getElementsByTagName("li");
  if (!mylis) { return; }
  for(var i=0;i<mylis.length;i++) {
    if(mylis[i].style.display == "block") {
      if(el) { el.style.backgroundImage = "url("+folderOpenImg.src+")"; }
      mylis[i].style.display = "none";
    } else {
      mylis[i].style.display = "block";
      if(el) { el.style.backgroundImage = "url("+folderCloseImg.src+")"; }
    }
  }
  return false;
}

function my_subHide() {
  if(my_getID("myIFrame0")) {
    var obj = my_getID("myIFrame0");
    if(obj.getElementsByTagName("li")) {
      var mylis = obj.getElementsByTagName("li");
      for(var i=0;i<mylis.length;i++) {
        var sublis = mylis[i].getElementsByTagName("li");
        for(var j=0;j<sublis.length;j++)  {
          if(sublis[j].style) {
            var tmp = mylis[i].getElementsByTagName("a");
            for(var k=0;k<tmp.length;k++) {
              if(tmp[k].className.search(/aMain/i)>-1 && mylis[i].className == "show") {
               tmp[k].style.backgroundImage="url("+folderCloseImg.src+")";
              }
              if(tmp[k].className.search(/aMain/i)>-1 && mylis[i].className == "hide") {
                tmp[k].style.backgroundImage = "url("+folderOpenImg.src+")";
              }
            }
            if(mylis[i].className == "show") {
              sublis[j].style.display = "block";
            } else {
              sublis[j].style.display = "none"
            }
          }
        }
      }
    }
  }
  for(var i=0;i<8;i++) {
   if(my_checkDIV("myIFrame"+i)) {
     my_getID("myIFrame"+i).style.visibility = "visible";
   }
  }
}


////////////////////////////
 // tools
////////////////////////////
function my_mailTo(subj) {
  this.location = "mailto:?subject="+subj+"&body="+encodeURIComponent(my_getLink());
}

////////////////////////////
 // navigation bar
////////////////////////////
function my_setNaviBar() {
 if(myNaviBar) {
    for(var i=0;i<=7;i++) {
      content="<img src='"+navImgBar[i].src+"'>";
      my_createDiv("divNavIcon"+i,-20,-20,-1,-1,true,content);
    }
    document.write("<div id='divNavN' class='naviBar' onclick='my_moveMap(0,myAddNav)' onmouseover=navOver('divNavN') onmouseout=navOut('divNavN') title='"+imgTitle[0]+"'></div>");
    document.write("<div id='divNavE' class='naviBar' onclick=my_moveMap(myAddNav,0) onmouseover=navOver('divNavE') onmouseout=navOut('divNavE') title='"+imgTitle[3]+"'></div>");
    document.write("<div id='divNavS' class='naviBar' onclick='my_moveMap(0,-myAddNav)' onmouseover=navOver('divNavS') onmouseout=navOut('divNavS') title='"+imgTitle[1]+"'></div>");
    document.write("<div id='divNavW' class='naviBar' onclick='my_moveMap(-myAddNav,0)' onmouseover=navOver('divNavW') onmouseout=navOut('divNavW') title='"+imgTitle[2]+"'></div>");
    document.write("<div style='width:0px;height:0px' onmouseover=navOver('divNavNE1,divNavNE2') onmouseout=navOut('divNavNE1,divNavNE2') onclick=my_moveMap(myAddNav,myAddNav) title='"+imgTitle[5]+"'><span id='divNavNE1' class='naviBar'></span><span id='divNavNE2' class='naviBar'></span></div>");
    document.write("<div style='width:0px;height:0px' onmouseover=navOver('divNavSE1,divNavSE2') onmouseout=navOut('divNavSE1,divNavSE2') onclick=my_moveMap(myAddNav,-myAddNav) title='"+imgTitle[6]+"'><span id='divNavSE1' class='naviBar'></span><span id='divNavSE2' class='naviBar'></span></div>");
    document.write("<div style='width:0px;height:0px' onmouseover=navOver('divNavSW1,divNavSW2') onmouseout=navOut('divNavSW1,divNavSW2') onclick=my_moveMap(-myAddNav,-myAddNav) title='"+imgTitle[8]+"'><span id='divNavSW1' class='naviBar'></span><span id='divNavSW2' class='naviBar'></span></div>");
    document.write("<div style='width:0px;height:0px' onmouseover=navOver('divNavNW1,divNavNW2') onmouseout=navOut('divNavNW1,divNavNW2') onclick=my_moveMap(-myAddNav,myAddNav) title='"+imgTitle[7]+"'><span id='divNavNW1' class='naviBar'></span><span id='divNavNW2' class='naviBar'></span></div>");
  }
}
function navOver(val) {
  var val = val.split(",");
  for(var i=0;i<val.length;i++) {
   my_getID(val[i]).style.backgroundColor = myNaviCol;
  }
}
function navOut(val) {
  var val = val.split(",");
  for(var i=0;i<val.length;i++) {
   my_getID(val[i]).style.backgroundColor = "transparent";
  }
}
function my_mapResizeNaviBar() {

  if (myNaviBar) {
    var v = parseInt(myMapSize[1]/4); // width navigation edge
    var b = myNaviBarWidth;
    if(b<1) { b = 1; }
    var i = parseInt(navImgBar[1].width);

    my_arrangeElement("divNavN",myMapPos[0]+v,myMapPos[1]+2,myMapSize[0]-(2*v),b+2);
    my_arrangeElement("divNavE",myMapSize[0]+myMapPos[0]-b-myFrameBorder,myMapPos[1]+v,b+2,myMapSize[1]-(2*v));
    my_arrangeElement("divNavS",myMapPos[0]+v,myMapPos[1]+myMapSize[1]-b-myFrameBorder,myMapSize[0]-(2*v),b+2);
    my_arrangeElement("divNavW",myMapPos[0]+2,myMapPos[1]+v,b+2,myMapSize[1]-(2*v));
    my_arrangeElement("divNavNE1",myMapPos[0]+myMapSize[0]-v,myMapPos[1]+2,v-b-myFrameBorder,b+2);
    my_arrangeElement("divNavNE2",myMapPos[0]+myMapSize[0]-b-myFrameBorder,myMapPos[1]+2,b+2,v-2);
    my_arrangeElement("divNavSE1",myMapPos[0]+myMapSize[0]-v,myMapPos[1]+myMapSize[1]-b-myFrameBorder,v-b-myFrameBorder,b+2);
    my_arrangeElement("divNavSE2",myMapPos[0]+myMapSize[0]-b-myFrameBorder,myMapPos[1]+myMapSize[1]-v,b+2,v-myFrameBorder+2);
    my_arrangeElement("divNavSW1",myMapPos[0]+b+4,myMapPos[1]+myMapSize[1]-b-myFrameBorder,v-b,b+2);
    my_arrangeElement("divNavSW2",myMapPos[0]+2,myMapPos[1]+myMapSize[1]-v,b+2,v-myFrameBorder+2);
    my_arrangeElement("divNavNW1",myMapPos[0]+b+4,myMapPos[1]+2,v-b,b+2);
    my_arrangeElement("divNavNW2",myMapPos[0]+2,myMapPos[1]+2,b+2,v-2);

    my_arrangeElement("divNavIcon0",myMapPos[0]+(myMapSize[0]/2)-(i/2),myMapPos[1]+2);
    my_arrangeElement("divNavIcon1",myMapPos[0]+myMapSize[0]-i-myFrameBorder,myMapPos[1]+(myMapSize[1]/2)-(i/2));
    my_arrangeElement("divNavIcon2",myMapPos[0]+(myMapSize[0]/2)-(i/2),myMapPos[1]+myMapSize[1]-i-myFrameBorder);
    my_arrangeElement("divNavIcon3",myMapPos[0]+2,myMapPos[1]+(myMapSize[1]/2)-(i/2));
    my_arrangeElement("divNavIcon4",(myMapSize[0])+myMapPos[0]-i-myFrameBorder,myMapPos[1]+myFrameBorder-myFrameBorder+2);
    my_arrangeElement("divNavIcon5",(myMapSize[0])+myMapPos[0]-i-myFrameBorder,myMapPos[1]+myMapSize[1]-i-myFrameBorder);
    my_arrangeElement("divNavIcon6",myMapPos[0]+2,myMapPos[1]+myMapSize[1]-i-myFrameBorder);
    my_arrangeElement("divNavIcon7",myMapPos[0]+2,myMapPos[1]+2);
  }
}


////////////////////////////
 // change WMS/usemap layer visibility
////////////////////////////
function my_changeWMSLayer(obj) {

  if(!my_checkWMSComplete()) {
    my_changeLayerInScale();
    return;
  }

  var t = typeof(obj);
  if(t == "string") { var id = obj.substring(5);
  } else { var id = obj.id.substring(5); }

  for(i=0;i<myWMS.length;i++) {
    myWMS[i][5] = my_getID("myWMS"+i).checked;
    if(myWMS[i][5] == false) {
      my_getID("layerWMS"+i).innerHTML = "<img id='map"+i+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px' src='"+transparentImg.src+"'>";
    }
  }

  if(my_getID("myWMS"+id).checked == true) {
    myWMS[id][5] = true;
    my_MapRequestPreFunctions();
    if(myWMS[id][0].indexOf('?') == -1) { myWMS[id][0] += "?"; }
    var newWMS = myWMS[id][0]
     +"&BBOX="+Math.floor(myBBox[0])+","+Math.floor(myBBox[1])+","+Math.floor(myBBox[2])+","+Math.floor(myBBox[3])
     +"&WIDTH=" + myMapSize[0]
     +"&HEIGHT=" + myMapSize[1]
     +"&SCALE=" + myScale
     +"&LAYERS=" + my_checkLayer(id,"WMS")
     + my_getVendorSpecificString();

    if(myDebug) { prompt("",newWMS); }
    if (AlphaImageLoader && ie && navigator.userAgent.indexOf("Opera")<0 && (newWMS.toUpperCase().search(/format=png/i)> -1 || newWMS.toUpperCase().search(/format=image\/png/i)> -1)) {
      my_getID("layerWMS"+id).innerHTML = "<img id='map"+id+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\""+newWMS+"\",sizingmethod=\"scale\")' src='"+transparentImg.src+"' onError=my_WMSError("+id+") onAbort=my_stopWMS("+id+")>";
    } else {
      my_getID("layerWMS"+id).innerHTML = "<img id='map"+id+"' name='mapimage' style='position:absolute;left:0px;top:0px;width:"+myMapSize[0]+"px;height:"+myMapSize[1]+"px' src='"+newWMS+"' onError=my_WMSError("+id+") onAbort=my_stopWMS("+id+")>";
    }
    my_sandclock(true,"map"+id);
  }

}

function my_changeUsemapLayer(obj) {

  var t = typeof(obj);
  if(t == "string") { var id = obj.substring(8);
  } else { var id = obj.id.substring(8); }

  for(i=0;i<myUsemap.length;i++) {
    myUsemap[i][5] = my_getID("myUsemap"+i).checked;
    if(myUsemap[i][5] == false) {
      my_getID("layerUsemap"+i).innerHTML = "";
      my_getID("layerUsemap"+i).style.width = "0px";
      my_getID("layerUsemap"+i).style.height = "0px";
    }
  }
  if(my_getID("myUsemap"+id).checked == true) {
    myUsemap[id][5] = true;
    my_MapRequestPreFunctions();
    if(myUsemap[id][0].indexOf('?') == -1) { myUsemap[id][0] += "?"; }
    var newUm = myUsemap[id][0]
     +"&BBOX="+myBBox
     +"&WIDTH=" + myMapSize[0]
     +"&HEIGHT=" + myMapSize[1]
     +"&SCALE=" + myScale
     +"&LAYERS=" + my_checkLayer(id,"USEMAP")
     +"&USEMAPLAYER=layerUsemap" + id
     + my_getVendorSpecificString();
    if(myDebug) { prompt("",newUm); }
    my_arrangeElement("layerUsemap"+id,0,0,myMapSize[0],myMapSize[1]);
    my_getID("layerUsemapFrame"+id).src = newUm;
  }
}


////////////////////////////
 // tooltip
////////////////////////////
function myViewID(val,x,y) {
  if(val != "") {
    val = val.replace(/\+/g," ");
    my_getID("divTooltip").style.left = x+myMapPos[0];
    my_getID("divTooltip").style.top = y+myMapPos[1];
    my_getID("divTooltip").innerHTML = unescape(val);
    my_getID("divTooltip").style.visibility = "visible";

  } else {
    my_getID("divTooltip").innerHTML = "";
  }
  return false;
}
function myHideID() {
  my_getID("divTooltip").innerHTML = "";
  my_getID("divTooltip").style.visibility = "hidden";
  return false;
}

function my_getID(elName) {
  var theObj = document.getElementById(elName);
  return theObj;
}



function my_correctPNG(i,newWMS) { alert("my_correctPNG is out of order. Please use an new version of myWMSClient.js."); }
function my_setNaviPanel(v1,v2) { alert("my_setNaviPanel() is not supported longer. Create your GUI in your start script."); }
