var objMapCtrl;
var IsMapLoaded=false;
var clkx, clky;

function SetMapConfiguration(){		
	//try	{  
		//read map object's CURRENT extent
		var currExtMinX = objMapCtrl.extMinX;
		var	currExtMinY	= objMapCtrl.extMinY;
		var	currExtMaxX	= objMapCtrl.extMaxX;
		var	currExtMaxY	= objMapCtrl.extMaxY;
		
		//read map object's FULL extent
		var fullExtMinX = objMapCtrl.fullminX;
		var	fullExtMinY	= objMapCtrl.fullminY;
		var	fullExtMaxX	= objMapCtrl.fullmaxX;
		var	fullExtMaxY	= objMapCtrl.fullmaxY;
		
		// calculate map centre
		var centrex = currExtMinX + ((currExtMaxX - currExtMinX) / 2);
		var centrey = currExtMinY + ((currExtMaxY - currExtMinY) / 2);	
		
		driveme.SetMapConfig(currExtMinX, currExtMinY, currExtMaxX, currExtMaxY, fullExtMinX, fullExtMinY, fullExtMaxX, fullExtMaxY, centrex, centrey, objMapCtrl.zoomLevel);
	//} 
	//catch (er){
		//window.alert("SetMapConfig Failed!" + er);
	//}		
}

function TestLoaded(){
	var ifrm = document.getElementById('frameMap');
	//alert("browser: " + navigator.appName + ", iFrame: " + ifrm + ", readystate: " + ifrm.readyState);
	if (ifrm.readyState){//IE
		if (ifrm.readyState == 'complete') //Map iFrame is now loaded
			ToggleSplash(false);
		else
			setTimeout('TestLoaded()', 2000); //wait another 2 sec. and try again
	} else { //Mozilla
		ToggleSplash(false);
	}  
}

function PurgeMemoryObjects(){
	
	try {
		//alert("unloading, about to clear MapComponent ->" + objMapCtrl + ", Autocomplete -> " + objAutoCompl + ", RouteBox: " + objRouteBox);
		objMapCtrl = null; 
		objAutoCompl = null;
		objRouteBox = null;
		//alert("unloading, done clearing MapComponent ->" + objMapCtrl + ", Autocomplete -> " + objAutoCompl + ", RouteBox: " + objRouteBox);
	} catch(er){}
}

function ToggleSplash(bShow){
	try {
		var hDiv = document.getElementById('divSplash');
		if (hDiv.style.display == 'none') return;
		hDiv.style.display = (bShow == true ? 'block' : 'none');
	} catch(er){
		//alert(er.Message);
	}
}
	
function OnLoadScript() {
	//ToggleSplash(false);
	try {
		objMapCtrl = parent.map.mapFrame;
		var timeout = 60000; //set map loading timeout
		objMapCtrl.timeoutToLoadMap = timeout;
		objMapCtrl.setCenterTargetVisible(true); //show/hide center marker
	}
	catch(e1) {
		setTimeout('OnLoadScript()', 2000);
	}
		
	//set map controls callback functions  
	try {		
		objMapCtrl.infoToolCallback = OnInfoToolEvent;				//infotool response
		objMapCtrl.previousExtentCallback = OnPrevExtEvent;			//previous map response
		objMapCtrl.panCallback = OnPanEvent;						//pan, up, down etc. response 
		objMapCtrl.zoomCallback = OnZoomEvent;						// zoom map response
		objMapCtrl.mapLoadedCallback = OnMapRedrawEvent;			//map reload response
		objMapCtrl.getImageWithPinCallback = OnImageWithPinEvent;	//get map image finished event 
				
		var tool = driveme.GetSelTool();
		if (tool.value != "")
			objMapCtrl.initialTool = tool.value;
		else
			objMapCtrl.initialTool = 'pan';
	}
	catch(e2) {
		//alert("OnLoadScript step 2 failed, cause: " + e2.Message);
	}
			
	//if selected point exists in initial loading 
	//e.g. as a result of a postback or call with GET parameters
	//update map and info box accordingly
	try {
		var res = driveme.GetSelPoint();
		if (res.value != ""){
			var ar = res.value.split("#");
			var coords = ar[0];
			var selpt = ar[1];
			//set address label
			var label = document.getElementById("txtInfoAddrLabel");
			label.innerHTML = selpt;
			
			//update map
			var ar2 = coords.split(",");
			var sx = ar2[0];
			var sy = ar2[1];
			var x = parseFloat(sx);
			var y = parseFloat(sy);
			objMapCtrl.setAddressPoint(x,y);
		}
	}
	catch(e3) {
		//alert("OnLoadScript step 3 failed, cause: " + e3.Message);
	}
	
	//setTimeout("ToggleSplash(false)", 10000);
}	

