﻿vcc.dl = new Object();

vcc.dl.iMapPixelWidth = 467;
vcc.dl.iMapPixelHeight = 320;
vcc.dl.strLanguage = "";
vcc.dl.strMarket = "";
vcc.dl.strLabelPhone2 = "";
vcc.dl.strXmlNameSpaces = "xmlns:mp='http://s.mappoint.net/mappoint-30/' xmlns:dl='http://dealernet.volvocars.se/dealerlocator/'";

vcc.dl.iZoomLevel = 0;
vcc.dl.strSearchType = ""; //Indicates the type of search performed. Used for correct filtering when map results are disabled
vcc.dl.strSearchValueZip = "";
vcc.dl.strSearchValueRadius = "";
vcc.dl.strSearchValueCity = "";
vcc.dl.strSearchValueRegion = "";
vcc.dl.strSearchValueDealerList = "";
vcc.dl.strSearchValueCountry = "";

vcc.dl.blnDisplayRadiusInMiles;

vcc.dl.dblMilesToKmRatio = 1.609344;

//Based on radius. Smallest radius = max zoom. Unit is either km or miles.
vcc.dl.arZoomLevels = [ 1000, 200, 100, 50, 20, 10, 5, 2.5, 1.5, 0.5 ];

vcc.dl.blnSearchInProgress;

vcc.dl.Map = {
	scale: 0,
	centerPoint: {
		latitude: 0,
		longitude: 0
	},
	width: 0, //Width in degrees
	height: 0, //Height in degrees
	left: 0,  //Lowest longitude value on map
	bottom: 0, //Lowest latitude value on map
	heightInDistanceUnit: 0, //Height of the map, in either km or miles
	radius: 0
}

vcc.dl.ActiveDealer = { latitude: 0, longitude: 0 }

vcc.dl.setMapProperties = function(iScale,iCenterLat,iCenterLong,iWidth,iHeight,iLeft,iBottom,iHeightInKm) {
	with (vcc.dl.Map) {
		scale = 1.0;
		centerPoint.latitude = iCenterLat;
		centerPoint.longitude = iCenterLong;
		width = iWidth;
		height = iHeight;
		left = iLeft;
		bottom = iBottom;
		heightInKm = iHeightInKm;
	}
	vcc.dl.Map.radius = heightInKm/2;
	//If miles, convert radius, since it's always returned in km
	if (vcc.dl.blnDisplayRadiusInMiles) {
		vcc.dl.Map.radius /= vcc.dl.dblMilesToKmRatio;
	}
	
}

vcc.dl.init = function() {
	//Fix distances
	vcc.dl.roundDistances();
	var objMapContainer = vcc.getObj("map");
	if (!objMapContainer) return;
	var arMapLinks = objMapContainer.parentNode.getElementsByTagName("a");
	for (var i = 0; i < arMapLinks.length; i++) {
		arMapLinks[i].onfocus = function() {
			this.blur();
		}
	}
	//Set correct scale in zoom toolbar
	vcc.dl.setScaleInToolbar();	
}

vcc.dl.mapUpdateStarts = function() {
	vcc.setDisplay("loading","block");
	vcc.dl.blnSearchInProgress = true;
}

vcc.dl.mapUpdateEnds = function() {
	vcc.setDisplay("loading","none");
	vcc.dl.blnSearchInProgress = false;
}

vcc.dl.strMapUrl;

vcc.dl.objNewMapImage = new Image();

vcc.dl.blnSwapImageFadeOutComplete = false;

