var layerWmsLayer = new Array();
var layerLongName  = new Array();
var currentZoomLevel;
var zoomLevelsExtend = new Array();
var zoomLevelsDescription = new Array ();
var zoomLevelFeatureInfo;
var zoomLevelMapRequestPreprocess;
var zoomLevelCopyrightURL;
var zoomLevelCopyrightWebUrl;
var activeLayer;
var flag = 0;
/*
 * set layers for each zoom level
 */
function setLayers(layer){
    layerLongName = new Array();
    layerWmsLayer= new Array();

    // get layer of zoom level and dispose to the arrays
    var aLayer = top.aZoomLevel[currentZoomLevel]["Layer"];
    for (i=0; i<aLayer.length; i++ ){
        layerLongName[i] = aLayer[i].split(';')[0];
        layerWmsLayer[i] = aLayer[i].split(';')[1];
    }
    // get the feature info
    zoomLevelFeatureInfo = top.aZoomLevel[currentZoomLevel]["FeatureInfo"];
    // get the javascriptfunction before a map-request
    zoomLevelMapRequestPreprocess = top.aZoomLevel[currentZoomLevel]["MapRequestPreprocess"];
    // get url for copyright image
    zoomLevelCopyrightURL = top.aZoomLevel[currentZoomLevel]["CopyrightURL"];
    // get web url for copyright image
    zoomLevelCopyrightWebUrl = top.aZoomLevel[currentZoomLevel]["CopyrightWebUrl"];

	// COPYRIGHT URL
    if (zoomLevelCopyrightURL.length == 0){
    	MapFrame.document.getElementById('copyrightImage').style.visibility = 'hidden';
    }
   	else{
   		MapFrame.document.getElementById('copyrightImage').style.visibility = 'visible';
   		MapFrame.document.getElementById('copyrightImage').style.visibility = 'visible';
   		MapFrame.document.getElementById('copyrightImage').src = './img/copyright/' + zoomLevelCopyrightURL;
	}

	// COPYRIGHT WEB URL
	if (zoomLevelCopyrightWebUrl.length == 0){
    	MapFrame.document.getElementById('copyrightWebUrl').style.visibility = 'hidden';
    }
   	else{
   		MapFrame.document.getElementById('copyrightWebUrl').style.visibility = 'visible';
   		MapFrame.document.getElementById('copyrightWebUrl').href = zoomLevelCopyrightWebUrl;
	}

	if (layer == undefined) {
		activeLayer = 0;
	}
	else {
		activeLayer = layer;
	}

    //if a layer box exists display layers:
    if (typeof(LLFrame) != 'undefined'){
	    displayLayers(activeLayer);
	}
}
/*
 * get selectd layers for the request
 */
function getSelectedLayers () {
    var theLayers = '';

    if (typeof(LLFrame) != 'undefined'){
        //get the selected layer from the layer list
        var LayerList = LLFrame.document.LLForm.LayerList;
        for (i=0; i<LayerList.length; i++) {
            if (LayerList.options[i].selected == true) {
                if (theLayers.length > 0) { theLayers += ','+LayerList.options[i].value; }
                else { theLayers = LayerList.options[i].value;}
            }
        }
    }
    else {
        theLayers = layerWmsLayer.join(',');
    }
    return theLayers;
}
/*
 * delete all layers of layerlist
 */
function deleteAllLayers(LayerList) {
    var layerCount = LayerList.length;
    for (var i=0; i<=layerCount; i++) {
		LayerList.options[0] = null;
    }
}

function displayLayers(activeLayer){

    var LayerList = LLFrame.document.LLForm.LayerList;

    // delete all layers
    deleteAllLayers(LayerList);

    var layerCount = layerLongName.length;
    for (var i=0; i< layerCount; i++) {
        // because of a IE 5.0 bug call add layer in the frame
		LLFrame.addLayer(LayerList,layerWmsLayer[i],layerLongName[i]);
    }

    // check active Layer
    //LayerList.options[activeLayer].selected = true;
    LayerList.selectedIndex = activeLayer;

}