function OnInfoToolEvent(x, y, pixelX , pixelY){
	try {		
		//ShowStatusMsg("txtInfoAddrLabel", unescape(escape("Εύρεση - Παρακαλώ Περιμένετε...")));
		ShowStatusMsg("txtInfoAddrLabel", driveme.GetResource("driveme_js_msg_find_wait").value);
		
		//infotool has being clicked - speed up response by stoping prev load operation
		if (objMapCtrl.loadingMap == true)
			objMapCtrl.resetMapLoading();
			
		clkx = x;
		clky = y;
		
		//let the server side know that the info tool was selected
		driveme.SetInfoTool();
		
		//determine NearestFeature radius and get result from server
		var rd = GetRadius(pixelX, pixelY);
		driveme.GetPointInfo(x, y, rd, GetPointInfo_Callback);
		
	} catch(ex){
		//AJAXObj.WriteScriptError("Function: OnInfoToolEvent, Error:"  + ex.value);
		alert(ex.Message);
	}
}

function GetPointInfo_Callback(res){	
	ShowStatusMsg("txtInfoAddrLabel", "");
	
	if (res.value){
		var ar = res.value.split("#");
		var labeltext = ar[0];
		var labelinfo = ar[1];
				
		//update Selected Point table with reverse geocoded address
		var infolabel = document.getElementById("txtInfoAddrLabel");
		infolabel.innerHTML = labeltext;
		
		if (labelinfo != "" && objMapCtrl.zoomLevel < 7){ //no point displaying the bubble over zoom 6
			SetInfoBubble(labelinfo);
		} else {
			objMapCtrl.setAddressPoint(clkx,clky);
		}
		
		//now erase nearest POIs div as selected point has moved
		document.getElementById("divNearest").innerHTML = "";
	}
}

function OnDriveMeMap(){
	try {
		//ShowStatusMsg("txtInfoAddrLabel", unescape(escape("Εύρεση - Παρακαλώ Περιμένετε...")));
		ShowStatusMsg("txtInfoAddrLabel", driveme.GetResource("driveme_js_msg_find_wait").value);
		
		//driveme button pressed - speed up response by stoping prev load operation
		if (objMapCtrl.loadingMap == true)
			objMapCtrl.resetMapLoading();
			
		//setTimeout(OnDriveMeMap_Callback, 1000);
		var res = driveme.GetMapCoords();
		var coords = res.value;
		var ar = coords.split(",");
		var x=parseFloat(ar[0]);
		var y=parseFloat(ar[1]);
		clkx = x;
		clky = y;
		objMapCtrl.moveMapTo(x, y, 2);
		
		driveme.GetPointInfo(x, y, 10, GetPointInfo_Callback);		
	} catch (ex){
		setTimeout('OnDriveMeMap()', 1000);
	}
}

//previous map callback function
function OnPrevExtEvent(){ 
	try {
		
		var res = driveme.SetPrevMapTool();
	} catch(ex){
		//driveme.WriteScriptError("Function: SetPrevMapTool, Error:"  + ex.value);
	}
}; 

