﻿/* Region: Evènements */
    function radComboBox_onIndexChanged(sender,e) {
        var item=e._item;
        sender.get_inputDomElement().blur();
        
        Engine.setGroupEventGoogleMaps(sender.get_id()=='ctl00_myEngine_RadComboBoxFrom'?0:1);
        Engine.showCityOnMap(item.get_text(),item.gpsLat,item.gpsLng,true);
    }

    function radComboBox_onClientItemsRequesting(sender,e) {
        var methodArguments = e.get_context();
        methodArguments.is_fromBox = (sender.get_id()=='ctl00_myEngine_RadComboBoxFrom');
        e._context=methodArguments;
    }
    function radComboBox_onItemsRequested(sender, e) {
        var s = new String();
        var result_count = sender.get_items().get_count();
        if(result_count==0) s = "Aucunes villes trouvées !";
        else if(result_count==1) {
            if(sender.get_items().getItem(0).get_text()=='') s = "Aucunes villes trouvées !";
            else s = "1 aéroport trouvé";
        } else s = result_count + " aéroports trouvés";
        sender.get_dropDownElement().lastChild.innerHTML=s;
        
        Engine.setGpsDataFromCombobox(sender.get_items());
    }

    function radComboBox_onBlur(sender,e) {sender.clearItems();}
    
    /* Calendar Events */
    function calendar_onLoad(sender,e) {
        $find('ctl00_myEngine_RadDatePickerTo').set_enabled($get('ctl00_myEngine_c08').checked);
    }

    function calendar_onDateClick(sender,e) {
        var date_picker=(sender.get_id()=='ctl00_myEngine_RadDatePickerFrom_calendar'?$find('ctl00_myEngine_RadDatePickerFrom'):$find('ctl00_myEngine_RadDatePickerTo'));
        if(e._renderDay.get_isSelected()) date_picker.hidePopup();
    }

    function datePicker_onFocus(sender,e) {
        var obj=(sender.get_id()=='ctl00_myEngine_RadDatePickerFrom_dateInput'?$find('ctl00_myEngine_RadDatePickerFrom'):$find('ctl00_myEngine_RadDatePickerTo'));
        obj.showPopup();
    }

    function datePicker_onValueChanged(sender,e) {
        var date1=new Date($find('ctl00_myEngine_RadDatePickerFrom').get_selectedDate());
        var date2=new Date($find('ctl00_myEngine_RadDatePickerTo').get_selectedDate());
        if(sender.get_id()=='ctl00_myEngine_RadDatePickerFrom_dateInput' && (date1>date2)) $find('ctl00_myEngine_RadDatePickerTo').set_selectedDate(addDay(date1,7));
        else if(date2<date1) $find('ctl00_myEngine_RadDatePickerFrom').set_selectedDate(date2);
    }

    function datePicker_onPopupOpening(sender,e) {
        e.set_cancel(!sender.get_enabled());
    }
/* EndRegion: Evènements */ 

/* Function Tools */
function addDay(o,d){o.setDate(o.getDate()+d);return o;}



