// ©2006 Topaz Maps Inc.
// www.topazmaps.com
// Custom cartography and mapping applications
// v3.5 20060822

var topaz_menu = new Array();  // location menu
var topaz_mapMenu = new Array();  // map display menu
var topaz_locs = new Array();	// data array
var topaz_maps = new Array();	// map array
var topaz_selection = new Array();  // current selection
var topaz_mapRec = null;  // current map view parameters
var topaz_mapDisp = ""; // the current map display id

var topaz_dataFld_id = -1;	// data array fields
var topaz_dataFld_x = -1;
var topaz_dataFld_y = -1;
var topaz_dataFld_name = -1;
var topaz_dataFld_type = -1;
var topaz_dataFld_group = -1;

var topaz_baseMapName = "";	// default map

// display preference globals
var topaz_displayLocTitles = false;
var topaz_autoZoom = false;
var topaz_showBox = false;
var topaz_hasLegend = false;

var D2R = 0.0174532925199432;

function TOPAZMAPS_newMap(theMapDispID,theBasemap,mapArray,dataArray,mapMenu)
{
	topaz_baseMapName = theBasemap;
	topaz_maps = mapArray;
	topaz_locs = dataArray;
	topaz_selection = new Array(topaz_locs.length);
	topaz_mapMenu = mapMenu;
	topaz_mapDisp = theMapDispID;
	var theHTML = '<img id="'+topaz_mapDisp+'" src="'+topaz_maps[0][1]+'" width="'+topaz_maps[0][2][0]+'" height="'+topaz_maps[0][2][1]+'" border="0" usemap="#imgmap'+topaz_mapDisp+'" />';
	theHTML += '<map name="imgmap'+topaz_mapDisp+'">';
	for (var i=topaz_maps.length-1; i>=0; i--)
    {
    	theHTML += '<area id="'+getDivID("MAP",topaz_maps[i][0]+"_A")+'"shape="rect" coords="0,0,0,0" nohref';
		theHTML += ' onclick="TOPAZMAPS_selectMap(\''+topaz_mapDisp+'\',\''+ topaz_maps[i][0] +'\');return false;">';
    	theHTML += '<area id="'+getDivID("MAP",topaz_maps[i][0]+"_B")+'"shape="rect" coords="0,0,0,0" nohref';
		theHTML += ' onclick="TOPAZMAPS_selectMap(\''+topaz_mapDisp+'\',\''+ topaz_maps[i][0] +'\');return false;">';
	}
    theHTML += '</map>';	
	var defSym = TOPAZMAPS_symbol(0,false);
	var theS = defSym[0];
	var theW = defSym[1]+'';
	var theH = defSym[2]+'';
    for (var i=0; i<topaz_locs.length; i++)
    {
    	theHTML += '<img id="' + getDivID("LOC",i) + '" onclick="TOPAZMAPS_selectLoc(\''+topaz_mapDisp+'\','+ i +');return false;"';
    	theHTML += ' style="position:absolute;visibility:visible;z-index:'+i+';';
    	theHTML += 'left:0px;'+'top:0px;"';
		theHTML += ' src="' + theS + '" ';
		if (topaz_displayLocTitles)
		{
			theHTML += 'title="' + topaz_locs[i][topaz_dataFld_name] + '" ';
		}
		theHTML += 'width="' + theW + '" height="' + theH + '">';
		topaz_selection[i] = false;
	}
	return(theHTML);
};

function TOPAZMAPS_getMapMenuItem(theMapName)
{
	for (var i=0; i<topaz_mapMenu.length; i++)
	{
		if (topaz_mapMenu[i][1] == theMapName)
		{
			return i;
		}
	}
	return 0;
};


