var mdvMap = null;
var mdvTooltipMapping={};
var serverPath = 'http://www2.vvs.de/vvs/';
var efaURLLite = 'http://www.vvs.de/ajax/lite/';
var efaURLDM = 'http://www.vvs.de/ajax/dm/';
var efaURLImg= 'http://www.vvs.de';

// path to the images
var imgPath = 'http://www.vvs.de/fileadmin/templates/main/images/mdvMap';
var mapCentre = new Array;
var efaSessionID= '0';
var typeChngd = 0;
var savePathId = null;
var saveElProfId = null;
var savePOIs = null;
var profileImgWidth= null;
var profileImgLength = null;
var dragger= 1;
var polyColor = "#05459f";
var globZoom = false;

function onLoadHandler(type) {

   // destroy the old map
    if(type && $(document.body).getElements('div[class=MDVMapControl]'))
    {
        onUnLoadHandler();
    }
   
    mdvMap = new MDVMap(document.getElementById('mdvMap'));
    
    // correct the map control alt texts
    var controlText = new Array();
    controlText['goNorth'] = 'Norden';
    controlText['goWest'] = 'Westen';
    controlText['goEast'] = 'Osten';
    controlText['goSouth'] = 'Süden';
    controlText['lastResult'] = 'Letztes Ergebnis';
    controlText['zoomIn'] = 'Vergrößern';
    controlText['zoomOut'] = 'Verkleinern';
    
    if(type=='aerial'){
        $('mdvMapOverlay').style.display='';
        var overlay = mdvMap.createOverlay('captions', 'http://map.vvs.de/maps/VVS/Luftbilder/Text/');        
        overlay.setFileType('.png');
        mdvMap.addOverlay(overlay); 
    }
    else{
        $('mdvMapOverlay').style.display='none';
    }
        
    // get the config params
    initMdvMapConfig(type);

    /* get stops and pois */
    new MDVMapEFAInfoEx(mdvMap);
    new MDVMapControl(mdvMap, controlText);
    
    // load the right map config
    if(type=='aerial'){
        mdvMap.execute(mdvSatelliteMapConfig);    
    }
    else if(type=='city'){
        mdvMap.execute(mdvCityMapConfig);        
    }
    else{
        mdvMap.execute(mdvMapConfig);    
    }
    
    new MDVRectZoom(mdvMap);
    new MDVMapNavigator(mdvMap);
    
    /* tooltip for stops and pois */
    mdvMap.events.registerEvent(MDVEvent_TOOLTIP, this, onToolTip);
    mdvMap.events.registerEvent(MDVEvent_CENTRE_CHANGED, this, storeMapCentreAndZoomlevel);
    

    if(typeChngd==1){
    
        // cycle path 
        if(savePathId){
            displayNetPath(savePathId);
        }
        // elevation profile
        if(saveElProfId){
            displayElevationProfile(saveElProfId);
        }
        /* display Map-POIs */
        if(savePOIs){
            displayPOIs(savePOIs);
        }
        
        if(mapCentre){
            mapCentre.update = true;
            mdvMap.setCentre(new MDVCoordinates(mapCentre.mapName,mapCentre.x,mapCentre.y));    
            
            if(mdvMap.config.zoomLevels.length <= parseInt(mapCentre.zoomLevel)){
                mapCentre.zoomLevel = mdvMap.config.zoomLevels.length -1;
            }
            
            mdvMap.setZoomLevel(parseInt(mapCentre.zoomLevel));        
            mapCentre.update = false;
            mdvMap.update();
            
        }
    }
}

	
// This function destroys the map and clears the cache.	
function onUnLoadHandler() {

	$(document.body).getElements('div[class=MDVMapControl]').dispose();
	$(document.body).getElements('div[class=mapContextMenu]').dispose();
	$(document.body).getElements('div[id=divScale]').dispose();
	
 	$(document.body).getElements('div[id=mdvMap_mdvMap_mapper0_mapTiles]').dispose();
	$(document.body).getElements('div[id=mdvMap_mdvMarkers]').dispose();
	$(document.body).getElements('div[id=mdvMap_mapper0]').dispose();
	$(document.body).getElements('div[id=mdvMap_mapper1]').dispose(); 

	if(mdvMap) mdvMap.destroy();
	
}

// ==================================================================
// Map configuartion
// ==================================================================
function initMdvMapConfig(type){

	if(type=='aerial'){
		initMdvAerialMapConfig();
	}
	else if(type=='city'){
		initCityMapConfig();
	}
	else{ 
		initMdvMapConfigNavteq();
	}
};