function displayZoomLevel(){

    var barWidth, barHeight;
    var curPointer;
    var theDoc = ZoomLevelFrame.document;

    var zoomLevelCount = top.aZoomLevel.length;

    for (i=0; i<zoomLevelCount; i++ ){

        // for max. value is 0.0 -> take dx of initial bbox
        if (top.aZoomLevel[i]["ZoomBorder"] == 0) {
            zoomLevelsExtend[i] = (top.startMaxx-top.startMinx);
        }
        else {
            zoomLevelsExtend[i] = top.aZoomLevel[i]["ZoomBorder"];
        }

        // long name of the zoom level
        zoomLevelsDescription[i] = top.aZoomLevel[i]["Description"];
    }

    // write the frame
    theDoc.writeln ('<html><head><title>ZoomLevelFrame</title></head>');
    theDoc.writeln ('<script language="javascript">var zoomLevelImage = new Array ();</script>');
    theDoc.writeln ('<body style="margin:0;padding:0px;">');
    theDoc.writeln ('<table height="100%" cellpadding="0" border="0" cellspacing="0" width="100%">');
    theDoc.writeln ('<tr><td valign="top" align="center">');
    theDoc.writeln ('<TABLE border="0" cellpadding="0" cellspacing="0" height="45" background="img/skin/back.gif">');
    theDoc.writeln ('<TR><TD><IMG src="img/skin/tl.gif" width="6" height="3"></TD><TD align="center" background="img/skin/mitte.gif"><IMG src="img/skin/dummypixel.gif" height="3" width="1" border="0"></TD><TD><IMG src="img/skin/tr.gif" width="6" height="3"></TD></TR>');
    theDoc.writeln ('<TR><TD width="6" background="img/skin/links.gif">&nbsp;</TD><TD align="center" height="40" valign="middle">');

    // write ZoomLevel-Bars
	barHeight = 14;
	barWidth = 100;
	posLeft = 10;
	posTop = 52 - (barHeight * zoomLevelCount);
	tableHeight = parseInt(barHeight * zoomLevelCount);

    // write cursor dependent on browser
    if (isIE5){ curPointer = 'hand'; }
    else { curPointer = 'pointer'; }

    // write the bars
	theDoc.writeln ('<table border="0" width="160" cellpadding="0" cellspacing="0" height="65"><tr><td valign="middle">');
	for (i=0; i < zoomLevelCount; i++ ) {
	    theDoc.writeln ('<DIV id="ZL'+i+'" style="width:'+ barWidth + 'px;height:'+ barHeight + 'px;background-color:#FFFFFF;font-family:Arial;font-size:10px;vertical-align:top;cursor:'+curPointer+';margin:0;border-color:#000000;text-align:left;border-width:1px;border-style:solid;padding:0;position:absolute;left:'+posLeft+';top:'+posTop+';"  onmouseover="parent.setStatus(\''+  zoomLevelsDescription[i] +'\')" onmouseout="parent.setStatus(\'\')"  onclick="parent.showZoomLevel('+ i +');" >&nbsp;'+  zoomLevelsDescription[i]+'</div>');
	    theDoc.writeln ('<script language="javascript">zoomLevelImage['+i+'] = parent.ZoomLevelFrame.ZL'+i+';</script>');
	    barWidth = parseInt(barWidth + (60 / (zoomLevelCount-1)));
	    posTop = posTop + barHeight;
	}
	theDoc.writeln ('</td></tr></table>');

	// end the page
	theDoc.writeln ('</TD><TD width="6" background="img/skin/rechts.gif">&nbsp;</TD></TR>');
	theDoc.writeln ('</table></td></tr></table></body></html>');

}


function showZoomLevel (selectedZoomLevel) {

	// set current zoom level
	if (selectedZoomLevel != currentZoomLevel){
	    currentZoomLevel = selectedZoomLevel;
	    markZoomLevel(currentZoomLevel);
        setLayers(activeLayer);
    }

	// hide the pin
	hidePin();

	//calculate center of extents
	var yCenter = (parseFloat(maxy) + parseFloat(miny))/2;  // (map units)
	var xCenter = (parseFloat(maxx) + parseFloat(minx))/2;  // (map units)

    // get corresponding width
    var xDistance = zoomLevelsExtend[selectedZoomLevel];

	//calc aspect ratios of extents
	var upp = xDistance/mWidth;  // units-per-pixel
    var yDistance = mHeight * upp;

	// finally new extents
	minx = xCenter - (xDistance/2);  // (map units)
	maxx = xCenter + (xDistance/2);  // (map units)
	miny = yCenter - (yDistance/2);  // (map units)
	maxy = yCenter + (yDistance/2);  // (map units)

	//send request to server using the new extents
	getMap();
}


