/**
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * AOL Local Interactive Map JavaScript
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * support functions for interactive maps
 */

// defaults
var mapImgArray 	= new Array(
	"zoomIn","zoom1","zoom2","zoom3","zoom4","zoom5",
	"zoom6","zoom7","zoom8","zoom9","zoom10","zoomOut",
	"nw", "n", "ne", "e", "w", "sw", "s", "se"
);
var xhtmlns				= "http://www.w3.org/1999/xhtml";  //making code down with the XHTML
var radius				= 5; //pixel detection radius for each poi
var activeMaps			= new function(){};
var activeRollover;
var activeTimeout 	= 10000; //ms to autohide rollover for extended hover or fast mouseout

// =~=~=~=~=~=~=~=~=~=~=~=~=~=

/**
 * initialize eventlisteners and rollovers for map
 */
function mapInit(fMapId)
{
	var fMapObj = eval(fMapId);
	//add event listeners on zoom and pan images
	for(i = 0; i < mapImgArray.length; i++)
	{
		var idName = mapImgArray[i] + "_" + fMapId;
		var fElementId = document.getElementById(idName);
		switch(mapImgArray[i])
		{
			case "zoomIn":
			case "zoomOut":	
			break;
			default:
				addEvent(fElementId, "mouseout", mapEventMonitor);
				addEvent(fElementId, "mouseover", mapEventMonitor);
		}
		addEvent(fElementId, "click", mapEventMonitor);
		fElementId.setAttribute("title", fElementId.getAttribute("alt"));
	}
	preloadMapArt(); // preload map art
	addEvent(document.getElementById(fMapId), "mouseup", mapClick);// activate map event listener
	if(paramExists(fMapObj.rollover))
	{
		addEvent(document.getElementById(fMapId), "mousemove", checkPoiRollovers);// activate xy listener
	}
	if(paramExists(fMapObj.zoomLevel))
	{
		zoomStateSet(fMapObj.zoomLevel,fMapId);// set zoom notches
	}
}//mapInit()
	
/**
 * Monitor events on map images and fire appropriate function
 */
function mapEventMonitor(evt)
{
	if(document.addEventListener)
	{// Moz and Opera
		var eventId		= evt.target.id;
		var eventType	= evt.type;
	}
	else if(window.event)
	{
		var eventId		= window.event.srcElement.id;
		var eventType	= window.event.type;
	}
	var splitId 			= eventId.split('_');
	var eventMapTrigger	= splitId[0];
	var eventMapId 		= splitId[1];	
	
	var zoomZoom = eventMapTrigger.indexOf("zoom");
	if(zoomZoom >= 0)
	{	// zoom control
		var zoomLevel = eventMapTrigger.substring(zoomZoom + 4);
		switch(eventType)
		{
			case "mouseover":
				zoomStateSwap(zoomLevel,1,eventId);
			break;
			case "mouseout":
				zoomStateSwap(zoomLevel,0,eventId);
			break;
			case "click":
				if(zoomLevel == "Out")
				{
					mapZoomOut(eventMapId);
				}
				else if (zoomLevel == "In")
				{
					mapZoomIn(eventMapId);
				}
				else
				{
					mapZoom(zoomLevel, eventMapId);
				}
				hidePoiRollovers();
			break;
		}
	}
	else
	{	//pan control
		switch(eventType)
		{
			case "mouseover":
				panStateSwap("pan_" + eventMapTrigger, 1, eventMapId);
			break;
			case "mouseout":
				panStateSwap("pan_" + eventMapTrigger, 0, eventMapId);
			break;
			case "click":
				mapPan(eventMapTrigger,eventMapId);
				hidePoiRollovers();
			break;
		}
	}
}//mapEventMonitor()

/**
 * retrieve advantage map info via remote scripting callback or direct image replacement
 */