// map configuration for navteq map
function initMdvMapConfigNavteq() {
	// map configuration
	mdvMapConfig.add('serverURL', 'http://map.vvs.de/maps/VVS/Map/tiles/');
	mdvMapConfig.add('efaURL', efaURLLite + 'XSLT_COORD_REQUEST');
	mdvMapConfig.add('transparentImg', serverPath + 'images/mdvMap/transparent.gif');
	mdvMapConfig.add('network', 'vvs');
	mdvMapConfig.add('defaultScale', 2);
	mdvMapConfig.add('xCenterReal', 3513400);
	mdvMapConfig.add('yCenterReal', 754800);
	mdvMapConfig.add('mapName', 'NBWT');
	mdvMapConfig.add('zoomOnDoubleClick', 'true');
	mdvMapConfig.add('useMagnifyGlass', 'true');
	mdvMapConfig.add('cursorMove', serverPath + 'images/mdvMap/grabbing.cur');
	mdvMapConfig.add('block', '100');
	mdvMapConfig.add('language', 'de');
	mdvMapConfig.add('imagePath', serverPath + 'images/mdvMap/');
	mdvMapConfig.add('poiArea', 'true');
	mdvMapConfig.add('poiPoint', 'false');
	mdvMapConfig.add('toolTimeOut', '20');
	mdvMapConfig.add('useBubbleForEFAInfo', 'true');
	mdvMapConfig.add('useBubblePinForEFAInfo', 'true');
	mdvMapConfig.add('info.stop.size.width', '270');
	mdvMapConfig.add('info.stop.size.height', '150');
	mdvMapConfig.add('info.poi.size.width', '270');
	mdvMapConfig.add('info.poi.size.height', '100');
	mdvMapConfig.add('hotspotOnMouseWheel', 'true');
	//new navigator !!!!!
	mdvMapConfig.add('imagePath.mapControl', serverPath + 'images/mdvMap/MDVMapControlOS/');
	mdvMapConfig.add('path.polyline.color', polyColor);
	mdvMapConfig.add('path.polyline.weight', '2');
	mdvMapConfig.add('path.polyline.opacity', '0.8');
};

// map configuration for city map
function initCityMapConfig(){

	mdvCityMapConfig.add('serverURL', 'http://map.vvs.de/maps/VVS/Stadtkarte/tiles/');
	mdvCityMapConfig.add('efaURL', efaURLLite + 'XSLT_COORD_REQUEST');
	mdvCityMapConfig.add('transparentImg', serverPath + 'images/mdvMap/transparent.gif');
	mdvCityMapConfig.add('network', 'vvs');
	mdvCityMapConfig.add('defaultScale', 2);
	mdvCityMapConfig.add('xCenterReal', 3513400);
	mdvCityMapConfig.add('yCenterReal', 754800);
	mdvCityMapConfig.add('mapName', 'NBWT');
	mdvCityMapConfig.add('zoomOnDoubleClick', 'true');
	mdvCityMapConfig.add('useMagnifyGlass', 'true');
	mdvCityMapConfig.add('cursorMove', serverPath + 'images/mdvMap/grabbing.cur');
	mdvCityMapConfig.add('block', '100');
	mdvCityMapConfig.add('language', 'de');
	mdvCityMapConfig.add('imagePath', serverPath + 'images/mdvMap/');
	mdvCityMapConfig.add('poiArea', 'true');
	mdvCityMapConfig.add('poiPoint', 'false');
	mdvCityMapConfig.add('toolTimeOut', '20');
	mdvCityMapConfig.add('useBubbleForEFAInfo', 'true');
	mdvCityMapConfig.add('useBubblePinForEFAInfo', 'true');
	mdvCityMapConfig.add('info.stop.size.width', '270');
	mdvCityMapConfig.add('info.stop.size.height', '150');
	mdvCityMapConfig.add('info.poi.size.width', '270');
	mdvCityMapConfig.add('info.poi.size.height', '100');
	mdvCityMapConfig.add('hotspotOnMouseWheel', 'true');
	//new navigator !!!!!
	mdvCityMapConfig.add('imagePath.mapControl', serverPath + 'images/mdvMap/MDVMapControlOS/');
	mdvCityMapConfig.add('path.polyline.color', polyColor);
	mdvCityMapConfig.add('path.polyline.weight', '2');
	mdvCityMapConfig.add('path.polyline.opacity', '0.8');
};