//pan, up, down etc. callback function 
function OnPanEvent(panType){
	try {
		driveme.SetPanTool(panType);
	} catch(ex){
		//driveme.WriteScriptError("Function: OnPanEvent, Error:"  + ex.value);
	}
}; 

// zoom map callback function 
function OnZoomEvent(zoomTool){
	try {
		driveme.SetZoomTool(zoomTool);
	} catch(ex){
		//driveme.WriteScriptError("Function: OnZoomEvent, Error:"  + ex.value);
	}
} 

//map load/reload callback function 
function OnMapRedrawEvent (minx, miny, maxx, maxy){
	try {
		SetMapConfiguration();
		//update server with new map extents etc.
		if (!IsMapLoaded){ //used only on first-time load/reload to lock controls until the map has fully loaded
			IsMapLoaded = true;
						
			var res = driveme.GetRouteParams(); //draw route if requested in GET params
			if (res.value.length != 0){
				var arr = res.value.split("#");
				var startpnt = arr[0].split(",");
				var endpnt = arr[1].split(",")
						
				objRouteBox.SetSearchAddress(arr[0], true);
				objRouteBox.SetSearchAddress(arr[1], false);
				ShowTab(false);	
				
				if (res.value != "")
					DoInitRoute(false);
			}
		}
			
	} catch(ex){
		//driveme.WriteScriptError("Function: OnMapRedrawEvent, Error:"  + ex.value);
	} finally {
		TestLoaded();
		//ToggleSplash(false);
	}
}

//handles onclick for clicable POIs in resulting from NearestFeatures call
function DoClickPOI(poiid){
		try {
			//objMapCtrl =parent.map.mapFrame;
			var poi = document.getElementById(poiid);
				
			//parse POI coordinates and set info point on map
			var coords = poi.lang;
			var ar = coords.split(",");
			var sx = ar[0];
			var sy = ar[1];
			
			//now set POI as selected point
			var poitxt = poi.innerHTML.split(",");	
			///NOTE: **** innerText not used as is not supported by Mozilla, Netscape etc. *****
			
			var res = driveme.GetPointInfo(sx, sy, 10);
			var x = parseFloat(sx);
			var y = parseFloat(sy);
			var ar = res.value.split("#");
			var labelinfo = ar[1];
			if (labelinfo != ""){
				SetInfoBubble(labelinfo);
			} else {
				objMapCtrl.setAddressPoint(x,y);
			}
					
			//check whether point is currently outside current extents due to zoom-in, pan etc.
			if (x<objMapCtrl.extMinX || 
				x>objMapCtrl.extMaxX ||	
				y<objMapCtrl.extMinY ||	
				y>objMapCtrl.extMaxY){
				//alert(objMapCtrl.zoomLevel);
				objMapCtrl.moveMapTo(x, y,Math.round(objMapCtrl.zoomLevel)); //move to that point
			}		
		} catch(ex){
			alert(ex.message);
		}
		
}

function DoFindNearest(){
	try {
		//ShowStatusMsg("divNearest", unescape(escape("Εύρεση - Παρακαλώ Περιμένετε...")));
		ShowStatusMsg("divNearest", driveme.GetResource("driveme_js_msg_find_wait").value);
				
		//setTimeout(DoFindNearest_Callback, 1000);
		driveme.GetNearestPoints(DoFindNearest_Callback);	
	} catch (ex){
		setTimeout('DoFindNearest()', 1000);
	}
}

function DoFindNearest_Callback(res){
	try {
		ShowStatusMsg("divNearest", "");
		if (res.value)
			document.getElementById("divNearest").innerHTML = res.value; 
	} catch(ex){
		//driveme.WriteScriptError("Function: DoShowNearest, Error:"  + ex.value);
	}	
	
}


function OnLayersChanged(){
	var poilabel = document.getElementById("divNearest");
	
	//recalculate POIs table with new layer mask
	var res = driveme.GetNearestPoints();
	if (res != "")
		poilabel.innerHTML = res.value; 
	poilabel.innerHTML = res.value; 
	//redraw map
	objMapCtrl.reloadMap(objMapCtrl.extMinX, objMapCtrl.extMinY, objMapCtrl.extMaxX, objMapCtrl.extMaxY);	
}