function getNewMap(fUrl, fMapId)
{
	var fMapObj = eval(fMapId);
	if((paramExists(fMapObj.mapSessionId) == false) || (paramExists(fMapObj.rollover)))
	{	//no sessionid	or we need rollover xy look-ups
		if((paramExists(fMapObj.mapSessionId) == false) && (paramExists(fMapObj.mapOriginQuery) == true))
		{	// map was shown than hidden
			var avUrl = fMapObj.mapOriginQuery;
		}
		else
		{	// first time shown
			var avUrl = avListener;
			var i = 0;
			for (var nv in fMapObj)
			{
				if(typeof(fMapObj[nv]) != "object")
				{	//if val is an object, it's the locations
					avUrl += (i == 0)?"?":"&";
					avUrl += nv + "=" + fMapObj[nv];
				}
				else if((nv == "pois") && (paramExists(fMapObj.rollover)))
				{	//process the poi data	
					var ii = 1;
					for (var locNV in fMapObj.pois)
					{
						var thisNV = eval(fMapObj.pois[locNV]);
						avUrl += "&poi_name" + ii + "=" + locNV;
						avUrl += "&poi_latitude"  + ii + "=" + thisNV.latitude;
						avUrl += "&poi_longitude"  + ii + "=" + thisNV.longitude;
						ii++;
					}
				}
				i++;
			}
			//is this an update
			if(paramExists(fMapObj.mapSessionId))
			{
				avUrl += "&mapbrowse=" + fUrl + "&rand=" + Math.random();
			}
			else
			{
				mapInit(fMapId);	// initialize map data
				fMapObj.mapOriginQuery	= avUrl;
				fMapObj.mapLoadUrl		= document.getElementById(fMapId).src;
			}			
		}
		jsLoader(avUrl, "loadScript", "body");	// get map, update poi xy
	}
	else
	{	// just replace map image
		var qrydata			= document.getElementById(fMapId).src;
		var nv				= qrydata.split('&');
		var url				= new Object();
		var mapImageUrl	= nv[0];
		for(i = 1; i < nv.length; i++)
		{
			eq = nv[i].indexOf('=');
			if(
				(nv[i].substring(0,eq).toLowerCase() != "mapbrowse") &&
				(nv[i].substring(0,eq).toLowerCase() != "rand")
			)
			{	//replace mapbrowse nv
				mapImageUrl += "&" + nv[i].substring(0,eq).toLowerCase() + "=" + nv[i].substring(eq + 1);
			}
		}
		mapImageUrl += "&mapbrowse=" + fUrl;
		mapImageUrl += "&rand=" + Math.random();
		swapImage(mapImageUrl, fMapId);
	}
}//getNewMap()

/**
 * Map session times out after 5mins (as of 12.04), need to refresh current map if still open
 * does actual map update and on each counter reset
 */
function mapUpdate()
{
	for (var nv in activeMaps)
	{
		if(activeMaps[nv] != "hidden")
		{
			getNewMap('', nv);
		}
	}
}//mapUpdate()

/**
 * get xy coords of mouse click on image and update map
 */
function mapClick(evt)
{
	var fUrl, x, y;
	var mapXYData 	= getXY(evt);
	var eventId 	= mapXYData[0];
	var mapX 		= mapXYData[1];
	var mapY 		= mapXYData[2];
	var x 			= mapXYData[3];
	var y 			= mapXYData[4];
	// center or zoom
	var centerZoom	= "zoom";
	var formId		= eventId + "Form";	
	if(paramExists(document.getElementById(formId).clickAction))
	{
		if (document.getElementById(formId).clickAction[0].checked)
		{	// Zoom
			mapZoomIn (eventId);
		}
		else if (document.getElementById(formId).clickAction[1].checked)
		{	// Recenter
		  	var fUrl = "center&x=" + mapX + "&y=" + mapY ;
			getNewMap(fUrl, eventId); 
		} 
	}
	else
	{
		mapZoomIn (eventId);
	}
	hidePoiRollovers();
 }// mapClick()

/**
 * map nav panel was clicked
 */
function mapPan(p, fMapId)
{
	getNewMap("pan_" + p, fMapId);
}//mapPan()

/**
 * zoom in on map
 */
function mapZoom(l,fMapId)
{
	var fUrl = "zoom_"+ l;
	getNewMap(fUrl,fMapId);	  
	zoomStateSet(l,fMapId);// update zoom notches
}//mapZoom()

/**
 * zoom in image fired
 */
function mapZoomIn(fMapId)
{
	if(parseInt(eval(fMapId).zoomLevel) < 10)
	{
		var thisZoom = parseInt(eval(fMapId).zoomLevel) + 1;
		mapZoom(thisZoom, fMapId);
	}
}//mapZoomIn()