// map configuration for aerial map
function initMdvAerialMapConfig() {

	mdvSatelliteMapConfig.add('serverURL', 'http://map.vvs.de/maps/VVS/Luftbilder/Bild/');
	mdvSatelliteMapConfig.add('efaURL', efaURLLite + 'XSLT_COORD_REQUEST');
	mdvSatelliteMapConfig.add('fileType', '.jpg');
	mdvSatelliteMapConfig.add('transparentImg', serverPath + 'images/mdvMap/transparent.gif');
	mdvSatelliteMapConfig.add('network', 'vvs');
	mdvSatelliteMapConfig.add('defaultScale', 2);
	mdvSatelliteMapConfig.add('xCenterReal', 3513400);
	mdvSatelliteMapConfig.add('yCenterReal', 754800);
	mdvSatelliteMapConfig.add('mapName', 'NBWT');
	mdvSatelliteMapConfig.add('zoomOnDoubleClick', 'true');
	mdvSatelliteMapConfig.add('useMagnifyGlass', 'false');
	mdvSatelliteMapConfig.add('cursorMove', serverPath + 'images/mdvMap/grabbing.cur');
	mdvSatelliteMapConfig.add('block', '100');
	mdvSatelliteMapConfig.add('language', 'de');
	mdvSatelliteMapConfig.add('imagePath', serverPath + 'images/mdvMap/');
	mdvSatelliteMapConfig.add('poiArea', 'true');
	mdvSatelliteMapConfig.add('poiPoint', 'false');
	mdvSatelliteMapConfig.add('toolTimeOut', '20');
	mdvSatelliteMapConfig.add('useBubbleForEFAInfo', 'true');
	mdvSatelliteMapConfig.add('useBubblePinForEFAInfo', 'true');
	mdvSatelliteMapConfig.add('info.stop.size.width', '270');
	mdvSatelliteMapConfig.add('info.stop.size.height', '150');
	mdvSatelliteMapConfig.add('info.poi.size.width', '270');
	mdvSatelliteMapConfig.add('info.poi.size.height', '100');
	mdvSatelliteMapConfig.add('hotspotOnMouseWheel', 'true');
	//new navigator !!!!!
	mdvSatelliteMapConfig.add('imagePath.mapControl', serverPath + 'images/mdvMap/MDVMapControlOS/');
	mdvSatelliteMapConfig.add('path.polyline.color', polyColor);
	mdvSatelliteMapConfig.add('path.polyline.weight', '2');
	mdvSatelliteMapConfig.add('path.polyline.opacity', '0.8');
};
	
// store map centre and zoomlevel
function storeMapCentreAndZoomlevel() {

	if(mapCentre.update!=true){
		mapCentre = mdvMap.getCentre();
		mapCentre.zoomLevel = mdvMap.config.currentZoomLevelIndex;
	}
};


//Define the content of the tooltip
/* deprecated 
function onToolTip(id, msg, obj){
	
	// STOPS with Departure Monitor
	if (obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='stop') {
		obj.setInnerHTML('Haltestelle: <b>'
			+ obj.getParent().objectId.desc
			+ '</b><br><br><div class="dmDiv" id="div_'
			+ obj.getParent().objectId.id
			+ '">'
			+ 'Bitte warten....'
			+'</div>'); 

		obj.dm = new MDVEFADepartureMonitor(obj.parentMarker.objectId.id, efaURLDM + 'XML_DM_REQUEST.php');
		obj.dm.getDepartures(obj.getParent().objectId.id);
	} 
	
	// POIS with Links and Address
	if (obj.getParent().objectId && obj.getParent().objectId.type && obj.getParent().objectId.type.toLowerCase()=='poi_area' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi_point' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi') {
	
		var link ='';

		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];

			if (a.name == 'POI_LINK') { 		
				link = link + '<a href="' + a.value.substring(a.value.indexOf('$') +1) 
					   + '" target="_blank">' 
					   + a.value.substring(0, a.value.indexOf('$')) + '</a><br/>';
			}
		} 
		
		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];

			if (a.name == 'POI_ADDRESS') {
				link += 'Adresse: ' + a.value;
			}							
		}	
		
		obj.setInnerHTML('<b>'
			+ obj.getParent().objectId.desc
			+ '</b><br/>'
			+ link
			+''); 
	} 
}
*/

