/*-----------------------------------------------------------------------
core JavaScript File

version: 	4.0
author:		sebastian kupke
email:		sebastian.kupke@baral.de
website:	http://www.baral.de
-----------------------------------------------------------------------*/


/* =Initialize Web SIS
-----------------------------------------------------------------------*/
window.onload = function() {

	currentWidth = $(window).width();
	currentHeight = $(window).height();
	
	// Initialize mouse wheel
	if (window.addEventListener) {
		window.addEventListener('DOMMouseScroll', wheel, false);
	}

	document.getElementById('maps').onmousewheel = document.onmousewheel = wheel;

	cbb.init();
	
	// Set browser height
	var height = $(window).height() - 40;
    $('#wrapper').css('height',height + 'px');
    $('#maps').css('height',height + 'px');

	// Sets the center coords
	center.x = (startExtent.minx + startExtent.maxx) / 2;
	center.y = (startExtent.miny + startExtent.maxy) / 2;

	center.x = Math.round(center.x * 1000) / 1000;
	center.y = Math.round(center.y * 1000) / 1000;
	
	$('#maps').showMenu({
		opacity:0.8,
		query: '#maps_context_menu'
	});
	
	// ie6
	if ($.browser.msie && parseInt($.browser.version) == 6) {
		$('#toolbar').css({
			background: '',
			top: '7px'
		});
	}
	
	//------------------------------
	// Extern parameters (x and y)
	//------------------------------
	if (extParams.x) {
		center.x = extParams.x;
	}
	if (extParams.y) {
		center.y = extParams.y;
	}

	// Sets the scale factor
	var widthPixel = $('#map_div').width();
	var widthMeter = startExtent.maxy - startExtent.miny;

	scaleFactor = widthMeter / widthPixel;
	
	//------------------------------
	// Extern parameters (scale)
	//------------------------------
	if (extParams.scale) {
		setScaleFactor(extParams.scale);
	}
	
	if (extParams.layer) {
		var service = getService(currentService);
		var lvl = service.getLevelInScale(getScaleNumber());
		if (lvl.hasLayer(extParams.layer)) {
			lvl.currentLayer = extParams.layer;
		}
	}
	
	// user pin
		if (!$.browser.msie) {
			$('#user_pin').mouseover(function() {
				$(this).effect('pulsate',{times: 2});
			});
		}
		
		var header = userPin.tooltipHeader ? userPin.tooltipHeader : mInterfaceUserpinMouseoverHeader;	
	    var content = userPin.tooltipContent ? userPin.tooltipContent : mInterfaceUserpinMouseoverContent.replace(/\{0\}/,Math.round(userPin.point.x)).replace(/\{1\}/,Math.round(userPin.point.y));
	    
		$('#user_pin').tooltip({
			bodyHandler: function() {
		        return '<span class="header">' + header + '</span><br /><div class="content">' + content + '</div>';
		    }, 
		    showURL: false,
		    fixPNG: true 
		});
	
	// address pin
		if (!$.browser.msie) {
			$('#address_search_pin').mouseover(function() {
				$(this).effect('pulsate',{times: 2});
			});
		}
		
		$('#address_search_pin').tooltip({
			bodyHandler: function() {
		        return '<span class="header">' + $('#address_search_autocomplete').val() + '</span><br /><div class="content">' + addressPin.tooltipContent + '</div>';
		    }, 
		    showURL: false,
		    fixPNG: true 
		});
	
	if ($.browser.msie) {
		$('#tools_navigator_image').attr('src','style/' + styleFolder + '/img/modules/navigator.gif');
	}

	// Now get the first map
	getMap();

	// Re-initialize the fisheye toolbar
	loadFisheye();
};

/* =getMap
-----------------------------------------------------------------------*/
function getMap() {

	var scaleNumber = getScaleNumber();
	
	if (scaleNumber > minScale) {
		scaleNumber = minScale;
		setScaleFactor(scaleNumber);
	} else if (scaleNumber < maxScale) {
		scaleNumber = maxScale;
		setScaleFactor(scaleNumber);
	}

	// Get width and height of map div
	var widthPixel = $('#map_div').width();
	var heightPixel = $('#map_div').height();

	var mapExtent = new Extent(center.x - (widthPixel / 2 * scaleFactor),center.y - (heightPixel / 2 * scaleFactor),center.x + (widthPixel / 2 * scaleFactor),center.y + (heightPixel / 2 * scaleFactor));
	mapExtent.round();

	// Check if the bounding box is too large
	if (center.x < boundaryExtent.minx || center.x > boundaryExtent.maxx) {
		center.x = boundaryExtent.minx;
	}
	
	if (center.y < boundaryExtent.miny || center.y > boundaryExtent.maxy) {
		center.y = boundaryExtent.miny;
	}

	// Get layers
	var mapLayers = '';
	var service = getService(currentService);
	var lvl = service.getLevelInScale(scaleNumber);
	var layer = lvl.getLayer(lvl.currentLayer);
	mapLayers = layer.layer;
	
	if (mapLayers.length == 0) {
		alert(mapNoMapInScale);
	}

	// Loading div
	showLoadingDiv(mapLoad);
	
	$.ajax({
        url: 'scripts/getMap.gsp',
        data: {
			url: service.url,
			layers: mapLayers,
			width: widthPixel,
			height: heightPixel,
			bbox: mapExtent.minx + ',' + mapExtent.miny + ',' + mapExtent.maxx + ',' + mapExtent.maxy,
			datasource: 'IMS:de:' + service.sessionId
		},
        dataType: 'json',
        type: 'post',
        success: function(data){
			mapImage = new Image();
			mapImage.src = 'temp/' + data.img;

			mapImage.onload = successMap;
			mapImage.onerror = errorMap;
			mapImage.onabort = abortMap;
        }
    });
}