/******* Classe clsGoogleMaps ********/
var clsGoogleMaps = function() {
    var _searchControl=null;
    var _map=null;
    var _overlay=new Array(null,null);
    
    /* Méthode publiques */
    
    this.load = function() {      
        if (GBrowserIsCompatible()) {
            _map = new GMap2($get('div_map'));
            _searchControl = new GSearchControl();
        
            /* Configuration de l'apparance de la carte */
            _map.setMapType(G_NORMAL_MAP);
            _map.addControl(new GSmallMapControl());
            _map.setCenter(new GLatLng(0,0), 1);

            /* Paramétrage de la recherche */
            _searchControl.addSearcher(new GlocalSearch());
            _searchControl.draw($get('google_maps_results'));
            _searchControl.setSearchStartingCallback(null, onSearchStarting);
            _searchControl.setSearchCompleteCallback(null, onSearchComplete);
        }
    }

    this.executeSearch = function(search,lng,lat,eventCalendar) {
        if(lng!='' && lat!='') executeSearchFromGps(lng,lat,eventCalendar);
        else executeSearchFromText(search);    
    }

    /* Region: Méthodes privées */
        /* Pointe sur la Google maps avec des coordonnées gps */
        function executeSearchFromGps(lng,lat,eventCalendar) {
            _overlay[Engine.getGroupEventGoogleMaps()] = new GLatLng(lng,lat);
            drawOverlay();
            /* Ouvre le calendrier */
            if(eventCalendar) Engine.openCalendar(Engine.getGroupEventGoogleMaps());
        }
        
        /* Lance une recherche à partir d'un texte */
        function executeSearchFromText(search) {
            _searchControl.execute(search);
        }
        
        /* Evènement quand la recherche démarre */
        function onSearchStarting() {
            /* Cache le moteur de recherche */
            Engine.disabled();
        }
        
        /* Evènement quand la recherche est terminée */
        function onSearchComplete(sc,sender) {
            /* Définition des variables */
            var distance=0;
                        
            /* Efface la carte */
            clear();
            
            /* Si il y a des résultats */
            if(sender.results&&sender.results.length>0){
                /* Récupère les informations*/
                var result=sender.results[0];
                _overlay[Engine.getGroupEventGoogleMaps()]=new GLatLng(parseFloat(result.lat), parseFloat(result.lng));
            } else _overlay[Engine.getGroupEventGoogleMaps()]=null;
        
            /* Trace les balises et le trait de liaison */
            drawOverlay();
        
            /* Mémorise les positions gps dans le moteur de recherche */
            Engine.setViewStateGps(_overlay[0],_overlay[1]);
            
            /* Affiche le moteur de recherche */
            Engine.enabled();
            
             /* Open calendar */
            //if(window.location.href.indexOf('/Comparatif-Vol/')==-1) calendar.showPopup();
 
            /* Ouvre le calendrier */
            Engine.openCalendar(Engine.getGroupEventGoogleMaps());
        }
        
        /* Trace les balises et le trait de liaison */
        function drawOverlay() {
            var middleVertex=null;
            
            /* Create Overlay From airport, to airport */
            if(_overlay[0]) _map.addOverlay(createMarker(_overlay[0],'A'));
            if(_overlay[1]) _map.addOverlay(createMarker(_overlay[1],'B'));
        
            /* Trace la ligne entre les 2 points */
            if((_overlay[0]&&_overlay[1]) && ((_overlay[0].lat()!=_overlay[1].lat())||(_overlay[0].lng()!=_overlay[1].lng()))) {
                var arrayVertex = calculateGeodesicPoints(_overlay[0],_overlay[1]);
                middleVertex = arrayVertex[parseInt(arrayVertex.length/2)];
                var polyline=new GPolyline(arrayVertex, "#ff0000", 5, 1,{geodesic:false});
                _map.addOverlay(polyline);
            }    
            
             /* Zoom personalisé */
            if(_overlay[0]&&_overlay[1]) {
                distance=Math.round(_overlay[0].distanceFrom(_overlay[1])/1000);
                if(distance<5000) _map.setCenter(_overlay[Engine.getGroupEventGoogleMaps()],7);
                else _map.setCenter(new GLatLng(middleVertex.y,middleVertex.x), 1);
            } else if(_overlay[Engine.getGroupEventGoogleMaps()]) _map.setCenter(_overlay[Engine.getGroupEventGoogleMaps()],7);
        }
        
        /* Création d'une balise sur la GoogleMaps */
        function createMarker(point,letter){var letteredIcon = new GIcon(G_DEFAULT_ICON);
            letteredIcon.image = "http://www.volhd.com/Images/MapFiles/flag" + letter + ".gif";
            letteredIcon.iconSize= new GSize(40,68);
            letteredIcon.iconAnchor=new GPoint(12,60);
            markerOptions = { icon:letteredIcon };var marker = new GMarker(point, markerOptions);return marker;
        }
        
        /* Efface toute les anotations sur la carte */
        function clear() {
            _map.clearOverlays()
        }
        
        /* Permet de tracer une ligne rouge entre p1 et p2 */
        function calculateGeodesicPoints(p1,p2){var fPoints=new Array();with(Math){var lat1=p1.y*(PI/180);var lon1=p1.x*(PI/180);var lat2=p2.y*(PI/180);var lon2=p2.x*(PI/180);var d=2*asin(sqrt(pow((sin((lat1-lat2)/2)),2)+cos(lat1)*cos(lat2)*pow((sin((lon1-lon2)/2)),2)));for(n=0;n<51;n++){var f=(1/50)*n;var A=sin((1-f)*d)/sin(d);var B=sin(f*d)/sin(d);var x=A*cos(lat1)*cos(lon1)+B*cos(lat2)*cos(lon2);var y=A*cos(lat1)*sin(lon1)+B*cos(lat2)*sin(lon2);var z=A*sin(lat1)+B*sin(lat2);var latN=atan2(z,sqrt(pow(x,2)+pow(y,2)));var lonN=atan2(y,x);var p=new GLatLng(latN/(PI/180),lonN/(PI/180));fPoints.push(p);}}return fPoints;}
    /* EndRegion: Méthodes privées */ 
}