//Define the content of the tooltip
/* for testing
function onToolTip(id, msg, obj){
	var link = "";
	var name = "";
	var size;
	// STOPS with Departure Monitor
	if (obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='stop') {
		obj.setInnerHTML('Haltestelle: <b>'
			+ obj.getParent().objectId.desc
			+ '</b><br><br><div class="dmDiv" id="div_'
			+ obj.getParent().objectId.id
			+ '">'
			+ 'Bitte warten....'
			+'</div>'); 

		obj.dm = new MDVEFADepartureMonitor(obj.parentMarker.objectId.id, efaURLDM + 'XML_DM_REQUEST');
		obj.dm.getDepartures(obj.getParent().objectId.id);
	} 
	
	// mapped POIs
	if (obj.getParent().objectId && obj.getParent().objectId.id && obj.getParent().objectId.type && obj.getParent().objectId.type === 'coord' ) {
		if (mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')] && mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].name != '') {
			// link
			if(mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].link) {
				link = mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].link;
				if(link !== '') {
					link = '<a href="' + link + '">' + link + '</a>';
				};
			}
			// tooltip size
			if(mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].width || mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].height) { 
				size = obj.getSize();
				if (mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].width && mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].height) {
					size = new MDVPoint(mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].width, mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].height);
				}
				else if (mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].width) {
					size = new MDVPoint(mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].width, size.y);
				}
				else {
					size = new MDVPoint(size.x, mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].height);
				}
				obj.container.setSize(size);
				//obj.container.update();
				obj.container.updateBubble();
			}
			// tooltip content
			obj.setInnerHTML(mdvTooltipMapping[obj.getParent().objectId.id.replace(':NBWT','')].name
				+ '<br/>'
				+ link ); 
		}
	}
	// POIS with Links and Address
	else if (obj.getParent().objectId && obj.getParent().objectId.type && obj.getParent().objectId.type.toLowerCase()=='poi_area' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi_point' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi') {
	
		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];
			if (a.name == 'POI_LINK') { 		
				link = link + '<a href="' + a.value.substring(a.value.indexOf('$') +1) 
					   + '" target="_blank">' 
					   + a.value.substring(0, a.value.indexOf('$')) + '</a><br/>';
			}
		} 
		
		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];

			if (a.name == 'POI_ADDRESS') {
				link += 'Adresse: ' + a.value;
			}							
		}	
		
		obj.setInnerHTML('<b>'
			+ obj.getParent().objectId.desc
			+ '</b><br/>'
			+ link
			+''); 
	} 
}
*/

// send request to get the pois
function displayPOIs(obj){

	if(!savePOIs)
	{
		savePOIs = obj;
	}

	var URL = efaURLLite + 'XSLT_COORD_REQUEST?';
	var _params = { 
		coordReqType : 'ADDPOI',
		coordListOutputFormat: 'STRING'
	};
	
	_params = $H(_params);
	_params = _params.toQueryString();
	
	for(var i =0; i < obj.length; i++){
		_params += '&poiElem='+ obj[i];
	} 
	
	var _ajax = new Request({ url: URL, method: 'post', data: _params, onComplete: onCoordRequestCallback}).send();
	
};
	
//display the pois on the map
/*
function onCoordRequestCallback(request){

	if(!request){
		return false;
	}
	else{
		json = request;
	}
	
	eval('efa = ' + json + ';'); 
	
	var i = 0;
	var p = efa.coordInfo.pins[i] || efa.coordInfo.pins.pin;	
	var imageId =1;
		
	//path to the poi marker image  
	var img = imgPath  + '/marker_poi' + imageId  +'.gif';
	
	var coords = new Array();
	coords['x'] =  new Array();
	coords['y'] =  new Array();
		
	while (p) {
	
		img = imgPath + '/marker_poi' + imageId  +'.gif';

		var coordList = p.coords.split(',');
		var name = p.desc;
		nc = new MDVCoordinates('NBWT', coordList[0], coordList[1]);

		coords['x'].push(coordList[0]);
		coords['y'].push(coordList[1]);
		
		var marker = mdvMap.createMarker(nc, new MDVPoint(0.5, 0.5), img);
		
		// link to the detail page 
		var link = 'http://www.vvs.de/os/detailansicht/ziel/' + name;
		var	htmlLink = '<a href="' + link + '">Details</a><br/>';
		var tool = mdvMap.createToolTip(new MDVPoint(218, 90), '<b>' + name + '</b>' + '<br/>' +htmlLink);
		marker.setToolTip(tool);
		mdvMap.markerLayer.addMarker(marker);
		
		imageId++;
		i++;
		p = efa.coordInfo.pins[i];	
	}
	
	if(typeChngd==0){
		beautifyMap(coords);
	}
	mdvMap.update();
}
*/