/**
 * zoom out image fired
 */
function mapZoomOut(fMapId)
{
	if(parseInt(eval(fMapId).zoomLevel) > 1)
	{
		var thisZoom = parseInt(eval(fMapId).zoomLevel) - 1;
		mapZoom(thisZoom, fMapId);
	}
}//mapZoomOut()

/**
 * set or reset current notch
 */
function zoomStateSet(l,fMapId)
{
	for (var i = 1; i <= 10; ++i)
	{
		var s = 0;
		switch(i)
		{
			case parseInt(l):
				s = 2;
			break;
			default:
				s = 3;
		}
		eval(fMapId).zoomLevel = l;
		zoomStateSwap(i,s,"zoom"+i+"_"+fMapId);
	}
}//zoomStateSet()

/**
 * zoom notch rollovers
 */
function zoomStateSwap(l, s, fZoomId)
{
	var fClass = "";
   if((document.getElementById(fZoomId).className == "this") && (s != 3))
	{
      return;
   }
	switch(s)
	{
		case 1:	// mouse over
			document.getElementById(fZoomId).src = eval("zoom" + l + "_over.src");
		break;
		case 2:	// set new current notch
			fClass = "this";
			document.getElementById(fZoomId).src = eval("zoom" + l + "_this.src");
		break;
		default:
		document.getElementById(fZoomId).src = eval("zoom" + l);
	}
	document.getElementById(fZoomId).className=fClass;
}//zoomStateSwap()

/**
 * direction pan rollover
 */
function panStateSwap(arr, s, fMapId)
{
	switch (s)
	{
		case 1:
			var fState = "_over.src";
		break;
		default:
			var fState = "";
	}
	for (i = 0; i < eval(arr).length; i++)
	{
		var img = eval(arr)[i];
		var fSize = panMapSize("pan_" + img, fMapId);
		document.getElementById(img + "_" + fMapId).src = eval(img + fSize + fState);
	}
}//panStateSwap()

/**
 * get dimensions of panel control image
 */
function panMapSize(arr, fMapId)
{
	var fSize = "";
	switch(arr)
	{
		case "pan_n":
		case "pan_s":
			fSize = "_" + document.getElementById(fMapId).width;
		break;
		case "pan_e":
		case "pan_w":
			fSize = "_" + document.getElementById(fMapId).height;
		break;				
	}
	return fSize;
}//panMapSize()

/**
 * preload rollover images
 */
//default declarations
var n_290, s_290, n_425, s_425, n_520, s_520, e_300, w_300, e_420, w_420;
var n_290_over = new Image(290, 20), s_290_over = new Image(290, 20);
var n_425_over = new Image(425, 20), s_425_over = new Image(425, 20);
var n_520_over = new Image(520, 20), s_520_over = new Image(520, 20);
var e_300_over = new Image(20, 300), w_300_over = new Image(20, 300);
var e_420_over = new Image(20, 420), w_420_over = new Image(20, 420);
var nw, sw, ne, se;
var nw_over =  new Image(20, 20), ne_over =  new Image(20, 20),
sw_over =  new Image(20, 20), se_over = new Image(20, 20);
for (i = 1; i <= 10; i++)
{
	eval("var zoom" + i);
	eval("var zoom" + i + "_over = new Image(14, 14)");
	eval("var zoom" + i + "_this = new Image(14, 14)");
}
// pan rollover variable arrays
var pan_n 	= new Array('n'); 	//north
var pan_e  	= new Array('e'); 	//east
var pan_s 	= new Array('s'); 	//south
var pan_w  	= new Array('w'); 	//west
var pan_nw 	= new Array('nw');	//northwest
var pan_ne 	= new Array('ne');	//northeast
var pan_se 	= new Array('se');	//southeast
var pan_sw 	= new Array('sw');	//southwest

/**
 * update image vars width correct art
 */