function TOPAZMAPS_updateMapAreas(maps)
{
	for (var i=0; i<maps.length; i++)
    {
		var theAreaObj_A = document.getElementById(getDivID("MAP",maps[i][0]+"_A"));
		var theAreaObj_B = document.getElementById(getDivID("MAP",maps[i][0]+"_B"));

		if (maps[i][0] == topaz_mapRec[0])
		{
			theAreaObj_A.coords = "0,0,0,0";
			theAreaObj_B.coords = "0,0,0,0";
		}
		else
		{
			if (topazProj_proj == "PO")
			{
				if (i == 0)  // only put up the largest click-back
				{	
					theAreaObj_B.coords = TOPAZMAPS_areaRelativeCoords(topazProj_imgPos[0],topazProj_imgPos[1],topazProj_imgW+topazProj_imgPos[0],topazProj_imgH+topazProj_imgPos[1]);
					theAreaObj_A.coords = "0,0,0,0";
				}
				else
				{
					theAreaObj_A.coords = "0,0,0,0";
					theAreaObj_B.coords = "0,0,0,0";
				}
			}
			else
			{
				var theCoords = maps[i][4];
				
				var splitArea = false;				
				var splitCoords = new Array(4);
				
				if (theCoords[0] < topazProj_xomin)
				{
					splitArea = true;
					splitCoords[0] = theCoords[0] + 360.0;
					splitCoords[1] = topazProj_xomin + 360.0;
					splitCoords[2] = topazProj_xomin;
					splitCoords[3] = theCoords[2];
				}
				else if (theCoords[2] > topazProj_xomax)
				{
					splitArea = true;
					splitCoords[0] = topazProj_xomax - 360.0;
					splitCoords[1] = theCoords[2] - 360.0;
					splitCoords[2] = theCoords[0];
					splitCoords[3] = topazProj_xomax;
				}
				if (splitArea)
				{
					var ulCoords = TOPAZMAPS_projCoords(splitCoords[0],theCoords[1]);
					var lrCoords = TOPAZMAPS_projCoords(splitCoords[1],theCoords[3]);

					var theClipRectA = TOPAZMAPS_clipRect(ulCoords[0],ulCoords[1],lrCoords[0],lrCoords[1],topazProj_imgPos[0],topazProj_imgPos[1],topazProj_imgPos[0]+topazProj_imgW,topazProj_imgPos[1]+topazProj_imgH);
					if (theClipRectA != null)
					{
						theAreaObj_A.coords = TOPAZMAPS_areaRelativeCoords(theClipRectA[0],theClipRectA[1],theClipRectA[2],theClipRectA[3]);
					}
					else
					{
						theAreaObj_A.coords = "0,0,0,0";
					}
					var ulCoords = TOPAZMAPS_projCoords(splitCoords[2],theCoords[1]);
					var lrCoords = TOPAZMAPS_projCoords(splitCoords[3],theCoords[3]);
					var theClipRectB = TOPAZMAPS_clipRect(ulCoords[0],ulCoords[1],lrCoords[0],lrCoords[1],topazProj_imgPos[0],topazProj_imgPos[1],topazProj_imgPos[0]+topazProj_imgW,topazProj_imgPos[1]+topazProj_imgH);
					if (theClipRectB != null)
					{
						theAreaObj_B.coords = TOPAZMAPS_areaRelativeCoords(theClipRectB[0],theClipRectB[1],theClipRectB[2],theClipRectB[3]);
					}
					else
					{
						theAreaObj_B.coords = "0,0,0,0";
					}
				}
				else
				{
					var ulCoords = TOPAZMAPS_projCoords(theCoords[0],theCoords[1]);
					var lrCoords = TOPAZMAPS_projCoords(theCoords[2],theCoords[3]);
					var theClipRect = TOPAZMAPS_clipRect(ulCoords[0],ulCoords[1],lrCoords[0],lrCoords[1],topazProj_imgPos[0],topazProj_imgPos[1],topazProj_imgPos[0]+topazProj_imgW,topazProj_imgPos[1]+topazProj_imgH);
					if (theClipRect != null)
					{
						theAreaObj_B.coords = TOPAZMAPS_areaRelativeCoords(theClipRect[0],theClipRect[1],theClipRect[2],theClipRect[3]);
					}
					else
					{
						theAreaObj_B.coords = "0,0,0,0";
					}
					theAreaObj_A.coords = "0,0,0,0";
				}
			}
		}
	}
};

function TOPAZMAPS_areaRelativeCoords(theLeft,theTop,theRight,theBottom)
{
	var relLeft = Math.floor(theLeft-topazProj_imgPos[0]);
	if (relLeft < 0) {relLeft = 0;}
	var relRight = Math.floor(theRight-topazProj_imgPos[0]);
	if (relRight >= topazProj_imgW) {relRight = topazProj_imgW-1;}
	var relTop = Math.floor(theTop-topazProj_imgPos[1]);
	if (relTop < 0) {relTop = 0;}
	var relBottom = Math.floor(theBottom-topazProj_imgPos[1]);
	if (relBottom >= topazProj_imgH) {relBottom = topazProj_imgH-1;}
	var theCoordString = ""+relLeft+","+relTop+","+relRight+","+relBottom;
	return(theCoordString);
};

