var myKaMap = myKaNavigator = myKaRubberZoom = aLastExtents = null;

// KL: KaMap related functions and data, depends on data in modnotam (resizing)

var WIDTH_SERVICE_PANE = 400;

function initKaMap() 
{
	initDHTMLAPI();	
	window.onresize=drawPage;

	myKaMap = new kaMap( 'viewport' );
	// baseURL anpassen !
//	 myKaMap.server = 'http://vfr-bulletin.de/kamap/';
	 myKaMap.server = '/kamap/';


	// the viewport offsets are set within the css and(or drawPage function
	myKaMap.xOffsetViewport = WIDTH_SERVICE_PANE;
	myKaMap.yOffsetViewport = 115;
		
	// is the servie pane visible
	myKaMap.isServicePaneVisible = true;

    myKaMap.registerForEvent( KAMAP_INITIALIZED, null, myInitialized );
    myKaMap.registerForEvent( KAMAP_MAP_INITIALIZED, null, myMapInitialized );
    myKaMap.registerForEvent( KAMAP_SCALE_CHANGED, null, myScaleChanged );
    myKaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, null, myExtentChanged );
    myKaMap.registerForEvent( KAMAP_LAYERS_CHANGED, null, myLayersChanged );
    myKaMap.registerForEvent( KAMAP_LAYER_STATUS_CHANGED, null, myLayersChanged );
    myKaMap.registerForEvent( KAMAP_MAP_CLICKED, null, myMapClicked );
	myKaMap.registerForEvent( KAMAP_MAP_SHIFT_CLICKED, null, myMapShiftClicked );
//	myKaMap.registerForEvent( KAMAP_MAP_CTRL_CLICKED, null, myMapCtrlClicked );
    myKaMap.registerForEvent( KAMAP_MOUSE_TRACKER, null, myMouseMoved );

    myKaNavigator = new kaNavigator( myKaMap );
    myKaNavigator.activate();

    myKaRubberZoom = new kaRubberZoom( myKaMap );
    var myKaKeymap = new kaKeymap( myKaMap, 'keymap' );

    myKaTracker = new kaMouseTracker(myKaMap);
    myKaTracker.activate();
	
    drawPage();
	
    myKaMap.initialize('vfr');
}


/**
 * drawPage - calculate sizes of the various divs to make the app full screen.
 */