function successMap() {

	var mapImg = $('#map_image');
	var mapDiv = $('#map_div');
	
	mapImg.css({
		position: 'absolute',
		width: mapDiv.width() + 'px',
		height: mapDiv.height() + 'px',
		left: '0px',
		top: '0px'
	}).attr('src',mapImage.src);
	
	mapDiv.css({
		top: '0px',
		left: '0px'
	});
	
	hideLoadingDiv();

	var scaleNumber = getScaleNumber();

	// Set scale number
	try {
		$('#coordinates_scale_number').val(scaleNumber);
	} catch(e) {
		
	}
	// TODO
	// Set zoomlevel
	try {
		var service = getService(currentService);
		var level = service.getLevelInScale(scaleNumber);
		var layer = level.getLayer(level.currentLayer);
		$('#layertree li').css('font-weight','normal');
		$('#m_layerTree_' + service.id + '_' + level.id).css('font-weight','bold').removeClass('closed').addClass('open');
		$('#m_layerTree_' + service.id + '_' + level.id + '_' + layer.id).css('font-weight','bold');
	} catch(e) {
		
	}
	
	// Set copyright
	try {
		var service = getService(currentService);
		var lvl = service.getLevelInScale(scaleNumber);
		var layer = lvl.getLayer(lvl.currentLayer);
		if (layer.copyrightText.length > 0 && layer.copyrightUrl.length > 0) {
			$('#copyright_div').html('<a href="' + layer.copyrightUrl + '" target="_blank">' + layer.copyrightText + '</a>');
		} else if (layer.copyrightText.length > 0) {
			$('#copyright_div').html(layer.copyrightText);
		}
		$('#maps_context_menu_copyright span').text(layer.copyrightText);
	} catch(e) {
		
	}

	// Because of undo/redo button
	if (registerView) {
		currentView += 1;
		maxView += 1;

		views.push(new View(center.x,center.y,scaleFactor));
	}

	registerView = true;

	// currentView 0 == StartExtent
	try {
		if (currentView > 0) {
			$('#button_undo').attr('src','style/' + styleFolder + '/img/toolbar/undo.gif');
			$('#button_home').attr('src','style/' + styleFolder + '/img/toolbar/home.gif');
		} else {
			$('#button_undo').attr('src','style/' + styleFolder + '/img/toolbar/undo_grey.gif');
			$('#button_home').attr('src','style/' + styleFolder + '/img/toolbar/home_grey.gif');
		}

		if (maxView > currentView) {
			$('#button_redo').attr('src','style/' + styleFolder + '/img/toolbar/redo.gif');
		} else {
			$('#button_redo').attr('src','style/' + styleFolder + '/img/toolbar/redo_grey.gif');
		}
	} catch(e) {

	}

	try {
		if (scaleNumber >= minScale) {
			$('#button_minus').attr('src','style/' + styleFolder + '/img/toolbar/minus_grey.gif');
			$('#button_zoomOut').attr('src','style/' + styleFolder + '/img/toolbar/zoomout_grey.gif');
		} else {
			$('#button_minus').attr('src','style/' + styleFolder + '/img/toolbar/minus.gif');
			$('#button_zoomOut').attr('src','style/' + styleFolder + '/img/toolbar/zoomout.gif');
		}

		if (scaleNumber <= maxScale) {
			$('#button_plus').attr('src','style/' + styleFolder + '/img/toolbar/plus_grey.gif');
			$('#button_zoomIn').attr('src','style/' + styleFolder + '/img/toolbar/zoomin_grey.gif');
		} else {
			$('#button_plus').attr('src','style/' + styleFolder + '/img/toolbar/plus.gif');
			$('#button_zoomIn').attr('src','style/' + styleFolder + '/img/toolbar/zoomin.gif');
		}
	} catch(e) {

	}

	// Show user pin in map
	try {
		setUserPin();
	} catch (e) {

	}
	
	// Show meetingPoint pin in map
	try {
		setMeetingPointPin();
	} catch (e) {

	}
	
	// Show address search pin in map
	try {
		setAddressSearchPin();
	} catch (e) {

	}
	
	// Show select rect in map
	try {
		showSelectRect();
	} catch (e) {
		
	}
    
    // Show select polygon in map
    try {
        showSelectPolygon();
    } catch (e) {
        
    }
    
    // Show select circle in map
    try {
        showSelectCircle();
    } catch (e) {
        
    }
	
	// Show the websis objects in the map again
	try {
		if (currentView >= 0) {
			showObjectsInMap();
		}
	} catch (e) {

	}

	if (bordermaps.use && bordermaps.pixel > 0 && (bordermaps.minScale >= scaleNumber || bordermaps.minScale == 0) && (bordermaps.maxScale <= scaleNumber || bordermaps.maxScale == 0)) {
		getBorderMaps();
	} else if (bordermaps.use && bordermaps.pixel > 0) {
		$('#map_image_l').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_lt').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_lb').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_t').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_b').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_r').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_rt').attr('src','style/' + styleFolder + '/img/empty_map.gif');
		$('#map_image_rb').attr('src','style/' + styleFolder + '/img/empty_map.gif');
	}
	
	if (firstLoading) {
		firstLoading = false;
		
		if (modulesUse) {
			$.ajax({
		        url: 'scripts/getModules.gsp',
		        dataType: 'html',
		        success: function(data){
		        	$('#tools_div').html(data);
		        }
		    });
		}
	} else {
		
		// Set overview rect
		try {
			setOverviewRect();
		} catch(e) {

		}
		
		$('#maps').mousemove(function (e) {
			try {
				showCoordinates(e);
			} catch (error) {
				
			}
		});
	}
}