function TOPAZMAPS_clipRect(aL,aT,aR,aB,theL,theT,theR,theB)
{
	if ((aL>theR) || (aR < theL) || (aT>theB) || (aB < theT))
	{
		return null;
	}
	else
	{
		var theClippedRect = new Array(4);
		theClippedRect[0] = ((aL < theL) ? Math.floor(theL) : Math.floor(aL));
		theClippedRect[1] = ((aT < theT) ? Math.floor(theT) : Math.floor(aT));
		theClippedRect[2] = ((aR > theR) ? Math.floor(theR) : Math.floor(aR));
		theClippedRect[3] = ((aB > theB) ? Math.floor(theB) : Math.floor(aB));
		return theClippedRect;
	}
};

var topazProj_imgPos = null;
var topazProj_proj = "";
var topazProj_projP = null;
var topazProj_xo = 0.0;
var topazProj_yo = 0.0;
var topazProj_xs = 1.0;
var topazProj_ys = 1.0;
var topazProj_xomin = 0.0;
var topazProj_yomin = 0.0;
var topazProj_xomax = 0.0;
var topazProj_yomax = 0.0;
var topazProj_imgW = 0.0;
var topazProj_imgH = 0.0;
var topazProj_r = 0;

function TOPAZMAPS_initProj(theMapDispID)
{	
	var theImage = document.getElementById(theMapDispID);
	topazProj_imgPos = getElementPosition(theImage);
	topazProj_imgPos[0] += topaz_mapRec[3][0];
	topazProj_imgPos[1] += topaz_mapRec[3][1];
	topazProj_proj = topaz_mapRec[5];
	topazProj_projP = topaz_mapRec[6];
	topazProj_xomin = topaz_mapRec[4][0];
	topazProj_yomin = topaz_mapRec[4][3];
	topazProj_xomax = topaz_mapRec[4][2];
	topazProj_yomax = topaz_mapRec[4][1];
	topazProj_imgW = topaz_mapRec[2][0] - topaz_mapRec[3][0] - topaz_mapRec[3][2];
	topazProj_imgH = topaz_mapRec[2][1] - topaz_mapRec[3][1] - topaz_mapRec[3][3];

	if ((topazProj_proj == "ER") || (topazProj_proj == "ERS"))
	{
		topazProj_xo = topaz_mapRec[4][0];
		topazProj_yo = topaz_mapRec[4][1];
		topazProj_xs = topazProj_projP[0] * topazProj_imgW/(topaz_mapRec[4][2]-topaz_mapRec[4][0]) ;
		topazProj_ys = topazProj_imgH/(topaz_mapRec[4][1]-topaz_mapRec[4][3]) ;	
	}
	else if (topazProj_proj == "PO")
	{	
		if (topazProj_yomin < 0)
		{
			topazProj_r = (1.0/Math.cos(topazProj_yomax*D2R) * topazProj_imgH/2.0);
		}
		else
		{
			topazProj_r = (1.0/Math.cos(topazProj_yomin*D2R) * topazProj_imgH/2.0);
		}
		topazProj_xo = topazProj_projP[0];
	}
};

function TOPAZMAPS_projCoords(ox,oy)
{
	if ((topazProj_proj == "ER") || (topazProj_proj == "ERS"))
	{
		var x = ((ox - topazProj_xo)*topazProj_xs) + topazProj_imgPos[0];
		var y = ((topazProj_yo - oy)*topazProj_ys) + topazProj_imgPos[1];
		return(new Array(x,y));
	}
	else if (topazProj_proj == "PO")
	{
		var rho = topazProj_r * Math.cos(oy*D2R);
		if (oy < 0)
		{
			var ang = (topazProj_xo-ox)*D2R;
		}
		else
		{
			var ang = (ox-topazProj_xo)*D2R;
		}
		var x = rho * Math.sin(ang);
		var y = -1 * rho * Math.cos(ang);
		if (oy > 0)
		{	
			y = y * 1.0;
		}
		x = (x + (topazProj_imgH/2.0)) + topazProj_imgPos[0];
		y = ((topazProj_imgH/2.0) - y) + topazProj_imgPos[1];
		return(new Array(x,y));
	}
};