function parseLinkData(obj, chrDlm, chrNewDlm){
	var res = "";
	//if different delimiter is required for resulting string use it
	var dlm = ((chrNewDlm != '') ? chrNewDlm : chrDlm);
	try {
		var arr = obj.split(chrDlm); //split using given delimiter i.e. ',' / '#' etc.
		//start from third elements as first two are always X,Y
		for (var i=2; i<arr.length; i++)
			if (res == "")
				res = arr[i];
			else
				res += dlm + arr[i];
	} catch (ex){
	}
	return res;
}

function GetMapURL(chrAnd, bWantRouteLink){
	var resUrl='';
	var mapUrl ='';
	var routeUrl='';
	var poiMask='';
	
	try {
		//read-only variables for map's CURRENT extent
		var currExtMinX = objMapCtrl.extMinX;
		var	currExtMinY	= objMapCtrl.extMinY;
		var	currExtMaxX	= objMapCtrl.extMaxX;
		var	currExtMaxY	= objMapCtrl.extMaxY;
		var cx = currExtMinX + ((currExtMaxX - currExtMinX) / 2);
		var cy = currExtMinY + ((currExtMaxY - currExtMinY) / 2);
								
		//set current map centre as link map centre
		mapUrl += chrAnd + "initialCenterX=" + cx + chrAnd + "initialCenterY=" + cy;
		//set current map zoom as link map zoom
		mapUrl += chrAnd + "initialZoomLevel=" + parseInt(Math.round(objMapCtrl.zoomLevel));	
	} catch (ex){
		//window.alert("GetMapURL Failed!, cause" + ex.message);	
	}
	
	try {//add POI mask in both cases (map - route)
		var res = driveme.GetPOIMask(true);
		if (res.value)
			poiMask = chrAnd + "initialLayersMask=" + res.value;
	} catch (ex){
		//window.alert("GetMapURL Failed!, cause" + ex.message);	
	}
	
	if (bWantRouteLink == true){
		routeUrl = GetRouteURL(chrAnd);
		resUrl = (routeUrl!='' ? routeUrl : mapUrl);
	} else {
		resUrl = mapUrl;
	}
	
	resUrl += poiMask; //add POIs
	return resUrl;
}

function GetRouteURL(chrAnd){
	var routeurl='';
	try {
		if (TabVisible(false) == true){ //if Route Tab is visible add routing parameters
			var res = driveme.GetRouteParams(); 
			if (res.value){
				var arr = res.value.split("#");
				var start = arr[0].split(",");
				var startaddr = parseLinkData(arr[0], ',', ' '); //get server-stored fixed address
				if (startaddr == "")
					startaddr = objRouteBox.GetFixedAddr(true, ',', '');
				
				var end = arr[1].split(",");
				var endaddr = parseLinkData(arr[1], ',', ' ');
				if (endaddr == "")
					endaddr   = objRouteBox.GetFixedAddr(false, ',', '');
					
				//set current map centre as link map centre
				routeurl = chrAnd + "startx=" + start[0] + chrAnd + "starty=" + start[1];
				routeurl += chrAnd + "startaddr=" + escape(startaddr);
				routeurl += chrAnd + "endx=" + end[0] + chrAnd + "endy=" + end[1];
				routeurl += chrAnd + "endaddr=" + escape(endaddr);
				var options = arr[2].split(",");
				routeurl += chrAnd + "type=" + options[0];
				routeurl += chrAnd + "avoid=" + options[1];
			}
		}
	} catch (ex2){ //if anythong goes wrong do not add any routing params
		routeurl='';
	}
	return routeurl;
}

function DoPrint(){
		try {
			objMapCtrl.getImageWithPin();
		} 
		catch (er){
		}
}	