/******* Classe clsEngine ********/
var clsEngine = function(){
    var GoogleMaps = new clsGoogleMaps();
    var groupEventGoogleMaps=0;
    
    this.load = function() {
        /* Affiche la google map */
        GoogleMaps.load();
        
        /* Affiche les informations gps s'il en existe */
        viewStateGps();
    }
    
    this.enabled = function() {$find('ctl00_myEngine_c19').hide('ctl00_myEngine_c20');};
    this.disabled = function() {$find('ctl00_myEngine_c19').show('ctl00_myEngine_c20');};
    
    /* Permet d'ouvrir le popup d'un calendrier d'un groupe */
    this.openCalendar = function(groupId) {
        var obj=null;
        
        /* Choisie le calendrier à ouvrir dans un groupe */
        if(groupId==0) obj=$find('ctl00_myEngine_RadDatePickerFrom')
        else obj=$find('ctl00_myEngine_RadDatePickerTo');
    
        /* Ouvre le calendrier */
        obj.showPopup();
    }
    
    
    this.setGpsDataFromCombobox = function(items) {
        var ws = items._parent._webServiceLoader._currentRequest._executor._resultObject;
        items.forEach(
            function(item) {
                try {
                    item.gpsLng=ws.d[item.get_index()].GpsLng;
                    item.gpsLat=ws.d[item.get_index()].GpsLat;
                } catch(e) {
                    item.gpsLng='';
                    item.gpsLat='';
                }
            }                 
        );
    }
    
    this.showCityOnMap = function(cityName,lng,lat,eventCalendar) {
        var search=cityName.substr(0,cityName.length-5);
        GoogleMaps.executeSearch(search,lng,lat,eventCalendar);
    }
    
    this.getGroupEventGoogleMaps = function() {return groupEventGoogleMaps;}
    this.setGroupEventGoogleMaps = function(value) {groupEventGoogleMaps=value;}
    
    /* Permet de mémoriser les positions gps dans le moteur de recherche */
    this.setViewStateGps = function(gpsFrom,gpsTo) {
        /* Définition des variables */
        var c00=$get('ctl00_myEngine_c15');
        var c01=$get('ctl00_myEngine_c16');
    
        if(gpsFrom) c00.value = (gpsFrom.x + ',' + gpsFrom.y);
        else c00.value='';
        if(gpsTo) c01.value = (gpsTo.x + ',' + gpsTo.y);
        else c01.value='';
    }
    
    function viewStateGps() {
        /* Définition des variables */
        var c00=$get('ctl00_myEngine_c15');
        var c01=$get('ctl00_myEngine_c16');
        var temp = null;

        /* Lecture des coordonées gps */
        if(c00.value) {
            temp = new GLatLng(c00.value.split(',')[0],c00.value.split(',')[1]);
            groupEventGoogleMaps=0;
            GoogleMaps.executeSearch('',temp.x,temp.y,false);
        }
        if(c01.value) {
            temp = new GLatLng(c01.value.split(',')[0],c01.value.split(',')[1]);
            groupEventGoogleMaps=1;
            GoogleMaps.executeSearch('',temp.x,temp.y,false);
        }
    }  

    
};


/* Chargement de la google maps */
google.load("maps", "2",{"language" : "fr_FR"});
google.load("search", "1", {"nocss" : true,"language" : "fr"});

/* Chargement du moteur de recherche */
var Engine = new clsEngine();