function checkIfIsRouteSet() { if( Map24.isNull( startAddressCoord ) ) return false; if( Map24.isNull( stopAddressCoord ) ) return false; if( Map24.isNull( startAddressCoord['lat'] ) ) return false; if( Map24.isNull( startAddressCoord['lng'] ) ) return false; if( Map24.isNull( stopAddressCoord['lat'] ) ) return false; if( Map24.isNull( stopAddressCoord['lng'] ) ) return false; return true; } function showCarRouteAndAirports(startAddress, stopAddress) { if(map.CurrentMaptype != 'JAVA' && autoApply == null) Effect.SlideDown('jreHint'); if( Map24.isNull( startAddress ) ) return; if( Map24.isNull( stopAddress ) ) return; if( startAddress.length < 3) return; if( stopAddress.length < 3) return; if( startAddress == 'Address, ZIP, Start, POI, ...') return; if( stopAddress == 'Address, ZIP, Destination, POI, ...') return; document.getElementById("addData").style.display = 'none'; startLoading(); document.getElementById("priceDetail").innerHTML = 'Query price'; document.getElementById("priceDetail").style.display = 'block'; //1. Geocode the start address geocode( startAddress, onGeocodeStart ); //2. When start address has been geocoded, then geocode destination address function onGeocodeStart( geoRes ){ startAddressCoord = new Array(); startAddressCoord['lat'] = geoRes.Coordinate.Latitude; startAddressCoord['lng'] = geoRes.Coordinate.Longitude; geocode( stopAddress, onGeocodeStop ); } //3. When both start and dest address have been geocoded, then start route calculation function onGeocodeStop( geoRes ){ stopAddressCoord = new Array(); stopAddressCoord['lat'] = geoRes.Coordinate.Latitude; stopAddressCoord['lng'] = geoRes.Coordinate.Longitude; showCarRouteOnMap(); getAndShowAirports(); } return; } function showCarRouteOnMap() { checkIfIsRouteSet(); var routeRequest = new Map24.Webservices.Request.CalculateRoute( map ); routeRequest.Start = new Map24.Webservices.Request.CalculateRoute.CoordinateAndAddress(); routeRequest.Start.Coordinate = new Map24.Coordinate( startAddressCoord['lng'], startAddressCoord['lat'] ); routeRequest.Destination = new Map24.Webservices.Request.CalculateRoute.CoordinateAndAddress(); routeRequest.Destination.Coordinate = new Map24.Coordinate( stopAddressCoord['lng'], stopAddressCoord['lat'] ); map.Webservices.sendRequest( routeRequest ); map.onCalculateRoute = function( event ) { var mrcContainer = new Map24.Webservices.Request.MapletRemoteControl( map ); mrcContainer.push( new Map24.Webservices.MRC.DeclareMap24RouteObject({ MapObjectID: "actualRoute", Map24RouteID: event.Info.RouteID, Color: new Map24.Color( 0, 0, 0, 255 ) }) ); mrcContainer.push( genSetMapView( 0, 70, null, null, "actualRoute" ) ); mrcContainer.push( genControlMapObject( "ENABLE", "actualRoute" ) ); map.Webservices.sendRequest( mrcContainer ); showAddData(); } } function geocode( address, onGeoFunc ) { map.Webservices.sendRequest( new Map24.Webservices.Request.MapSearchFree(map, { SearchText: address, MaxNoOfAlternatives: 1 }) ); map.onMapSearchFree = function( event ){ var geoRes = new Object(); geoRes = event.Alternatives[0]; onGeoFunc( geoRes ); } } function showAddData() { stopLoading(); Effect.SlideDown('addData'); } //Factory functions function genSetMapView( ClippingWidth, ClippingPercent, lon, lat, objID ){ // Hashtable Clip { MinimumWidth: ClippingWidth, ViewPercentage: ClippingPercent } is created var Clip = new Array(); if( !Map24.isNull( ClippingWidth ) ) Clip['MinimumWidth'] = ClippingWidth; if( !Map24.isNull( ClippingPercent ) ) Clip['ViewPercentage'] = ClippingPercent; if( !Map24.isNull( lon ) && !Map24.isNull( lat ) ) { var SetMapView = new Map24.Webservices.MRC.SetMapView({ ClippingWidth: new Map24.Webservices.ClippingWidth( Clip ), Coordinates: new Map24.Coordinate( lon, lat ) }); } else if( !Map24.isNull( objID ) ) { var SetMapView = new Map24.Webservices.MRC.SetMapView({ ClippingWidth: new Map24.Webservices.ClippingWidth( Clip ), MapObjectIDs: objID }); } return SetMapView; } function genControlMapObject( Control, objID ){ var ControlObject = new Map24.Webservices.MRC.ControlMapObject({ Control: Control, MapObjectIDs: objID }); return ControlObject; } function removeAirportsFromMap() { var mrcContainer = new Map24.Webservices.Request.MapletRemoteControl( map ); mrcContainer.push( new Map24.Webservices.MRC.RemoveMapObject( 'airports' ) ); map.Webservices.sendRequest( mrcContainer ); startApts = null; stopApts = null; } function getAndShowAirports() { checkIfIsRouteSet(); // remove old airports from map removeAirportsFromMap(); // get and show new airports new Ajax.Request('aj_getClosestAirportByCoord.php?lat='+startAddressCoord['lat']/60+'&lng='+startAddressCoord['lng']/60, {onSuccess:closestStartApts, onFailure:closestStartAptsNotFound}); new Ajax.Request('aj_getClosestAirportByCoord.php?lat='+stopAddressCoord['lat']/60+'&lng='+stopAddressCoord['lng']/60, {onSuccess:closestStopApts, onFailure:closestStopAptsNotFound}); } function closestApts(value, isStart) { if(value.length > 7) { var airports = value.split(";;"); if(isStart) startApts = new Array(airports.length); else stopApts = new Array(airports.length); for(var i = 0; i < airports.length; i++) { var items = airports[i].split(";"); if(isStart) startApts[i] = new Array(items.length); else stopApts[i] = new Array(items.length); for(var j = 0; j < items.length; j++) { var item = items[j].split("="); if(item.length == 2 && item[1].length > 0) { if(isStart) startApts[i][item[0]] = item[1]; else stopApts[i][item[0]] = item[1]; } } } } pushAirports(); } function closestAptsNotFound(value, isStart) { var text = 'Could not find any airport close to origin address.'; if(!isStart) text = 'Could not find any airport close to origin address.'; alert(text); } function closestStartApts(t) { closestApts(t.responseText, true); } function closestStartAptsNotFound(t) { closestAptsNotFound(t, true); } function closestStopApts(t) { closestApts(t.responseText, false); } function closestStopAptsNotFound(t) { closestAptsNotFound(t, false); } function getCarDistance(lat1, lng1, lat2, lng2, urlParam, func) { var routeRequest = new Map24.Webservices.Request.CalculateRoute( map ); routeRequest.Start = new Map24.Webservices.Request.CalculateRoute.CoordinateAndAddress(); routeRequest.Start.Coordinate = new Map24.Coordinate(lng1*60, lat1*60); routeRequest.Destination = new Map24.Webservices.Request.CalculateRoute.CoordinateAndAddress(); routeRequest.Destination.Coordinate = new Map24.Coordinate(lng2*60, lat2*60); map.Webservices.sendRequest( routeRequest ); // returns an event ['TotalTime'], ['TotalLength'] map.onCalculateRoute = function( event ) { func(urlParam, event.Info['TotalTime'], event.Info['TotalLength']); } } function pushAirports() { isStart = true; if(startApts.length > 0) { for(var i = 0; i < startApts.length; i++) { if(startApts[i].length == 4) pushAirport(startApts[i]['lat']*60, startApts[i]['lng']*60, startApts[i]['name'], startApts[i]['icao'], true, i); } setAirport(0, true); } if(stopApts.length > 0) { for(var i = 0; i < stopApts.length; i++) { if(stopApts[i].length == 4) pushAirport(stopApts[i]['lat']*60, stopApts[i]['lng']*60, stopApts[i]['name'], stopApts[i]['icao'], false, i); } setAirport(0, false); isStart = false; } } function setAirport(id, isStart) { divElement = 'startAirportName'; value = startApts[id]['name']+" ("+startApts[id]['icao']+')'; if(!isStart) { divElement = 'stopAirportName'; value = stopApts[id]['name']+" ("+stopApts[id]['icao']+')'; stopAptId = id; } else startAptId = id; document.getElementById(divElement).innerHTML = 'airport: '+value; if(startAptId != null && stopAptId != null) repaintAirportLine(); } function repaintAirportLine() { if(Map24.isNull(startAptId)) return; if(Map24.isNull(stopAptId)) return; if(Map24.isNull(startApts[startAptId]['lat'])) return; if(Map24.isNull(startApts[startAptId]['lng'])) return; if(Map24.isNull(stopApts[stopAptId]['lat'])) return; if(Map24.isNull(stopApts[stopAptId]['lng'])) return; var mrcContainer = new Map24.Webservices.Request.MapletRemoteControl( map ); mrcContainer.push( new Map24.Webservices.MRC.DeclareMap24Polyline({ MapObjectID: "airportConnection", Coordinates: new Map24.Webservices.CoordinatesArray( new Map24.Coordinate( startApts[startAptId]['lng']*60, startApts[startAptId]['lat']*60 ), new Map24.Coordinate( stopApts[stopAptId]['lng']*60, stopApts[stopAptId]['lat']*60 ) ), Color: new Map24.Color( 255, 115, 40, 255 ) }) ); mrcContainer.push( genControlMapObject( 'ENABLE','airportConnection' ) ); map.Webservices.sendRequest( mrcContainer ) } function pushAirport(lat, lng, name, icao, isStart, id) { var objectId = "APT"+icao; var tooltipId = "tooltip"+objectId; var mrcContainer = new Map24.Webservices.Request.MapletRemoteControl( map ); mrcContainer.push( new Map24.Webservices.MRC.DeclareMap24Location({ MapObjectID: objectId, Description: "Airport "+name+" ("+icao+")", Coordinate: new Map24.Coordinate( lng, lat ), LogoURL: "http://www.alphaairways.com/cjc/images/airport_marker.png", SymbolID: 20100, Events: new Array( new Map24.Webservices.MapObjectEvent({ ID: "OnClick", Commands: new Map24.Webservices.CommandsArray( new Map24.Webservices.MRC.Surf({ URL: "javascript:setAirport("+id+","+isStart+");" }) ) }) ) }) ); mrcContainer.push( genDeclareMapGroup ( 'airports', objectId ) ); mrcContainer.push( genControlMapObject ( 'ENABLE', 'airports' ) ); map.Webservices.sendRequest( mrcContainer ); } function genDeclareMapGroup( group, id ){ var MapGroup = new Map24.Webservices.MRC.DeclareMapObjectGroup({ MapObjectGroupID: group, MapObjectIDs: new Array( group, id ) }); return MapGroup; } function calculatePrice() { if(checkIfIsRouteSet() && startAptId != null && stopAptId != null) { newRoute = true; var numPersons = document.getElementById('numPersons').options[document.getElementById('numPersons').selectedIndex].value; if(isNaN(numPersons)) { alert('Number of passengers is not a valid number.'); return; } else numPersons = Math.round(numPersons); var hourlyRate = document.getElementById('hourlyRate').value; if(!hourlyRate.match(/^[0-9]+\.?[0-9]*$/)) { alert('Hourly rate is not a valid number.'); return; } var carType = document.getElementById('carType').value; if(Number(carType)) carType = Math.round(carType); else { alert('Invalid car type.'); return; } var startApt = startApts[startAptId]; var stopApt = stopApts[stopAptId]; urlParam = 'startApt='+startApt['icao']; urlParam += '&stopApt='+stopApt['icao']; urlParam += '&startAddrLat='+startAddressCoord['lat']/60; urlParam += '&startAddrLng='+startAddressCoord['lng']/60; urlParam += '&stopAddrLat='+stopAddressCoord['lat']/60; urlParam += '&stopAddrLng='+stopAddressCoord['lng']/60; urlParam += '&numPersons='+document.getElementById('numPersons').options[document.getElementById('numPersons').selectedIndex].value; urlParam += '&hourlyRate='+document.getElementById('hourlyRate').value; urlParam += '&carType='+document.getElementById('carType').value; urlParam += '&oneway='; if(document.getElementById('oneway').checked) urlParam += 'true'; else urlParam += 'false'; urlParam += '&aeb='; if(document.getElementById('aeb').checked) urlParam += 'true'; else urlParam += 'false'; document.getElementById('priceDetail').style.display = 'none'; startLoading(); getCarDistance(startAddressCoord['lat']/60, startAddressCoord['lng']/60, stopAddressCoord['lat']/60, stopAddressCoord['lng']/60, urlParam, addTotalDistance); } else alert('Please set route first.'); } function addTotalDistance(urlParam, time, length) { urlParam += '&totalTime='+time; urlParam += '&totalLength='+length; getCarDistance(startAddressCoord['lat']/60, startAddressCoord['lng']/60, startApts[startAptId]['lat'], startApts[startAptId]['lng'], urlParam, addDistanceStart); } function addDistanceStart(urlParam, time, length) { urlParam += '&startTime='+time; urlParam += '&startLength='+length; getCarDistance(stopAddressCoord['lat']/60, stopAddressCoord['lng']/60, stopApts[stopAptId]['lat'], stopApts[stopAptId]['lng'], urlParam, addDistanceStop); } function addDistanceStop(urlParam, time, length) { urlParam += '&stopTime='+time; urlParam += '&stopLength='+length; new Ajax.Updater('priceDetail', 'aj_getCalculationDetails.php?'+urlParam, {onComplete:function(){ stopLoading(); },asynchronous:true, evalScripts:true}); } function hideFormDetails() { if(document.getElementById("addData").style.display != 'none') document.getElementById("addData").style.display = none; }