function preloadMapArt()
{
	if(eval("n_" + mapWidth + "_over.src.length") > 0)
	{	// pan controls already preloaded
		return;
	}
	eval("n_" + mapWidth + "_over.src = '" + artUrl + "north_" + mapWidth + "_on" + mapBrand + "'");
	eval("e_" + mapHeight + "_over.src = '" + artUrl + "east_" + mapHeight + "_on" + mapBrand + "'");
	eval("w_" + mapHeight + "_over.src = '" + artUrl + "west_" + mapHeight + "_on" + mapBrand + "'");
	eval("s_" + mapWidth + "_over.src = '" + artUrl + "south_" + mapWidth + "_on" + mapBrand + "'");
	eval("n_" + mapWidth + "= '" + artUrl + "north_" + mapWidth + "_off" + mapBrand + "'");
	eval("e_" + mapHeight + "= '" + artUrl + "east_" + mapHeight + "_off" + mapBrand + "'");
	eval("w_" + mapHeight + "= '" + artUrl + "west_" + mapHeight + "_off" + mapBrand + "'");
	eval("s_" + mapWidth + "= '" + artUrl + "south_" + mapWidth + "_off" + mapBrand + "'");
	if(nw_over.src.length > 0)
	{	// corners and zoom are common so if loaded, exit
		return;
	}
	nw_over.src = artUrl + "nw_on" + mapBrand;
	ne_over.src = artUrl + "ne_on" + mapBrand;
	se_over.src = artUrl + "se_on" + mapBrand;
	sw_over.src = artUrl + "sw_on" + mapBrand;
	nw 			= artUrl + "nw_off" + mapBrand;
	ne 			= artUrl + "ne_off" + mapBrand;
	se 			= artUrl + "se_off" + mapBrand;
	sw 			= artUrl + "sw_off" + mapBrand;
	// zoom rollovers
	var ii 		= 10;
	for (i = 1; i <= 10; i++)
	{
		eval("zoom" + i + "= '" + artUrl + "map_" + ii + "_off" + mapBrand + "'");
		eval("zoom" + i + "_over.src" + "= '" + artUrl + "map_" + ii + "_over" + mapBrand + "'");
		eval("zoom" + i + "_this.src" + "= '" + artUrl + "map_" + ii + "_on" + mapBrand + "'");
		ii--;
	}
}//preloadMapArt()

/**
 * update poi rollover info
 */
function checkPoiRollovers(evt)
{
	if (!document.getElementsByTagName) return;//bad browser. exit.
	//match setXY data with contentdata fMapObj.loc
	var mapXYData 	= getXY(evt);
	var eventId 	= mapXYData[0];
	var mapX 		= mapXYData[1];
	var mapY 		= mapXYData[2];
	var x 			= mapXYData[3];
	var y 			= mapXYData[4];
	var fEventObj  = eval(eventId);
	if(paramExists(fEventObj.setXY) == false)
	{
		return;
	}
	var poiData 	= fEventObj.setXY;
	for (i = 0; i < eval(poiData).length; i++)
	{	// activate titles for each location
		if(poiData[i][0] == fEventObj.name)
		{// we only want origin to rollover for now
			showPoiRollovers(mapX, mapY, poiData[i][1], poiData[i][2], poiData[i][0], x, y, fEventObj); //start function for each poi
		}
	}
}//checkPoiRollovers()

/**
 * create and display POI pop-ups
 */