function drawPage() {

    var browserWidth = getInsideWindowWidth();
    var browserHeight = getInsideWindowHeight();

    var viewport = getRawObject('viewport');
    var page = getRawObject('page');
    var layoutFrame = getRawObject('layoutFrame');
    var explorer = getRawObject('explorer');
    var service = getRawObject('service');
	var myTabContainer = getRawObject('myTabContainer');
	var myTabContainerWidget = dojo.widget.byId('myTabContainer');
	
	var keymap = getRawObject('keymap');
	
	var tabHelp = getRawObject('tabHelp');

	var tabNotam = getRawObject('tabNotam');
	var queryData = getRawObject('queryData');
	var notamsPlain = getRawObject('notamsPlain');
	
	var content = getRawObject('content');
	var contentBackground = getRawObject('contentBackground');
	var contentText = getRawObject('contentText');

	//Set Viewport Width
    if(myKaMap.isIE4) {
        //terrible hack to avoid IE to show scrollbar
        page.style.width = (browserWidth -2) + "px";
    } else {
        page.style.width = browserWidth + "px";
    }
   
     if(myKaMap.isIE4) {
        //terrible hack to avoid IE to show scrollbar
        page.style.height = (browserHeight -2) + "px";
    } else {
        page.style.height = browserHeight + "px";
    }

	//layoutFrame
	layoutFrame.style.width = parseInt(page.style.width) + "px";
	layoutFrame.style.height = parseInt(page.style.height) -parseInt(getObjectHeight(explorer)) + "px";
	layoutFrame.style.top= parseInt(getObjectHeight(explorer)) + "px";
	layoutFrame.style.left="0";
	layoutFrame.style.right="0";
	
	//VIEWPORT
	if ( myKaMap.isServicePaneVisible ) {
		viewport.style.width = parseInt(getObjectWidth(layoutFrame)) - parseInt(getObjectWidth(service))-2 + "px";
		viewport.style.height = parseInt(getObjectHeight(layoutFrame)) -1  + "px";
		viewport.style.top="0px";
		viewport.style.left= parseInt(getObjectWidth(service)) + "px";
		viewport.style.right="0px";
	} else {
		viewport.style.width = parseInt(getObjectWidth(layoutFrame)) - 2 + "px";
		viewport.style.height = parseInt(getObjectHeight(layoutFrame)) -1  + "px";
		viewport.style.top="0px";
		viewport.style.left= "0px";
		viewport.style.right="0px";
	}

	//HELP CONTENT
	//content.style.top = viewport.style.top;
	content.style.left = parseInt(viewport.style.left) +10  + "px";
	content.style.width = parseInt(viewport.style.width) -20  + "px";
	content.style.height = parseInt(viewport.style.height) -20  + "px";
	contentBackground.style.height = parseInt(viewport.style.height) -20  + "px";
	contentText.style.height = parseInt(viewport.style.height) -65  + "px";
	contentText.style.width = parseInt(viewport.style.width) -50  + "px";
	
	//SERVICE - left space
	service.style.height = parseInt(getObjectHeight(layoutFrame)) -2  + "px";
	myTabContainer.style.height = parseInt(getObjectHeight(layoutFrame)) - 8  + "px";
	myTabContainerWidget.onResized();
	
	notamsPlain.style.height = parseInt(getObjectHeight(layoutFrame))-
							   parseInt(getObjectHeight(queryData)) - 32 + "px";
	tabHelp.style.height = parseInt(getObjectHeight(layoutFrame))-12+ "px";
							   
	// KEYMAP
//	keymap.style.right = "0px";
//	keymap.style.bottom = parseInt(viewport.style.height-keymap.style.height) + "px";
	
    myKaMap.resize();
}

/**
 * event handler for KAMAP_INITIALIZED.
 *
 * at this point, ka-Map! knows what map files are available and we have
 * access to them.
 */
function myInitialized() 
{

}

/**
 * event handler for KAMAP_MAP_INITIALIZED
 *
 * the scales are put into a select ... this will be used for zooming
 */
function myMapInitialized( eventID, mapName ) {

    //get list of maps and populate the maps select box
    var aMaps = myKaMap.getMaps();

    // Update map selection list if one is available
    var oSelect = document.getElementById("mapSelect");
    if (oSelect)
    {
        var j = 0;
// KL, removed dummy entry
//        var opt = new Option( 'Kartensatz', '', true, true );
//        oSelect[j++] = opt;
        for(var i in aMaps) {
          oSelect[j++] = new Option(aMaps[i].title,aMaps[i].name,false,false);
        }

        //make sure the map is selected ...
        if (oSelect.options[oSelect.selectedIndex].value != mapName) {
            for(var i = 0; i < oSelect.options.length; i++ ) {
                if (oSelect.options[i].value == mapName) {
                    oSelect.options[i].selected = true;
                    break;
                }
           }
        }
    } 

    //update the scales select
    var currentMap = myKaMap.getCurrentMap();
    var scales = currentMap.getScales();
    var currentScale=myKaMap.getCurrentScale();

    //Insert tools into zoomer div
    var iWidth = 6;//width of the zoom to scale item
    var iMaxHeight = 10;//width of the zoom to scale item
    var iMinHeight = 20;//width of the zoom to scale item
    var zoomer="<span style='width:"+(scales.length*iWidth)+"'>";
    for(var i=0; i<scales.length; i++) {
        var zoomTo = 'mySetScale(' +scales[i]+')';
        //var iHeight =  parseInt(i)*2.5+10;
        var iHeight =  iMaxHeight - parseInt((iMaxHeight - iMinHeight) *i/scales.length);
        var zoomImg = '';
        if (scales[i]==currentScale) {
            zoomImg = '<img src="kamap/images/pixel-red.png" width="' + iWidth + '" height="' + iHeight + 'px" border="0" onclick="'+zoomTo+'"  title="Zoom to 1:'+scales[i]+'" alt="Zoom to 1:'+scales[i]+'"  id="img'+scales[i]+'"/>';
        } else {
            zoomImg = '<img src="kamap/images/pixel-blue.png" width="' + iWidth + '" height="' + iHeight + 'px" border="0" onclick="'+zoomTo+'"  title="Zoom to 1:'+scales[i]+'" alt="Zoom to 1:'+scales[i]+'" id="img'+scales[i]+'"/>';
        }
        zoomer = zoomer  + zoomImg ;
    }
    zoomer=zoomer+"</span>";
    getRawObject('zoomer').innerHTML = zoomer;

    //Activate panning
    switchMode('toolPan');
		
		// set extents to old extents
		if (aLastExtents)
     {
         myKaMap.zoomToExtents( aLastExtents[0], aLastExtents[1],
                                aLastExtents[2], aLastExtents[3] );
     }
}