/*********** TEST ***************/
function onToolTip(id, msg, obj){
	var link = "";
	var name = "";
	var size = obj.getSize();
	// STOPS with Departure Monitor
	if (obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='stop') {
		obj.setInnerHTML('Haltestelle: <b>'
			+ obj.getParent().objectId.desc
			+ '</b><br><br><div class="dmDiv" id="div_'
			+ obj.getParent().objectId.id
			+ '">'
			+ 'Bitte warten....'
			+'</div>'); 

		obj.dm = new MDVEFADepartureMonitor(obj.parentMarker.objectId.id, efaURLDM + 'XML_DM_REQUEST');
		obj.dm.getDepartures(obj.getParent().objectId.id);
	} 
	
	// mapped POIs
	if (obj.getParent().objectId && obj.getParent().objectId.id && obj.getParent().objectId.type && obj.getParent().objectId.type === 'coord') {
    
       // var poiInfo = obj.getParent().objectId.info
       var poiInfo = obj.getParent().objectId.id;
    
		if (mdvTooltipMapping[poiInfo] && mdvTooltipMapping[poiInfo].name != '') {
			// link
			if(mdvTooltipMapping[poiInfo].link) {
				link = mdvTooltipMapping[poiInfo].link;
                linkText = 'Details';
                
                if(mdvTooltipMapping[poiInfo].linkText){
                    linkText = mdvTooltipMapping[poiInfo].linkText;
                }
                
				if(link !== '') {
					link = '<a href="' + link + '">' + linkText + '</a>';
				};
			}
			// tooltip size
			if(mdvTooltipMapping[poiInfo].width || mdvTooltipMapping[poiInfo].height) { 
				if (mdvTooltipMapping[poiInfo].width && mdvTooltipMapping[poiInfo].height) {
					size = new MDVPoint(mdvTooltipMapping[poiInfo].width, mdvTooltipMapping[poiInfo].height);
				}
				else if (mdvTooltipMapping[poiInfo].width) {
					size = new MDVPoint(mdvTooltipMapping[poiInfo].width, size.y);
				}
				else {
					size = new MDVPoint(size.x, mdvTooltipMapping[poiInfo].height);
				}
			}
            
            if(obj.container){
                obj.container.setSize(size);
                obj.container.updateBubble();
            }
            
			// tooltip content
			obj.setInnerHTML(mdvTooltipMapping[poiInfo].name
				+ '<br/>'
				+ link ); 
		}
	}
	// POIS with Links and Address
	else if (obj.getParent().objectId && obj.getParent().objectId.type && obj.getParent().objectId.type.toLowerCase()=='poi_area' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi_point' 
			|| obj.getParent().objectId && obj.getParent().objectId.type.toLowerCase()=='poi') {
	
		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];
			if (a.name == 'POI_LINK') { 		
				link = link + '<a href="' + a.value.substring(a.value.indexOf('$') +1) 
					   + '" target="_blank">' 
					   + a.value.substring(0, a.value.indexOf('$')) + '</a><br/>';
			}
		} 
		
		for (var i=0; i < obj.getParent().getObjectId().attrs.length; i++) {
			var a = obj.getParent().getObjectId().attrs[i];

			if (a.name == 'POI_ADDRESS') {
				link += 'Adresse: ' + a.value;
			}							
		}	
		
		obj.setInnerHTML('<b>'
			+ obj.getParent().objectId.desc
			+ '</b><br/>'
			+ link
			+''); 
	} 
}