function showPoiRollovers(mapX, mapY, poiX, poiY, poiData, x, y, fEventObj)
{
	if (	((mapX >= (poiX-5)) && (mapX <= eval(parseInt(poiX)+5))) && 
			((mapY >= (poiY-5)) && (mapY <= eval(parseInt(poiY)+5)))	)
	{	//if there is already an active tag, nuke it
		if (activeRollover) hidePoiRollovers();
		var tag = document.createElementNS(xhtmlns,"div");
		tag.className = "poirollover";
		var wrapper = document.createElementNS(xhtmlns,"div");
		wrapper.id = "poidata";
		if(fEventObj.name == poiData)
		{	//origin
			var poiInfo = fEventObj.loc;
		}
		if(poiInfo.name.length < 1) return; //no name, no pop-up
		//name
		var name	= document.createTextNode(charConversion(poiInfo.name));
		var b		= document.createElementNS(xhtmlns,"b");
		b.appendChild(name);
		var para = document.createElementNS(xhtmlns,"p");
		if(poiInfo.nameUrl.length > 1)
		{
			var ahref = document.createElementNS(xhtmlns,"a");
			ahref.href = charConversion(poiInfo.nameUrl);
			ahref.appendChild(b);
			para.appendChild(ahref);
		}
		else
		{
			para.appendChild(b);
		}
		wrapper.appendChild(para);
		//addy
		if(paramExists(poiInfo.address))
		{
			name = document.createTextNode(charConversion(poiInfo.address));
			para = document.createElementNS(xhtmlns,"p");
			para.appendChild(name);
			wrapper.appendChild(para);
		}
		//csz
		if(paramExists(poiInfo.cityStateZip))
		{
			name = document.createTextNode(charConversion(poiInfo.cityStateZip));
			para = document.createElementNS(xhtmlns,"p");
			para.appendChild(name);
			wrapper.appendChild(para);
		}
		//phone
		if(paramExists(poiInfo.phone))
		{
			name = document.createTextNode(charConversion(poiInfo.phone));
			para = document.createElementNS(xhtmlns,"p");
			para.appendChild(name);
			wrapper.appendChild(para);
		}
		//getdirs
		if(paramExists(poiInfo.directionsLinkText))
		{
			name			= document.createTextNode(charConversion(poiInfo.directionsLinkText));
			var ahref	= document.createElementNS(xhtmlns,"a");
			ahref.href	= charConversion(poiInfo.directionsLinkUrl);
			ahref.appendChild(name);
			para			= document.createElementNS(xhtmlns,"p");
			para.appendChild(ahref);
			wrapper.appendChild(para);
		}
		//full details
		if(paramExists(poiInfo.viewAllDetailsLinkText))
		{
			name			= document.createTextNode(charConversion(poiInfo.viewAllDetailsLinkText));
			var ahref	= document.createElementNS(xhtmlns,"a");
			ahref.href	= charConversion(poiInfo.viewAllDetailsLinkUrl);
			ahref.appendChild(name);
			para 			= document.createElementNS(xhtmlns,"p");
			para.appendChild(ahref);
			wrapper.appendChild(para);
		}
		tag.appendChild(wrapper);
		tag.style.left = (parseInt(x)) + 'px'; // tag offset from mouse
		tag.style.top = (parseInt(y)) + 'px';
		// collision code
		var w = 175; // fallback width of pop-up
		// move away from right side if too close
		if (window.innerWidth && ((x + w) > window.innerWidth))
		{
			tag.style.left = (window.innerWidth - w - 25) + "px";
		}
		if (document.body.scrollWidth && ((x + w) > document.body.scrollWidth))
		{
			tag.style.left = (document.body.scrollWidth - w - 25) + "px";
		}
		if (document.documentElement.clientWidth && ((x + w) > document.documentElement.clientWidth))
		{	// IE6
			tag.style.left = (document.documentElement.clientWidth - w - 25) + "px";
		}
		addEvent(wrapper.id,"mouseout",hidePoiRollovers);
		document.getElementsByTagName("body")[0].appendChild(tag);
		activeRollover = tag;
		// timer to hide tag after long hover or fast mouseout
		setTimeout('hidePoiRollovers();', activeTimeout);
	}
}//showPoiRollovers()

/**
 * destroy poi pop-ups
 */
function hidePoiRollovers()
{
	if (activeRollover)
	{
		document.getElementsByTagName("body")[0].removeChild(activeRollover);
		activeRollover = null;
	}
}//hidePoiRollovers()

/**
 * replace quotes and other characters back from decimal reference and html entity format
 */
function charConversion(fData)
{
	if(!paramExists(fData)){return "";}
	fData = fData.replace(/&#034;/gi, "\"");
	fData = fData.replace(/&#34;/gi, "\"");
	fData = fData.replace(/&#34/gi, "\"");
	fData = fData.replace(/&quot;/gi, "\"");
	fData = fData.replace(/&#039;/gi, "'");
	fData = fData.replace(/&#39;/gi, "'");
	fData = fData.replace(/&#39/gi, "'");
	fData = fData.replace(/&gt;/gi, ">");
	fData = fData.replace(/&lt;/gi, "<");
	fData = fData.replace(/&amp;/gi, "&");
	return fData;
}//charConversion()

// =~=~=~=~=~=~=~=~=~=~=~=~=~=
// background map session counter
setInterval("mapUpdate()", 270000); //4m30s