/**
 * handle the extents changing by updating a link in the interface that links
 * to the current view
 */
function myExtentChanged( eventID, extents ) {
//	updateLinkToView();

}

function myMouseMoved( eventID, position) 
{
	var geopos = document.getElementById('geoPosition');
    var latlon = myProjection.Inverse(new Array(position.x, position.y)); 

//	geopos.innerHTML = 'x: ' + position.x + ' y: ' + position.y + ' lat: ' + latlon[0] + ' lng: ' + latlon[1];
	
}

function myMapClicked( eventID, coords ) {
    // alert( 'myMapClicked('+coords+')');
	//myKaMap.zoomTo(coords[0],coords[1]);
}
function myMapShiftClicked( eventID, coords ) {
    // alert( 'myMapClicked('+coords+')');
	//myKaMap.zoomTo(coords[0],coords[1]);
	// alert('shift ' + mercator2latlon( coords[0], coords[1]));
	latlon = mercator2latlon( coords[0], coords[1]);
	RequestPointInfo(latlon[1],latlon[0],myKaMap.getCurrentScale());
}

/*
function myMapCtrlClicked (eventID, coords)
{
	switchMode('toolZoomRubber');
}
*/
function myLayersChanged(eventID, map) {
//	updateLinkToView();
}

/**
 * called when kaMap tells us the scale has changed
 */
function myScaleChanged( eventID, scale ) {
    //todo: update scale select and enable/disable zoomin/zoomout
    var currentMap = myKaMap.getCurrentMap();
    var scales = currentMap.getScales();

    for(var i in scales){
        var imgString = 'img'+scales[i];
        var scaleString = 'img'+scale;
        if(getRawObject(imgString)) {
            if(imgString == scaleString) {
                getRawObject(scaleString).src = 'kamap/images/pixel-red.png';
            } else {
                getRawObject(imgString).src = 'kamap/images/pixel-blue.png';
            }
        }
    }

	// KL: set text on mapItems
	if ( false && myAllNotams ) {
		var scale = myKaMap.getCurrentScale();
		var i;
		for ( i=0; i<myAllNotams.notams.length; i++ ) {
			var notam = myAllNotams.notams[i];
			var mapItem = myKaMap.getRawObject(notam.lfdnr + "_notamSymbol");
			if ( mapItem ) {
				if ( scale <= 1000000 ) {
					mapItem.innerHTML = '<div>' + notam.lfdnr + '</div>';
					mapItem.setAttribute('class', 'notamSymbol');
				} else {
					mapItem.innerHTML = '';
					mapItem.setAttribute('class', 'notamSymbolOverview');
				}
			}
		}
	}
	
}

/**
 * switchMode
 * ...
 */