vcc.dl.swapMap = function() {
	var objMap = vcc.getObj("mapimage");
	var blnUseFilters = (objMap.filters != null && objMap.filters.length > 0);
	var blnUseComputedStyle = (window.getComputedStyle);	
	if ((!window.getComputedStyle && !blnUseFilters) || vcc.opera) {
		objMap.src = vcc.dl.objNewMapImage.src;
		vcc.dl.setScaleInToolbar();
		vcc.dl.mapUpdateEnds();	
		return;
	}
	var iCurrentOpacity = (blnUseFilters) ? objMap.filters.item(0).opacity : parseFloat(getComputedStyle(objMap, null).getPropertyValue('opacity'));	
	if (vcc.dl.blnSwapImageFadeOutComplete) {
		//Fade in
		if (iCurrentOpacity == 0) {
			//Image is completely faded out. Change it to the new one
			objMap.src = vcc.dl.objNewMapImage.src;
		} else if ((blnUseComputedStyle && iCurrentOpacity == 1) || (blnUseFilters && iCurrentOpacity == 100)) {
			//Image is competely faded in. Image swap complete.
			vcc.dl.blnSwapImageFadeOutComplete = false;
			vcc.dl.setScaleInToolbar();
			vcc.dl.mapUpdateEnds();	
			return;
		}
		if (blnUseComputedStyle) objMap.style.opacity = iCurrentOpacity + 0.1;
		else objMap.filters.item(0).opacity = iCurrentOpacity + 10;
	} 
	else {
		//Fade out
		if (blnUseComputedStyle) objMap.style.opacity = iCurrentOpacity - 0.1;
		else objMap.filters.item(0).opacity = iCurrentOpacity - 10;
	}
	//Check if the new opacity is 0. If it is, set flag so that the function
	//knows fade out is complete, and that it should start to fade in the image the next time it's called
	iCurrentOpacity = (blnUseFilters) ? objMap.filters.item(0).opacity : parseFloat(getComputedStyle(objMap, null).getPropertyValue('opacity'));
	if (iCurrentOpacity == 0) vcc.dl.blnSwapImageFadeOutComplete = true;
	setTimeout("vcc.dl.swapMap()",20);
}

vcc.dl.setScaleInToolbar = function() {
	var objZoomToolbar = vcc.getObj("zoom");
	if (!objZoomToolbar) return;
	var iMapRadius = vcc.dl.Map.radius;
	var arZoomLinks = objZoomToolbar.getElementsByTagName("a");
	for (var i = 0; i < arZoomLinks.length; i++) {
		arZoomLinks[i].className = "scale";
	}
	for (var i = 0; i < vcc.dl.arZoomLevels.length; i++) {
		var dblCurrentZoomLevel = vcc.dl.arZoomLevels[i];
		if (iMapRadius + 0.03 >= dblCurrentZoomLevel) {
			arZoomLinks[i + 1].className += " active";
			vcc.dl.iZoomLevel = i;
			break;
		}
	}
}

vcc.dl.zoomMap = function(blnZoomIn,iNewZoomLevel) {
	//if (vcc.dl.blnSearchInProgress) return;
	if (iNewZoomLevel > -1) {
		vcc.dl.mapUpdateStarts();
		vcc.dl.iZoomLevel = iNewZoomLevel;		
		var iNewRadius = vcc.dl.arZoomLevels[iNewZoomLevel] + 0.03;
		var strFilter = vcc.dl.GetFilterString();
		vcc.dl.ajaxWrapper("GetMapAjax", [vcc.dl.Map.centerPoint.latitude + "", vcc.dl.Map.centerPoint.longitude + "", vcc.dl.Map.scale, iNewRadius + "", strFilter], vcc.dl.UpdateMap);
	} else {
		if (blnZoomIn && vcc.dl.iZoomLevel < 9) {
			vcc.dl.zoomMap(0,vcc.dl.iZoomLevel + 1);
		} else if (!blnZoomIn && vcc.dl.iZoomLevel > 0) {
			vcc.dl.zoomMap(0,vcc.dl.iZoomLevel - 1);
		}
	}	
}

vcc.dl.centerMapOnDoubleClick = function(event) {
	var e = (window.event) ? window.event : event;
	if (vcc.ie && e.srcElement == "javascript:void(0);")
		return;	
	if (vcc.dl.blnSearchInProgress || !vcc.dl.blnEnableMapNavigation) return;
	vcc.dl.mapUpdateStarts();
	//Centers the map to mouse click point	
	
	var iMouseX = (e.offsetX) ? e.offsetX : e.layerX;
	var iMouseY = (e.offsetY) ? e.offsetY : e.layerY;
	//X - Longitude
	var iXPixelsRatio = iMouseX/vcc.dl.iMapPixelWidth;
	//We now have a ratio. If we apply this ratio to the width (in degrees) and add this
	//to the leftmost longitude of the map we should get a new horizontal center point in degrees
	var iNewCenterPointX = parseFloat(vcc.dl.Map.left) + parseFloat(vcc.dl.Map.width * iXPixelsRatio);
	//Y - Latitude
	//Since latitude degrees gets larger and larger when we move from the equator and up,
	//we have to invert the ratio for the Y axis
	var iYPixelsRatio = 1 - (iMouseY/vcc.dl.iMapPixelHeight);
	var iNewCenterPointY = parseFloat(vcc.dl.Map.height * iYPixelsRatio) + parseFloat(vcc.dl.Map.bottom);
	var strFilter = vcc.dl.GetFilterString();
	vcc.dl.Map.centerPoint.latitude = iNewCenterPointY;
	vcc.dl.Map.centerPoint.longitude = iNewCenterPointX;
	if (vcc.dl.iZoomLevel < 9) {
		vcc.dl.zoomMap(true);
	} else {
		vcc.dl.ajaxWrapper("GetMapAjax", [iNewCenterPointY + "", iNewCenterPointX + "", vcc.dl.Map.scale + "", vcc.dl.Map.radius + "", strFilter], vcc.dl.UpdateMap);
	}
}