function TOPAZMAPS_drawSymbol (theLocations,locno,isSelected)
{
	var theSym = TOPAZMAPS_symbol(locno,isSelected);
	var x = theLocations[locno][topaz_dataFld_x];
	if ((topazProj_xomin < -180.0) && (x > topazProj_xomax))
	{
		x = x - 360.0;
	}
	var y = theLocations[locno][topaz_dataFld_y];

	var theSymElement = document.getElementById(getDivID("LOC",locno));

	if ((x >= topazProj_xomin) && (x <= topazProj_xomax) && (y >= topazProj_yomin) && (y <= topazProj_yomax))
	{
		var theCoords = TOPAZMAPS_projCoords(x,y);
		theSymElement.style.visibility = "visible";
		theSymElement.style.left = Math.floor(theCoords[0]-theSym[3]) + 'px';
		theSymElement.style.top = Math.floor(theCoords[1]-theSym[4]) + 'px';
		theSymElement.src = theSym[0];
		theSymElement.width = theSym[1];
		theSymElement.height = theSym[2];
	}
	else
	{
		theSymElement.style.visibility = "hidden";
	}
	if (isSelected)
	{ 		
		theSymElement.style.zIndex = theLocations.length+locno;
	}
};

function TOPAZMAPS_selectLoc (theMapDispID,theMatch)
{
	topaz_mapDisp = theMapDispID;
	if ((topaz_autoZoom) && ((theMatch.toString().length>3) || (document.getElementById(getDivID("LOC",theMatch)).style.visibility == "hidden")))
	{
		TOPAZMAPS_selectMap(theMapDispID,topaz_baseMapName);
	}
	TOPAZMAPS_highlightLocs (topaz_locs, theMatch, topaz_dataFld_group);
	if (theMatch.toString().length < 4)
	{
		document.getElementById("locMenu").selectedIndex = topaz_menu[theMatch];
	}
    TOPAZMAPS_info(theMatch);
};


function TOPAZMAPS_selectMap (theMapDispID,theMapName)
{
	if ((topaz_mapRec == null) || (theMapName != topaz_mapRec[0]))
	{
		for (var i=0; i<topaz_maps.length; i++)
		{
			if (topaz_maps[i][0] == theMapName)
			{
				topaz_mapRec = topaz_maps[i];
				break;
			}
		}
		TOPAZMAPS_drawMap(theMapDispID);
	}
};

function TOPAZMAPS_drawMap (theMapDispID)
{
	var theMap = document.getElementById(theMapDispID);
	theMap.visibility = "hidden";
	theMap.src = topaz_mapRec[1];
	theMap.width = topaz_mapRec[2][0];
	theMap.height = topaz_mapRec[2][1];
	TOPAZMAPS_initProj(theMapDispID);
	TOPAZMAPS_updateMapAreas(topaz_maps);
	for (var i=0; i<topaz_locs.length; i++)
	{
		TOPAZMAPS_drawSymbol(topaz_locs,i,topaz_selection[i]);
	}
	document.getElementById("mapMenu").selectedIndex = TOPAZMAPS_getMapMenuItem(topaz_mapRec[0]);
	theMap.visibility = "visible";
};

function TOPAZMAPS_highlightLocs (locs, theMatch, matchElem)
{
    for (var i=0; i<locs.length; i++) 
    { 
    	var selectSym = ((i == theMatch) || (theMatch == locs[i][matchElem]));
    	topaz_selection[i] = selectSym;
		TOPAZMAPS_drawSymbol (locs,i,selectSym)
	}
};

function getDivID (theType,theSuffix)
{
	var theID = ""
	if (theType == "LOC")
	{
		theID = 'l_' + topaz_mapDisp + '_' + theSuffix;
	}
	else if (theType == "MAP")
	{
		theID = 'a_' + topaz_mapDisp + '_' + theSuffix;
	}
	return theID;
};

function getElementPosition (elem)
{
    var currElem = elem;
    var offLeft = 0;
    var offTop = 0;
    while (currElem) {
        offLeft += currElem.offsetLeft;
        offTop += currElem.offsetTop;
        currElem = currElem.offsetParent;
    }
    if (navigator.userAgent.indexOf("Mac") != -1 && 
        typeof document.body.leftMargin != "undefined") {
        offLeft += document.body.leftMargin;
        offTop += document.body.topMargin;
    }
    return [offLeft, offTop];
};
