/* 
**************************************************************
*	            MAPGUIDE MINIMAPLINK SCRIPT                  *
*           Copyright (C) 2002 Geomap GIS America            *
*	                                                         *
*	- DESCRIPTION: Links a location map to another map.      *
*	                                                         *
*   - FEATURES: Allows user to trace rectangle on minimap to *
*				zoom at a specific area.  Single click in    *
*				minimap moves area window to point.          *
*					                                         *
*   - HTML IMPLEMENTATION: See comments at end of file       *
*                                                            *
*	                                                         *
*	 Made by Marc-André Paquin                               *
*	 Script date: 14/06/2002								 *
*                                                            *
**************************************************************
*/

// MINIMAPLINK OBJECT //
function jsMiniMap(oMainMap, oMiniMap, oMiniContainer)
{
	
	var digitInterval;
	var bIndex = -1 ;
	var mainMapBuffer = new Array();
	var mapUnit;
	mapUnit = "M";
	KeepDigitizing();
	this.OnViewChanged = OnViewChanged;
	this.OnDigitizedRectangle = onDigitizedRectangle;
	oMiniContainer.onmouseover = KeepDigitizing;
	document.body.onmouseover = StopDigitizing;
	var newLayer = oMiniMap.createLayer("redline","zoom");
	newLayer.setPriority(100);
	oMiniMap.zoomOut();
	oMiniMap.blur();
	return this;
	
	function OnViewChanged()
	{
		
		var mapExtent = oMainMap.getMapExtent(true,false);
		var miniMapExtent = oMiniMap.getMapExtent(true,false);
		
		if(!mapExtent || !miniMapExtent) return false; // Map Busy
		
		var focusLayer, redlineSetup, pt1,pt2,pt3,pt4,pt5;
		var rectPoints, rectNumPts;
		
		focusLayer = oMiniMap.getMapLayer("zoom");
		focusLayer.removeAllObjects();
		var mainArea = (mapExtent.getMaxX() - mapExtent.getMinX()) * (mapExtent.getMaxY() - mapExtent.getMinY());
		var miniArea = (miniMapExtent.getMaxX() - miniMapExtent.getMinX()) * (miniMapExtent.getMaxY() - miniMapExtent.getMinY());
		if (mainArea * 1.5 > miniArea) return false;
		
		redLineSetup = oMiniMap.getRedlineSetup();
		redLineSetup.getEdgeAttr().setThickness(3);
		redLineSetup.getEdgeAttr().setColor(5);
		
				
		redLineSetup.getFillAttr().setStyle("ShapeFill46");
		redLineSetup.getFillAttr().setColor(86);
			
		rectPoints = oMiniMap.createObject("MGCollection"); 
		rectNumPts = oMiniMap.createObject("MGCollection");
		pt1 = oMiniMap.createObject("MGPoint");
		pt2 = oMiniMap.createObject("MGPoint");
		pt3 = oMiniMap.createObject("MGPoint");
		pt4 = oMiniMap.createObject("MGPoint");
		pt5 = oMiniMap.createObject("MGPoint");
			
		rectNumPts.add(5);
		
		pt1.setX(mapExtent.getMinX());	pt1.setY(mapExtent.getMinY());
		pt2.setX(mapExtent.getMaxX());	pt2.setY(mapExtent.getMinY());
		pt3.setX(mapExtent.getMaxX());	pt3.setY(mapExtent.getMaxY());
		pt4.setX(mapExtent.getMinX());	pt4.setY(mapExtent.getMaxY());
		pt5.setX(mapExtent.getMinX());	pt5.setY(mapExtent.getMinY());
		
		if((pt2.getX() - pt1.getX())/(miniMapExtent.getMaxX() - miniMapExtent.getMinX()) < 0.05)
		{
			var centerX = pt1.getX() + (pt2.getX() - pt1.getX());
			var newWidth = (miniMapExtent.getMaxX() - miniMapExtent.getMinX()) * 0.025;
			pt1.setX(centerX - newWidth);	
			pt2.setX(centerX + newWidth);	
			pt3.setX(centerX + newWidth);
			pt4.setX(centerX - newWidth);
			pt5.setX(centerX - newWidth);
		}
		
		if((pt3.getY() - pt2.getY())/(miniMapExtent.getMaxY() - miniMapExtent.getMinY()) < 0.05)
		{
			var centerY = pt2.getY() + (pt3.getY() - pt2.getY());
			var newHeight = (miniMapExtent.getMaxY() - miniMapExtent.getMinY()) * 0.025;
			pt1.setY(centerY - newHeight);	
			pt2.setY(centerY - newHeight);	
			pt3.setY(centerY + newHeight);
			pt4.setY(centerY + newHeight);
			pt5.setY(centerY - newHeight);
		}
		
		rectPoints.add(pt1);
		rectPoints.add(pt2);
		rectPoints.add(pt3);
		rectPoints.add(pt4);
		rectPoints.add(pt5);
		
		focusLayer.createMapObject("1","Location Rectangle","").addPolygonPrimitive(rectPoints,rectNumPts,false);
		
	}
	
	function KeepDigitizing()
	{
		if(window.event)
			window.event.cancelBubble=true;
		
		oMiniMap.digitizeRectangle();
		digitInterval = window.setInterval(oMiniMap.id + ".digitizeRectangle();",200);
	}
	
	function StopDigitizing()
	{
		window.clearInterval(digitInterval);
	}
	
	function onDigitizedRectangle(map,anchorPt,endPt)
	{
		var mapWidth;
		if(anchorPt.X == endPt.X && anchorPt.Y == endPt.Y)
		{
			mapWidth = oMainMap.getWidth(mapUnit)
		}
		else
		{	
			if(Math.abs(anchorPt.X - endPt.X) < Math.abs(anchorPt.Y - endPt.Y))
			{
					var mapExtent =	oMainMap.getMapExtent(true,false);
					mapWidth = Math.abs(anchorPt.Y - endPt.Y) * ((mapExtent.getMaxX()-mapExtent.getMinX())/(mapExtent.getMaxY()-mapExtent.getMinY()))
					mapWidth*= GetCTU(oMainMap);
			}else
				mapWidth = Math.abs(anchorPt.X - endPt.X) *  GetCTU(oMainMap);
		}
			
		
		var zoomLat = anchorPt.Y - (anchorPt.Y - endPt.Y)/2;
		var zoomLon = anchorPt.X  - (anchorPt.X - endPt.X)/2;
		oMainMap.zoomWidth(zoomLat,zoomLon, mapWidth,"");
	}
	
		
			
	function GetCTU(map)
	{
		var mapUnitWidth = map.getWidth(mapUnit);
		var mapExtent = map.getMapExtent(true,false);
		return mapUnitWidth/(mapExtent.getMaxX() - mapExtent.getMinX());
	}
}

/////////////////////////
// HTML IMPLEMENTATION //
/////////////////////////

/*
<script language="javascript" src="MiniMap.js"></script>
<script language="javascript">
	var MiniMapLink = null;
	
	function miniMapObj::onViewChanged(map)
	{
		if(!MiniMapLink)MiniMapLink = new jsMiniMap(MainMapObj,MiniMapObj,MiniMapContainer);
	}
	
	function miniMapObj::onDigitizedRectangle(map,anchorPt, endPt)
	{
		MiniMapLink.OnDigitizedRectangle(map,anchorPt,endPt);
	}
	
	function MainMapObj::onViewChanged(map)
	{
		if(MiniMapLink)MiniMapLink.OnViewChanged(map);
	}
	
</script>
*/