vcc.dl.moveMap = function(blnN,blnS,blnE,blnW) {
	if (vcc.dl.blnSearchInProgress) return;
	vcc.dl.mapUpdateStarts();
	//When moving, move the centerpoint 25% of the width/height
	//Get new X - longitude - position
	var iNewCenterPointX;
	var iCurrentCenterPointX = vcc.dl.Map.centerPoint.longitude;
	if (blnE || blnW) {
		var iWidth = vcc.dl.Map.width * 0.25;		
		iNewCenterPointX = (blnE) ? iCurrentCenterPointX + iWidth : iCurrentCenterPointX - iWidth;
	} else {
		iNewCenterPointX = iCurrentCenterPointX;
	}
	//Get new Y - latitude - position
	var iNewCenterPointY
	var iCurrentCenterPointY = vcc.dl.Map.centerPoint.latitude;
	if (blnN || blnS) {
		var iHeight = vcc.dl.Map.height * 0.25;		
		iNewCenterPointY = (blnN) ? iCurrentCenterPointY + iHeight : iCurrentCenterPointY - iHeight;
	} else {
		iNewCenterPointY = iCurrentCenterPointY;
	}
	var strFilter = vcc.dl.GetFilterString();
	//Calling AJAX
	vcc.dl.ajaxWrapper("GetMapAjax", [iNewCenterPointY + "", iNewCenterPointX + "", vcc.dl.Map.scale + "", vcc.dl.Map.radius + "", strFilter], vcc.dl.UpdateMap);
}

vcc.dl.GetFilterString = function() {
	var strFilter = "VisibleInDealerLocator = 1 AND ";
	for (var i = 0; i < vcc.dl.arFilters.length; i++) {
		var objFilter = vcc.dl.arFilters[i];
		var objCheckBox = vcc.getObj(objFilter.id);
		if (objCheckBox && objCheckBox.checked) {
			strFilter += objFilter.name + " = 1 AND ";
		}		
	}
	strFilter = strFilter.slice(0,strFilter.length - 5);
	return strFilter;
}

vcc.dl.UpdateFilters = function() {
	if (vcc.dl.blnSearchInProgress) return false;
	vcc.dl.mapUpdateStarts();
	var strFilter = vcc.dl.GetFilterString();
	vcc.dl.ajaxWrapper("GetMapAjax", [vcc.dl.Map.centerPoint.latitude + "", vcc.dl.Map.centerPoint.longitude + "", vcc.dl.Map.scale + "", vcc.dl.Map.radius + "", strFilter], vcc.dl.UpdateMap);
}

vcc.dl.UpdateNoMap = function(strXml) {
	var objXml = vcc.createXmlObj(strXml, true, null, vcc.dl.strXmlNameSpaces);
	//Dealer list
	vcc.transformXml(objXml, "/_layouts/VolvoCars.Web.Sites/XSLT/DealerLocator/CreateDealerList.xslt", true, vcc.dl.updateDealerList, vcc.dl.objXsltParams);
	vcc.dl.mapUpdateEnds();
}