function OnImageWithPinEvent(imagePath){
	if (imagePath != null){
		var res = driveme.GetPrintURL(imagePath);
		if (res.value && res.value != '#'){
			var printURL = res.value;
			printURL += GetMapURL('&', false);
			var lang = "&lang=" + driveme.GetCulture().value;
			printURL += lang;
			window.open(printURL, "DrivemePrint", 'width=600,height=600, directories=no,location=no,menubar=no,scrollbars=yes,status=yes,toolbar=no,resizable=yes');			
		}
	}
}

function DoMail(){
	try	{  
		//set correct portal channel id					
		var cid = driveme.GetChannelID();
		var mailURL = "drivemeSend.aspx?c=" + cid.value + "&mapurl=";
		mailURL += GetMapURL('_', true);
		var lang = "&lang=" + driveme.GetCulture().value;
		mailURL += lang;
		window.open(mailURL, 'Email', 'width=600,height=350,directories=no,location=no,menubar=no,scrollbars=no,status=yes,toolbar=no,resizable=yes');
	} 
	catch (er){
		//window.alert("DoMail Failed!, cause: " + er.message);
	}			
}	

function DoLink(){
	try	{  
		var linkURL = "drivemeLink.aspx?c=";
		//set correct portal channel id	
		var cid = driveme.GetChannelID();				
		linkURL += cid.value;
		linkURL += GetMapURL('&', true);
		var lang = "&lang=" + driveme.GetCulture().value;
		linkURL += lang;
		window.open(linkURL, 'DrivemeLink', 'width=600,height=500,directories=no,location=no,menubar=no,scrollbars=no,status=yes,toolbar=no,resizable=no');
	} 
	catch (er){
		//window.alert("DoLink Failed!, cause: " + er.message);
	}	
}


function DoHelp(){
	try	{  
		var helpURL = "../html/DrivemeHelp/" + driveme.GetCulture().value + "/drivemeHelpIndex.htm";
		window.open(helpURL, 'DrivemeHelp', 'directories=no,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes');
	} 
	catch (er){
		//window.alert("DoLink Failed!, cause: " + er.message);
	}	
	
}

function DoSymbols(){
	var symbolsURL = "drivemeSymbols.aspx?c=" + driveme.GetChannelID().value;
	window.open(symbolsURL, 'DrivemeLegend', 'width=600,height=500,directories=no,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes');
}

function GetRadius(pixX, pixY){  
	//determine radius for NearestFeatures
	var pixRadius = 13;
	var extent = objMapCtrl.pixelToRealExtent(pixX, pixY, pixRadius);
	var eminx = extent[0];
	var eminy = extent[1];
	var emaxx = extent[2];
	var emaxy = extent[3];
	var rx = (emaxx - eminx) / 2;
	var ry = (emaxy - eminy) / 2;
	var radius;
	if ( rx > ry )
		radius = Math.round(rx) + ""; //convert to string
	else
		radius = Math.round(ry) + "";
		
	return radius;
}

function getElement(element){
	if (document.getElementById){ // this is the way the standards work
		return document.getElementById(element);
	}
	else 
		if (document.all) // this is the way old msie versions work
		{
			
			return document.all[element];
		}
		else 
			if (document.layers) // this is the way nn4 works
			{
			
			return document.layers[element];
		}
}

function SetInfoBubble(info){
	var infodata = info.split(",");
	//now parse 2nd part of the response and set info bubble on map with its data
	//var infolabel = "<table id='tblBubbleInfo' border='0' width='100px' align='left' style='FONT-SIZE: 9px; COLOR: #004a84; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica; BACKGROUND-COLOR: #eff4f9'>";
	//	infolabel += "<tr><td><strong>" + infodata[2] + "</strong>";
	//	infolabel += " <a href=\"javascript:closeInfo();\"><img src='/_images/tools/button_x.gif' border='0'></a><br>" 
	
	var res = driveme.GetBubble(info);
	//infolabel += res.value + "</table>";
			
	if (res.value){
		var infolabel = res.value;
		//NOTE: this is added to force the marker to snap to a POI if a POI intersects our x,y
		//thus preventing the marker from getting positioned far from the POI in lower zoom levels  
		objMapCtrl.setAddressPoint(parseFloat(infodata[0]),parseFloat(infodata[1]), infolabel);
	}
}