function markZoomLevel(selectedZoomLevel) {
    var theDiv;

    // reset all images
    for (var i=0; i< ZoomLevelFrame.zoomLevelImage.length; i++) {
        divName = 'ZL'+i;
        var theDiv = ZoomLevelFrame.document.getElementById(divName);
        theDiv.style.backgroundColor = '#D5D5D5';
        theDiv.style.color = '#000000';
    }

    // mark the selected zoom level
    divName = 'ZL'+ selectedZoomLevel;
    theDiv = ZoomLevelFrame.document.getElementById(divName);
    theDiv.style.backgroundColor = top.HighlightColorZoomLevel;
    theDiv.style.color = '#FFFFFF';
}


function checkZoomLevel () {

    var newZoomLevel = currentZoomLevel;

    var bboxWidth = Math.abs(maxx-minx);
    var bboxHeight = Math.abs(maxy-miny);

    bboxWidth = Math.round(bboxWidth);

    // check the zoomlevel
    for (var i=0; i< zoomLevelsExtend.length; i++){
		//alert(bboxWidth + "|||" + zoomLevelsExtend[i]);
        // is bbox bigger than the biggest zoomBorder ?
        if ( (i==0) && (bboxWidth > zoomLevelsExtend[i]) ){
            newZoomLevel = i;
        }
        // now check normal zoomBorders
        if ( bboxWidth <= zoomLevelsExtend[i]){
            newZoomLevel = i;
        }
    }

    // set the zoom level and layer only if zoomlevel changed
    if (currentZoomLevel != newZoomLevel){
        currentZoomLevel = newZoomLevel;
        markZoomLevel(currentZoomLevel);
        setLayers(activeLayer);
    }
}

function checkBBoxSize () {

    var bboxWidth = Math.abs(maxx-minx);
    var bboxHeight = Math.abs(maxy-miny);

    // bbox to small
    if ( bboxWidth < top.minBoundingBox || bboxHeight < top.minBoundingBox ){
        if (bboxWidth < top.minBoundingBox) {
            xCenter = parseFloat((parseFloat(minx)+parseFloat(maxx))/2);
            maxx = xCenter + (top.minBoundingBox)/2;
            minx = xCenter - (top.minBoundingBox)/2;
        }
        if (bboxHeight < top.minBoundingBox) {
            yCenter = parseFloat((parseFloat(miny)+parseFloat(maxy))/2);
            maxy = yCenter + (top.minBoundingBox)/2;
            miny = yCenter - (top.minBoundingBox)/2;
        }
    }

    // bbox to big
    if ( bboxWidth > top.maxBoundingBox || bboxHeight > top.maxBoundingBox ){
        if (bboxWidth > top.maxBoundingBox) {
            xCenter = parseFloat((parseFloat(minx)+parseFloat(maxx))/2);
            maxx = xCenter + (top.maxBoundingBox)/2;
            minx = xCenter - (top.maxBoundingBox)/2;
        }
        if (bboxHeight > top.maxBoundingBox) {
            yCenter = parseFloat((parseFloat(miny)+parseFloat(maxy))/2);
            maxy = yCenter + (top.maxBoundingBox)/2;
            miny = yCenter - (top.maxBoundingBox)/2;
        }
    }
}

function checkAspectRatio () {

    // the new Center
    var xCenter = (parseFloat(maxx) + parseFloat(minx)) /2;
    var yCenter = (parseFloat(maxy) + parseFloat(miny)) /2;

	var xDistance = parseFloat(maxx) - parseFloat(minx);
	var yDistance = parseFloat(maxy) - parseFloat(miny);

	var uppX = xDistance / mWidth;
	var uppY = yDistance / mHeight;

	// recalculate the distance dependent on the upps
	if (uppY > uppX) {
	    // hold on yDistance
	    xDistance = mWidth * uppY;

	}
	else {
	    // hold on xDistance
	    yDistance = mHeight * uppX;
	}

	// finally new extents
	minx = xCenter - (xDistance/2);
	maxx = xCenter + (xDistance/2);
	miny = yCenter - (yDistance/2);
	maxy = yCenter + (yDistance/2);
}