vcc.dl.UpdateMap = function(oAjaxXml) {
	var strXml = oAjaxXml.responseText;
	var objXml = vcc.createXmlObj(strXml, true, null, vcc.dl.strXmlNameSpaces);
	var blnError = (strXml.indexOf("<error ") != -1);	
	if (!blnError) {
		var iScale = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByScale/MapScale"));
		var iCenterLat = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByHeightWidth/CenterPoint/Latitude"));
		var iCenterLong = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByHeightWidth/CenterPoint/Longitude"));
		var iLeft = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByBoundingRectangle/BoundingRectangle/Southwest/Longitude"));
		var iBottom = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByBoundingRectangle/BoundingRectangle/Southwest/Latitude"));
		var iWidth = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByBoundingRectangle/BoundingRectangle/Northeast/Longitude")) - iLeft;
		var iHeight = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByBoundingRectangle/BoundingRectangle/Northeast/Latitude")) - iBottom;
		var iHeightInKm = parseFloat(vcc.dl.getXmlNodeValue(objXml,"CMap/Map/View/ByHeightWidth/Height"));
		vcc.dl.setMapProperties(iScale,iCenterLat,iCenterLong,iWidth,iHeight,iLeft,iBottom,iHeightInKm);
		vcc.dl.objNewMapImage = new Image();
		vcc.dl.objNewMapImage.onload = vcc.dl.swapMap;
		vcc.dl.objNewMapImage.src = vcc.dl.getXmlNodeValue(objXml,"CMap/Map/Url");		
	}
	//Dealer list
	vcc.transformXml(objXml, "/_layouts/VolvoCars.Web.Sites/XSLT/DealerLocator/CreateDealerList.xslt", true, vcc.dl.updateDealerList, vcc.dl.objXsltParams);
	//Image map
	vcc.transformXml(objXml, "/_layouts/VolvoCars.Web.Sites/XSLT/DealerLocator/CreateImageMap.xslt", true, vcc.dl.updateImageMap, {iMaxDealers: vcc.dl.iMaxDealers + 1});
	if (blnError) vcc.dl.mapUpdateEnds();
}

vcc.dl.updateImageMap = function(strHtml) {
	var re = new RegExp("<\/transformiix:result>");
	strHtml = strHtml.replace(re,"");
	var re = new RegExp("<transformiix:result xmlns:transformiix=\"http:\/\/www.mozilla.org\/TransforMiix\">");
	strHtml = strHtml.replace(re,"");
	var objImageMap = vcc.getObj("dealerMap");
	if (vcc.ie) {
		var objParentNode = objImageMap.parentNode;
		objImageMap.removeNode(true);
		var objNewMap = document.createElement("map");
		objNewMap.id = "dealerMap";
		objNewMap.name = "dealerMap";
		objParentNode.appendChild(objNewMap);
		objNewMap.innerHTML = strHtml;
	} else {
		objImageMap.innerHTML = strHtml;
	}
}

vcc.dl.updateDealerList = function(strHtml) {
	vcc.getObj("dealerlist").innerHTML = strHtml;
	vcc.dl.roundDistances();
}

vcc.dl.getXmlNodeValue = function(objRootNode, strXPath) {
	if (objRootNode == null) return null;
	var oNode = (!vcc.opera && !vcc.safari) ? objRootNode.selectSingleNode(strXPath) : vcc.dl.findChildNode(objRootNode, strXPath.split("/"));
	var strNodeValue = (oNode && oNode.firstChild) ? oNode.firstChild.nodeValue : null;
	return strNodeValue;
}

vcc.dl.findChildNode = function (objNode, arNodes, iIndex) {
	if (!iIndex) iIndex = 0;
	var oReturnNode = null;
	var arChildNodes = objNode.childNodes;
	for (var i = 0; i < arChildNodes.length; i++) {
		if (arChildNodes[i].tagName == arNodes[iIndex]) {
			if (iIndex == arNodes.length - 1) {	
		
				oReturnNode = arChildNodes[i];
			} else {
				oReturnNode = vcc.dl.findChildNode(arChildNodes[i],arNodes,iIndex + 1);
			}
		}
	}
	return oReturnNode;
}

vcc.dl.triggerHotSpot = function(iY,iX,objMapArea) {
	if (objMapArea) {
		var objHotSpot = vcc.getObj("hotspot");
		var arAddress = objMapArea.getAttribute("address").split("|");
		var strName = objMapArea.getAttribute("dname");
		var strPhone = objMapArea.getAttribute("phone");
		var objHotSpotDiv = objHotSpot.getElementsByTagName("div")[0];
		var strDealerInfo = "<strong>" + strName + "</strong>";
		for (var i = 0; i < arAddress.length; i++) {
			if (arAddress[i] != "") strDealerInfo += arAddress[i] + "<br />";
		}
		if (strPhone != "") strDealerInfo += vcc.dl.strLabelPhone2 + " " + strPhone + "<br />";
		objHotSpotDiv.innerHTML = strDealerInfo;
		vcc.moveTo(objHotSpot,iX + 49,iY + 17);
		vcc.setDisplay("hotspot","block");
	} else {
		vcc.setDisplay("hotspot","none");
	}
}