function onCoordRequestCallback(request){

	if(!request){
		return false;
	}
	else{
		json = request;
	}
	
	eval('efa = ' + json + ';'); 
	
	var i = 0;
	var p = efa.coordInfo.pins[i] || efa.coordInfo.pins.pin;	
	var imageId =1;
		
	//path to the poi marker image  
	var img = imgPath  + '/marker_poi' + imageId  +'.gif';
	
	var coords = new Array();
	coords['x'] =  new Array();
	coords['y'] =  new Array();
		
	while (p) {
	
		img = imgPath + '/marker_poi' + imageId  +'.gif';

		var coordList = p.coords.split(',');
		var name = p.desc;
		nc = new MDVCoordinates('NBWT', coordList[0], coordList[1]);

		coords['x'].push(coordList[0]);
		coords['y'].push(coordList[1]);
		
		var marker = mdvMap.createMarker(nc, new MDVPoint(0.5, 0.5), img);
		
		// link to the detail page 
		var link = 'http://www.vvs.de/os/detailansicht/ziel/' + name;
		var	htmlLink = '<a href="' + link + '">Details</a><br/>';
		var tool = mdvMap.createToolTip(new MDVPoint(218, 90), '<b>' + name + '</b>' + '<br/>' +htmlLink);
        
        marker.objectId.id = p.id.replace('vvs-', '') + ':' + p.omc;
        
		marker.setToolTip(tool);
		mdvMap.markerLayer.addMarker(marker);
		
		imageId++;
		i++;
		p = efa.coordInfo.pins[i];	
	}
	
	if(typeChngd==0){
		beautifyMap(coords);
	}
	mdvMap.update();
}
/******* TEST ****************/

function beautifyMap(coords) {

	typeChngd =1;

	var x = coords['x'];
	var y = coords['y'];
	
	x.sort(MDVMap_NumSort);
	y.sort(MDVMap_NumSort);
	
	var width  = x[x.length-1] - x[0];
	var height = y[y.length-1] - y[0];
	var newX   = parseInt(x[0]) + Math.floor(0.5 + width/2);
	var newY   = parseInt(y[0]) + Math.floor(0.5 + height/2)+parseInt(Math.floor($("promospace").getSize().y/2));
	var centre = new MDVCoordinates(mdvMap.config.get('mapName'),
		newX, newY);
		
	var zoom = 0;
	var extd = mdvMap.getViewportExtends();
	
	var zls = mdvMap.config.getZoomLevels();
	for (var i=zls.length-1; i >= 0; i--) {
		var zl = zls[i];
		var bWidth = false;
		var bHeight = false;
		
		var vpTiles = new MDVPoint(extd.width / parseInt(zl.get('tileSizeX')),
			extd.height / parseInt(zl.get('tileSizeY')));
		
		var numTiles = new MDVPoint(zl.get('numberOfTilesX'), zl.get('numberOfTilesY'));
		var realExtends = new MDVPoint(zl.get('realWidth'), zl.get('realHeight'));
		
		var tileSize = new MDVPoint(Math.floor(0.5 + realExtends.x / numTiles.x),
			Math.floor(0.5 + realExtends.y / numTiles.y));
			
		var real = new MDVPoint(tileSize.x * vpTiles.x, tileSize.y * vpTiles.y);    		
		
		if (real.x > (width*1.15) && !bWidth) {
			zoom = i;
			bWidth = true;
		}		

		if (real.y > (height*1.15) && !bHeight) {
			zoom = i;
			bHeight = true;
		}
		
		if (bWidth && bHeight)
			break;
	}

	if(globZoom) {
		zoom = 0;
	} else {
		zoom = zoom>5?5:0;
	}
	mdvMap.setCentre(centre);
	mdvMap.setZoomLevel(zoom);
};
	
//send request to get the cycle path 
function displayNetPath(pathId){

	if(!savePathId){
		savePathId = pathId;
	}

	var URL = efaURLLite + 'XML_NETPATH_REQUEST?';
	var _params = { 
		outputFormat: 'JSON',
		sessionID:'0',
		pathId: pathId
	};
	
	var _ajax = mdvLib.ajax({ host: URL, parameters: _params, onComplete: onNetPathRequestCallback});
}

// display the cylce path on the map
function onNetPathRequestCallback(request){

	if(!request){
		return false;
	}
	else{
		json = request;
	}
	
	eval('efa = ' + json + ';'); 
	
	efaSessionID =efa.parameters[1].value;
	
	var poly = mdvMap.createPolyline(efa.netPathInfo.pathCoord.path);
		poly.add('colour', mdvMap.config.params['path.polyline.color']);
		poly.add('opacity', mdvMap.config.params['path.polyline.opacity']);
		poly.add('weight', mdvMap.config.params['path.polyline.weight']);
	
	var tool = mdvMap.createToolTip('<b>' + efa.netPathInfo.name + '</b>');
		poly.setToolTip(tool);
	
	mdvMap.markerLayer.addPolyline(poly)

/* extended to beautify map */
	var p = efa.netPathInfo.pathCoord.path;    
    var coords = new Array();
    coords['x'] =  new Array();
    coords['y'] =  new Array();
    
    var coordArray = p.split(' ');
    for (var i = 0; i < coordArray.length; i++) {
        var couple = coordArray[i].split(',');
        if (couple[0] && couple[1]) {
            coords['x'].push(couple[0]);
            coords['y'].push(couple[1]);
        }
    }
    
    beautifyMap(coords);
    mdvMap.update();
/* /extended to beautify map */
}
	