function switchMode(id) {
//    if (id=='toolQuery') {
//        myKaQuery.activate();
//        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_2.png)';
//        getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_1.png)';
//        getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_1.png)';
//    } else if (id=='toolPan') {
	if (id=='toolPan') {
        myKaNavigator.activate();
//        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        getRawObject('toolPan').style.backgroundImage = 'url(kamap/images/icon_set_nomad/tool_pan_2.png)';
        getRawObject('toolZoomRubber').style.backgroundImage = 'url(kamap/images/icon_set_nomad/tool_rubberzoom_1.png)';
    } else if (id=='toolZoomRubber') {
        myKaRubberZoom.activate();
//        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        getRawObject('toolPan').style.backgroundImage = 'url(kamap/images/icon_set_nomad/tool_pan_1.png)';
        getRawObject('toolZoomRubber').style.backgroundImage = 'url(kamap/images/icon_set_nomad/tool_rubberzoom_2.png)';
    } else {
        myKaNavigator.activate();
    }
}

function myZoomIn() {
    myKaMap.zoomIn();
}

function myZoomOut() {
    myKaMap.zoomOut();
}

/**
 * called when the user changes scales.  This will cause the map to zoom to
 * the new scale and trigger a bunch of events, including:
 * KAMAP_SCALE_CHANGED
 * KAMAP_EXTENTS_CHANGED
 */
function mySetScale( scale ) {
    myKaMap.zoomToScale( scale );
}

/**
 * getFullExtent
 * ...
 */
function getFullExtent() {
    var exStr = myKaMap.getCurrentMap().defaultExtents.toString();
    var ex = myKaMap.getCurrentMap().defaultExtents;
    myKaMap.zoomToExtents(ex[0],ex[1],ex[2],ex[3]);
}

/**
 * called when the map selection changes due to the user selecting a new map.
 * By calling myKaMap.selectMap, this triggers the KAMAP_MAP_INITIALIZED event
 * after the new map is initialized which, in turn, causes myMapInitialized
 * to be called
 */
function mySetMap( name ) {
	// merken:
		aLastExtents = myKaMap.getGeoExtents();
    myKaMap.selectMap( name );
}

function toggleViewport(obj) 
{
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

	var d = getObject('service');
    if (obj.isOpen) {
        obj.title = 'Notamliste einblenden';
        obj.style.backgroundImage = 'url(kamap/images/arrow_right.png)';
        d.display="none";
        obj.isOpen = false;
		myKaMap.isServicePaneVisible = false;
		myKaMap.xOffsetViewport = 0;
    } else {
        obj.title = 'Notamliste ausblenden';
        obj.style.backgroundImage = 'url(kamap/images/arrow_left.png)';
        d.display = "block";
        obj.isOpen = true;
		myKaMap.isServicePaneVisible = true;
		myKaMap.xOffsetViewport = WIDTH_SERVICE_PANE;
    }
	drawPage();
}


function toggleKeymap(obj) 
{
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

    if (obj.isOpen) {
        obj.title = 'Übersichtskarte einblenden';
        obj.style.backgroundImage = 'url(kamap/images/arrow_left.png)';
        var bValue = getObjectTop(obj);;
        var d = getObject('keymap');
        d.display = "none";
        obj.isOpen = false;
    } else {
        obj.title = 'Übersichtskarte ausblenden';
        obj.style.backgroundImage = 'url(kamap/images/arrow_right.png)';
        var d = getObject('keymap');
        d.display="block";
        obj.isOpen = true;
    }
}

function showContent(url) {
	var content = getRawObject('content');
	var viewport = getRawObject('viewport');
	content.style.top = parseInt(viewport.style.top) + 10 + "px";
	content.style.left = parseInt(viewport.style.left) + 10 + "px";
	content.style.display = "block";
	call(url,this, setContent);
}

function setContent(szContent){
	var contentText = getRawObject('contentText');
	contentText.innerHTML = szContent;
}

function hideContent() {
	var content = getRawObject('content');
	var viewport = getRawObject('viewport');
	content.style.display = "none";
	//content.style.top = parseInt(viewport.style.top) + parseInt(viewport.style.height) + "px";
}

function loadHTMLPage ( url, div)
{
	call(url,this, setContentLeftPane);
    drawPage();
}

function setContentLeftPane(szContent){
	var contentText = getRawObject('tabHelp');
	contentText.innerHTML = szContent;
}