vcc.dl.showDrivingInstructionsForm = function(objLink,dblLat,dblLong) {
	vcc.dl.ActiveDealer.latitude = dblLat;
	vcc.dl.ActiveDealer.longitude = dblLong;
	var objDrivingForm = vcc.getObj("drivinginstructions");
	var iX = vcc.getX(objLink,true) - vcc.getX("search-results",true) + 20;
	var iY = vcc.getY(objLink,true) - vcc.getY("search-results",true);
	if (vcc.bIsRtl) {
		objDrivingForm.style.right = iX + "px";
	} else {
		objDrivingForm.style.left = iX + "px";
	}
	objDrivingForm.style.top = iY + "px";
	objDrivingForm.style.display = "block";
}

vcc.dl.getDirections = function() {
	var iDealerLat = vcc.dl.ActiveDealer.latitude;
	var iDealerLong = vcc.dl.ActiveDealer.longitude;	
	var strCity = vcc.getObj(strCityField).value;
	var strAddress = vcc.getObj(strAddressField).value;
	var strZipCode = vcc.getObj(strZipField).value;
	var objLoading = vcc.getObj("loadinginstructions");
	objLoading.className = "";
	objLoading.innerHTML = strLoading;
	objLoading.style.display = "block";
	vcc.dl.ajaxWrapper("GetDrivingDirectionsAjax", [strCity, strAddress, strZipCode, iDealerLat + "", iDealerLong + ""], vcc.dl.CreateDrivingDirectionsHtml);

}

vcc.dl.CreateDrivingDirectionsHtml = function(oAjaxXml) {
	var strXml = oAjaxXml.responseText;
	var objLoading = vcc.getObj("loadinginstructions");
	if (strXml.indexOf("<error") != -1) {
		objLoading.style.display = "block";
		objLoading.className = "error";
		objLoading.innerHTML = strNoHits;
		return;
	}
	objLoading.innerHTML = "";
	objLoading.style.display = "none";
	vcc.setDisplay("drivinginstructions","none");
	var objXml = vcc.createXmlObj(strXml, true, null, vcc.dl.strXmlNameSpaces);
	vcc.transformXml(objXml, "/_layouts/VolvoCars.Web.Sites/XSLT/DealerLocator/DrivingDirections.xslt", true, vcc.dl.CreateDrivingDirectionsPopup, vcc.dl.objXsltParamsDrivingDirections);
}

vcc.dl.CreateDrivingDirectionsPopup = function(strHtml) {
	var win = vcc.openWindow("/_layouts/VolvoCars.Web.Sites/empty.html","directions","width=670,height=780,scrollbars=yes,status=yes");
	var strOutput = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
	strOutput += strHtml;
	win.document.open();
	win.document.write(strOutput.replace(/&lt;b&gt;/g,"<strong>").replace(/&lt;\/b&gt;/g,"</strong>"));
	win.document.close();
	var objDiv = win.document.getElementById("directions");
}

vcc.dl.ajaxWrapper = function(strMethod, arMethodParams, oReceivingFunction) {
	vcc.callAjax("", "VolvoCars.Web.Sites.Classes.DealerLocatorWrapper", strMethod, arMethodParams, oReceivingFunction,[vcc.dl.strMarket, vcc.dl.blnDisplayRadiusInMiles + "", vcc.dl.strLanguage, vcc.bIsInProduction + "",vcc.dl.iMaxDealers],"en-US");
}

vcc.dl.roundDistances = function(elmLayer) {
	var arDistanceContainers = (elmLayer) ? vcc.getElementsByAttribute("class","distance",elmLayer,"span") : vcc.getElementsByAttribute("class","distance",null,"span");
	for (var i = 0; i < arDistanceContainers.length; i++) {
		var dblDistance = parseFloat(arDistanceContainers[i].innerHTML);
		dblDistance = dblDistance.toFixed(1);
		arDistanceContainers[i].innerHTML = dblDistance;
		arDistanceContainers[i].style.display = "inline";
	}
	
}

vcc.addEvent(window, "load", "vcc.dl.init");