// send request to get the elevation profile	
function displayElevationProfile(pathId){

	saveElProfId = pathId;

	var URL = serverPath + 'XML_ELEVATION_REQUEST?';
	var _params = { 
		pathId: pathId,
		purpose: 'RRP2.Detail',
		imageFormat: 'PNG',
		imageWidth: '345',
		imageHeight: '204',
		imageWidthO: '345',
		imageHeightO: '42',
		addYAxis: '1'
	};
	
	_params['2ndElevation'] = '1';
	_params['2ndPurpose'] = 'RRP2.Overview';
	
	var _ajax = mdvLib.ajax({ host: URL, parameters: _params, onComplete: onElevationProfileCallback});

}

// display elevation profile
function onElevationProfileCallback(request){

	if(!request){
		return false;
	}
	
	var genAttr = this.response.xml.getElementsByTagName('genAttrElem')
	
	for(i =0; i < genAttr.length; i++){

		
		if(genAttr[i].childNodes[0].firstChild.nodeValue=='pixelWidth'){
			profileImgWidth = genAttr[i].childNodes[1].firstChild.nodeValue;
		}
		
		if($(genAttr[i].childNodes[0].firstChild.nodeValue)){
		
			if(genAttr[i].childNodes[0].firstChild.nodeValue=='Length'){
				profileImgLength = genAttr[i].childNodes[1].firstChild.nodeValue;

				$(genAttr[i].childNodes[0].firstChild.nodeValue).innerHTML = (Math.round((genAttr[i].childNodes[1].firstChild.nodeValue / 1000) * 100) / 100).toString() + ' km';
			}
			else if(genAttr[i].childNodes[0].firstChild.nodeValue=='AddYAxisImage'){
				$(genAttr[i].childNodes[0].firstChild.nodeValue).src = efaURLImg + genAttr[i].childNodes[1].firstChild.nodeValue
			}
			else if(genAttr[i].childNodes[0].firstChild.nodeValue=='SmallElevationFile'){
				$(genAttr[i].childNodes[0].firstChild.nodeValue).style.backgroundImage="url(" + efaURLImg + genAttr[i].childNodes[1].firstChild.nodeValue + ")";
			}
			
			else{
				$(genAttr[i].childNodes[0].firstChild.nodeValue).innerHTML = genAttr[i].childNodes[1].firstChild.nodeValue + ' m';
			}
		}
	}

	$('downloadFile').src = efaURLImg + this.response.xml.getElementsByTagName('itdDownloadFile')[0].getAttribute('src');
}
	
// click on the elevation profile
function clickElevationProfile(pos, event){

	if(event.offsetX){
		var mousePos = event.offsetX;
		var mousePosTop = event.offsetY;
	}
	else{
		var mousePos = event.layerX;
		var mousePosTop = event.layerY;
	}
	
	$('elPin').style.display= '';
	$('elPin').style.left= event.clientX -3 +  'px';
	$('elPin').style.marginTop= mousePosTop  + 'px';
	
	var imgWidth = profileImgWidth ;
	var pr = (mousePos/imgWidth)*100;
	
	var meter = Math.ceil(profileImgLength * pr/100);

	var boxPos = (345 * pr / 100) - ($('profileBox').offsetWidth/2);
	
	var maxLef = 345 - $('profileBox').offsetWidth;
	
	if(boxPos > maxLef){
		boxPos = maxLef;
	}
	else if(boxPos < 0){
		boxPos = 0;
	}
	
	if($('profileBox').offsetWidth !='335px'){
		$('dragger' + parseInt(pos +1)).style.left = Math.round(boxPos) +'px';
	}
		
	var _params = {
		sessionID: efaSessionID, 
		command: 'ElevationPos',
		meter: meter
	};

	var host = serverPath + 'XML_NETPATH_REQUEST';
	/* send ajax request to get the coord */
	var _ajax = mdvLib.ajax({ host: host, parameters: _params, onComplete: setCoord});

};
	