function errorMap() {

	hideLoadingDiv();

	alert(mapLoadError);
}

function abortMap() {

	hideLoadingDiv();

	alert(mapLoadAbort);
}

/* =Get the border maps (8 maps)
-----------------------------------------------------------------------*/
function getBorderMaps() {

	var scaleNumber = getScaleNumber();

	// Get width and height of map div
	var widthPixel = $('#map_div').width();
	var heightPixel = $('#map_div').height();

	var mapExtent = new Extent(center.x - (widthPixel / 2 * scaleFactor),center.y - (heightPixel / 2 * scaleFactor),center.x + (widthPixel / 2 * scaleFactor),center.y + (heightPixel / 2 * scaleFactor));
	mapExtent.round();

	var superMinX = mapExtent.minx - (bordermaps.pixel * scaleFactor);
	var superMaxX = mapExtent.maxx + (bordermaps.pixel * scaleFactor);
	var superMinY = mapExtent.miny - (bordermaps.pixel * scaleFactor);
	var superMaxY = mapExtent.maxy + (bordermaps.pixel * scaleFactor);

	// Get layers
	var mapLayers = '';
	var service = getService(currentService);
	var lvl = service.getLevelInScale(scaleNumber);
	mapLayers = lvl.getLayer(lvl.currentLayer).layer;
	
	getOneBorderMap('l');
	getOneBorderMap('r');
	getOneBorderMap('t');
	getOneBorderMap('b');
	getOneBorderMap('lt');
	getOneBorderMap('lb');
	getOneBorderMap('rt');
	getOneBorderMap('rb');
	
	function getOneBorderMap(borderMap) {
		
		var bbox = '';
		var width = bordermaps.pixel;
		var height = bordermaps.pixel;
		
		if (borderMap == 'l') {
			bbox = superMinX + ',' + mapExtent.miny + ',' + mapExtent.minx + ',' + mapExtent.maxy;
			height = heightPixel;
		} else if (borderMap == 'r') {
			bbox = mapExtent.maxx + ',' + mapExtent.miny + ',' + superMaxX + ',' + mapExtent.maxy;
			height = heightPixel;
		} else if (borderMap == 't') {
			bbox = mapExtent.minx + ',' + mapExtent.maxy + ',' + mapExtent.maxx + ',' + superMaxY;
			width = widthPixel;
		} else if (borderMap == 'b') {
			bbox = mapExtent.minx + ',' + superMinY + ',' + mapExtent.maxx + ',' + mapExtent.miny;
			width = widthPixel;
		} else if (borderMap == 'lt') {
			bbox = superMinX + ',' + mapExtent.maxy + ',' + mapExtent.minx + ',' + superMaxY;
		} else if (borderMap == 'lb') {
			bbox = superMinX + ',' + superMinY + ',' + mapExtent.minx + ',' + mapExtent.miny;
		} else if (borderMap == 'rt') {
			bbox = mapExtent.maxx + ',' + mapExtent.maxy + ',' + superMaxX + ',' + superMaxY;
		} else if (borderMap == 'rb') {
			bbox = mapExtent.maxx + ',' + superMinY + ',' + superMaxX + ',' + mapExtent.miny;
		}
        
        $.ajax({
            url: 'scripts/getMap.gsp',
            data: {
				url: service.url,
				layers: mapLayers,
				width: width,
				height: height,
				bbox: bbox,
				datasource: 'IMS:de:' + service.sessionId
			},
            dataType: 'json',
            type: 'post',
            success: function(data){
				$('#map_image_' + borderMap).attr('src','temp/' + data.img);
            }
        });
	}
}