function OnAddRoutePt(pntid, bMod){
	try {
		var obj = document.getElementById(pntid);
		//alert("Adding point from: " + pntid + " obj: " + obj + " data:\n" + obj.lang);
		objRouteBox.SetSearchAddress(obj.lang, bMod);
		ShowTab(false);
	} catch (er){
	}
}

function SetMapCand(){
	drivemeSearchBox.displayAddress(displayAddress_CallBack);
	OnDriveMeMap();
}

function ShowTab(bMapBox){
	try {
		var tabRoute = document.getElementById(RouteCtrlDivID);
		var tabMap = document.getElementById(MapCtrlDivID);
		var divDirCtrl =  document.getElementById(DirCtrlDivID);
		
		
		if (bMapBox && tabMap.style.display=="none"){
			if (objAutoCompl != null) delete objAutoCompl;
			objAutoCompl = new DrivemeAutocomplete(); //re-build autocomplete object
			objAutoCompl.InitAutocomplete();
			
			tabMap.style.display="block";				//show Map search box
			tabRoute.style.display="none";				//hide Route search box 
			divDirCtrl.style.display="none";			//hide Directions box
			var rgnid = getRegion(); 
			objAutoCompl.SetRegion(rgnid);
		} else {
			if (tabRoute.style.display=="none"){ //avoid uneccesary rebuilding of Autocomplete object as it is costly
				if (objAutoCompl != null) delete objAutoCompl;
				objAutoCompl = new DrivemeAutocomplete(); //re-build autocomplete object
				objAutoCompl.InitAutocomplete();
			
				tabMap.style.display="none";				//hide Map search box
				tabRoute.style.display="block";				//show Route search box 
				divDirCtrl.style.display="block";			//show Directions box
				onRtAutoComplStart(objRouteBox.CurrFocus);//enable autocomplete for Route Search Box
			}
		}
	} 
	catch (er){
		//window.alert("ShowTab Failed, cause:" + er);
	}	
}

function TabVisible(bMapBox){
	var bVisible = false;
	try {
		var divid = ((bMapBox) ? MapCtrlDivID : RouteCtrlDivID);
		var divobj = document.getElementById(divid);
		if (divobj.style.display == "none" || divobj.style.display == "")
			bVisible = false;
		else
			bVisible = true;
	} 
	catch (er){
		alert("TabVisible failed, cause:" + er);
	}	
	return bVisible;
}

function ShowStatusMsg(divContainer, sMsg){
	try {
		if (sMsg!=''){ //show status message 
			document.getElementById(divContainer).innerHTML = sMsg + "<br><img src='/_images/tools/loading.gif' width='94' height='9' vspace='5'>"; 
			document.body.style.cursor = "wait";
		} else { //erase status message & restore cursor
			document.getElementById(divContainer).innerHTML = "";	
			document.body.style.cursor = "default";	
		}
	} catch(er){}
}

function toggleElement(id){
		var div = document.getElementById(id);
		if (div.style.display == "block" || div.style.display == "")
			div.style.display="none";
		else 
			div.style.display="block";
			
}	

function swapSymbol(objid){
	try {
		var d = document.getElementById(objid);
		if (d.name == "show"){
			d.name = "hide";
			d.src = "/_images/tools/showLess.gif";
		} else {
			d.name = "show";
			d.src = "/_images/tools/showMore.gif";
		}
		//explicitly tell browser to display symbol as older versions of IE
		//do not automatically show the image after its source has changed 
		//d.style.display = 'block';
	} catch(ex) {
			alert(ex.Message);
	}
}