// init the dragger for elevation profile
function initDragger(request){

	var box = $('wideProfile');
	
	if(box){
		box.onscroll = function () {
			$('elPin').style.display='none';
		}
	}

	var droppables = $('dragger' +dragger);
	
	$$('div.dragger').each(function(drag){
	
		drag.style.top='0px';
		drag.style.left='0px';
		var id = drag.id.substring(7,8)
		var container = $('SmallElevationFile');
		var firstTop = drag.style.top;
		
		new Drag.Move(drag, {'container': container, 'droppables': droppables,
			
			onDrag: function(element, droppable){
				
				firstTop =0+ 'px';
				
				drag.style.top= firstTop;
				drag.style.position= 'relative';
				
				var mousePos = this.element.getLeft();
				var imgWidth = this.element.parentNode.clientWidth;
				var pr = ((mousePos + Math.round(this.element.clientWidth / 2))/imgWidth)*100;
				var scrL = (pr * profileImgWidth) / 100;
				
				$('wideProfile').scrollLeft = scrL;
				$('elPin').style.display='none';
			},

			onDrop: function(){
			   
				drag.style.top= drag.style.top;
				
				var mousePos = this.element.getLeft();
				var imgWidth = this.element.parentNode.clientWidth;
				var pr = ((mousePos + Math.round(this.element.clientWidth / 2))/imgWidth)*100;
				var meter = Math.ceil(profileImgLength * pr/100);
				var wideImgWidth = profileImgWidth ;
				
				var _params = {
					sessionID: efaSessionID, 
					command: 'ElevationPos',
					meter: meter
					};

				var host = serverPath + 'XML_NETPATH_REQUEST';
				/* send ajax request to get the coord */
				var _ajax = mdvLib.ajax({ host: host, parameters: _params, onComplete: setCoord});

			},
			
			onBeforeStart: function(element, droppable){
			   drag.style.top= firstTop;
			   drag.style.position= 'relative';
			},
			
			onInitialize: function(element, droppable){
			   drag.style.top= firstTop;
			   drag.style.position= 'relative';
			},
			
			onOver: function(element, droppable){
			   drag.style.top= firstTop;
			   drag.style.position= 'relative';
			},
			
			onLeave: function(element, droppable){
				drag.style.top= firstTop;
				drag.style.position= 'relative';
			}

		});
		
	});
	
	if($('dragger' +dragger)){
		$('dragger' +dragger).style.top = 'auto';
	}
};

// set marker on map 
function setCoord(request){

	if(!request){
		return false;
	}
	else{
		json = request;
	}

	eval('efa = ' + json + ';'); 

	var coordX = efa.netPathInfo.elevX;
	var coordY = efa.netPathInfo.elevY;
	var coord = new MDVCoordinates(mdvMap.config.params.mapName, coordX, coordY);
	
	 if(mdvMap.hiddenMarker){
		mdvMap.hiddenMarker.coords.x = coordX;
		mdvMap.hiddenMarker.coords.y = coordY;
	}
	else{
	   mdvMap.hiddenMarker = mdvMap.createMarker(coord, new MDVPoint(0.5, 0.5), imgPath +'/elevationMarker.gif');
	   mdvMap.markerLayer.addMarker(mdvMap.hiddenMarker);
	}
	
	mdvMap.setCentre(coord);
	mdvMap.update();  
};

//MDV departure board
function MDVEFADepartureMonitor(id, url) {
    this.id 	= id;
    this.url 	= url;
}

// request departures (AJAX)
MDVEFADepartureMonitor.prototype.getDepartures = function(identifier) {

	var _params = { itdLPxx_id: identifier, name_dm: this.id, type_dm: 'stopID', mode: 'direct', limit: '5', deleteAssignedStops_dm: '1'};
	
    var _ajax = mdvLib.ajax({ host: this.url, parameters: _params, 
                                  onComplete: MDVEFADepartureMonitor_onAjaxComplete.bind(this) });
}

// get the HTML code for departure monitor
function MDVEFADepartureMonitor_onAjaxComplete(request) {

    if (request && document.getElementById('div_'+ this.id)) {
		var target = document.getElementById('div_'+ this.id);
		target.innerHTML = request;
     }
}

window.addEvent('load', function(){
	initDragger();
}); 

window.addEvent('unload', function()
{
	onUnLoadHandler();
});
