bqc.TOOLTIP_X_OFFSET = 20;
bqc.TOOLTIP_Y_OFFSET = 10;

bqc.TooltipManager = Class.create({

    initialize: function(map, routingForm, srcAddId, fromSite, mode) {
        this.map = map;
        this.routingForm = routingForm;
        this.mapContainer = map.getContainer();
        this.currentId = null;
        this.streetLat = null;
        this.stretLng = null;
        this.tooltip = this.createTooltip();
        this.previousPanel = null;
        this.currentMarker = null;
        this.searchManager = null;
        this.autoSearch = false;
        this.opening = false;
        this.circuitMarker = null;

        this.searchCriteria = null;
        this.initProximitySearch();

        this.hideTooltip();

        this.fromSite = fromSite;
        this.mode = mode;
        this.fromSiteAddId = srcAddId;

        var that = this;
        GEvent.addListener(map, 'infowindowclose', function() {that.closed();});
        
        this.dragend = null;
        this.zoomend = null;

        var center = map.getCenter();
        this.streetLat = center.lat();
        this.streetLng = center.lng();
        this.contentNode = document.createElement('div');
        this.contentNode.style.textAlign = 'center';
        this.contentNode.style.width = '500px';
        this.contentNode.style.height = '300px';
        this.contentNode.id = 'pano'
        this.panorama = new GStreetviewPanorama(this.contentNode);
        this.panorama.setLocationAndPOV(new GLatLng(center.lat(), center.lng() - .01), null);
        this.streetWindowOpen = null;
        this.streetWindowBeforeClose = null;
    },

    getSrcAddId: function() {
        if (this.fromSiteAddId != null && this.fromSiteAddId.trim()!="" && (this.fromSite == 'DRT' || this.fromSite == 'CRESINFOTOURISM' || this.fromSite == 'CRESCALLCENTER' || this.fromSite == 'CRESOTHER')) {
            return this.fromSiteAddId;
        } else if (this.options != null) {
            return this.options.p_addId;
        }
        return null;
    },

    resetProximity: function() {
        this.options.p_addId = null;
        this.options.p_addId = this.options.p_srcAddId = this.getSrcAddId();
        this.searchManager.isProximity = false;
    },

    closed: function() {
        if (!this.opening) {
            if (this.autoSearch) {
                this.searchManager.searchAgain();
            } else {
                this.searchManager.listenMap();
            }
            this.autoSearch = false;
            this.stopListeningMap();
        }
    },

    setSearchManager: function(searchManager) {
        this.searchManager = searchManager;
        this.options = {
            hasStreetview: false,
            p_mode: (this.mode == null) ? 'web' : this.mode,
            p_fromSite: this.fromSite,
            p_addId: this.getSrcAddId(),
            p_srcAddId: this.getSrcAddId()
        }
    },

    createTooltip: function() {
        var tooltip = document.body.appendChild(document.createElement('div'));
        tooltip.className = 'tooltip';
        return tooltip;
    },
    showCustomTooltip: function(latlng,text) {
            var headerHeight = $('header').getDimensions().height ;
            this.tooltip.innerHTML = '';
            var tooltipText = this.tooltip.appendChild(this.div());
            tooltipText.id = 'tooltipText';
            tooltipText.innerHTML = text;
            this.tooltip.style.display = '';
            var point = this.map.fromLatLngToContainerPixel(latlng, this.map.getZoom());
            var isRight = this.mapContainer.clientWidth / 2 < point.x;
            var left = point.x + this.mapContainer.offsetLeft - this.mapContainer.scrollLeft+14;
            var top = point.y + this.mapContainer.offsetTop + headerHeight - this.mapContainer.scrollTop - this.tooltip.clientHeight+12 ;
            if (isRight) {
      
                left -= this.tooltip.clientWidth+26;
            }

            this.tooltip.style.left = left + 'px';
            this.tooltip.style.top = top + 'px';

    },
    showTooltip: function(latlng, json) {
         var headerHeight = $('header').getDimensions().height ;
        if (this.currentId != json.addId) {
            this.currentId = json.addId;

            this.populateTooltip(json);
            this.tooltip.style.display = '';

            this.populateTooltip(json);
            var point = this.map.fromLatLngToContainerPixel(latlng, this.map.getZoom());
            var isRight = this.mapContainer.clientWidth / 2 < point.x;
            var isTop = this.mapContainer.clientHeight / 2 > point.y;
            var left = point.x + this.mapContainer.offsetLeft - this.mapContainer.scrollLeft + bqc.TOOLTIP_X_OFFSET;
            var top = point.y - this.mapContainer.scrollTop - this.tooltip.clientHeight - bqc.TOOLTIP_Y_OFFSET + headerHeight;

            if (isRight) {
                left -= this.tooltip.clientWidth + bqc.TOOLTIP_X_OFFSET * 2;
            }
            if (isTop) {
                top += this.tooltip.clientHeight / 2;
            }
            this.tooltip.style.left = left + 'px';
            this.tooltip.style.top = top + 'px';
        }
    },

    div: function() {
        return document.createElement('div');
    },

    img: function() {
        return document.createElement('img');
    },

    populateTooltip: function(json) {
        this.tooltip.innerHTML = '';
        var tooltipText = this.tooltip.appendChild(this.div());
        tooltipText.id = 'tooltipText';
        tooltipText.innerHTML = json.name;
        if (json.poiName != null && json.poiName.length > 0) {
            var tooltipPoi = this.tooltip.appendChild(this.div());
            tooltipPoi.id = 'tooltipPoi';
            tooltipPoi.innerHTML = json.poiName;
        }
        if (json.rating != null && json.rating .length > 0) {
            var img = this.tooltip.appendChild(this.img());
            img.src = json.rating;
        }
    },

    hideTooltip: function() {
        this.currentId = null;
        this.tooltip.style.display = 'none';
    },

    listenMap: function() {
        if (this.dragend == null) {
            var that = this;
            this.dragend = GEvent.addListener(this.map, 'dragend', function() {
                that.autoSearch = true;
            });
            this.zoomend = GEvent.addListener(this.map, 'zoomend', function() {
                that.autoSearch = true;
            });
        }
    },

    stopListeningMap: function() {
        if (this.dragend != null) {
            GEvent.removeListener(this.dragend);
            GEvent.removeListener(this.zoomend);
            this.dragend = null;
            this.zoomend = null;
        }
    },

    listenOpening: function(marker) {
        var that = this;
        var listener = GEvent.addListener(marker, 'infowindowopen', function() {
            that.opening = false;
            GEvent.removeListener(listener);
        });
    },

    openService: function(marker) {
        delete this.options.poiAddId;
        this.options.servicePointAddId = marker.json.addId;
        this.options.p_srcAddId = this.getSrcAddId();
        this.options.p_lcode = bqc.params.p_lcode;
        this.open(marker, 'proximityServicePointTooltip.do', this.options);
        
        
    },

    openStreet: function() {
        var tooltipTmp = this;
        if (this.streetWindowOpen != null) {
            GEvent.removeListener(this.streetWindowOpen);
        }
        if (this.streetWindowOpen != null) {
            GEvent.removeListener(this.streetWindowOpen);
        }

        this.streetWindowBeforeClose = GEvent.addListener(this.currentMarker.marker, "infowindowbeforeclose", function(){tooltipTmp.destroyPano()});
        var latlng = new GLatLng(this.streetLat, this.streetLng);
        this.streetWindowOpen = GEvent.addListener(this.currentMarker.marker, "infowindowopen", function(){tooltipTmp.buildPano(latlng)});

        this.contentNode.innerHTML="";
        bqc.gaLogger.log(bqc.params.p_mode_org, bqc.GAnalyticsStrings.level2.streetView, bqc.GAnalyticsStrings.level3.miniFiche);
        this.currentMarker.marker.openInfoWindow(this.contentNode);
    },

    destroyPano: function(){
        if(this.panorama){
            this.panorama.remove();
        }
        this.contentNode.innerHTML = "";
    },

    buildPano: function(latlng){
        this.opening = false;
        this.panorama = new GStreetviewPanorama(this.contentNode);
        this.panorama.setLocationAndPOV(latlng, null);
    },

    preparePano: function(response, marker, url, options) {
        options.hasStreetview = false;
        if (response.code == 200){
            options.hasStreetview = true;
            this.streetLat = response.Location.lat;
            this.streetLng = response.Location.lng;
        }
        this.finishOpen(marker, url, options);
    },

    open: function(marker, url, options) {
        var tooltipTmp = this;
        this.opening = true;
        this.listenMap();
        this.listenOpening(marker.marker);
        this.currentMarker = marker;
        var client = new GStreetviewClient();
        client.getNearestPanorama(marker.getLatLng(), function(response) {
            tooltipTmp.preparePano(response, marker.marker, url, options)
        });
    },

    finishOpen: function(marker, url, options) {
        new Ajax.Request(url, {
            method: 'post',
            parameters: options,
            onSuccess: function(transport) {
                marker.openInfoWindowHtml(transport.responseText);
            }
        });
    },

    close: function() {
        this.map.closeInfoWindow();
    },

    enterProximitySearch: function() {
        var poiTooltipMain = $('poiTooltipMain');
        if (poiTooltipMain != null) {
            this.previousPanel = poiTooltipMain.hide();
        } else {
            var serviceTooltipMain = $('servicePointTooltipMain');
            if (serviceTooltipMain != null) {
                this.previousPanel = serviceTooltipMain.hide();
            }
        }
        $('proximitySearch').show();
    },

    back: function() {
        if (this.previousPanel != null) {
            this.previousPanel.show();
        }
    },

    leaveProximitySearch: function() {
        $('proximitySearch').hide();
        this.back();
    },

    initProximitySearch: function() {
        this.searchCriteria = [
            {
                input: 'proximitySearchAccommodation',
                names: [
                    'searchCategory-1',
                    'searchCategory-2',
                    'searchCategory-3',
                    'searchCategory-4',
                    'searchCategory-5'
                ]
            }, {
                input: 'proximitySearchAttraction',
                names: [
                    'searchCategory-6',
                    'searchCategory-7',
                    'searchCategory-8',
                    'searchCategory-9',
                    'searchCategory-10'
                ]
            }, {
                input: 'proximitySearchInformation',
                names: [
                    'searchCategory-11',
                ]
            }, {
                input: 'proximitySearchServices',
                names: [
                    'searchCategory-12',
                ]
            }
        ];
    },

    setCircuit: function(circuitMarker) {
        this.circuitMarker = circuitMarker;
        this.proximitySearch = this.doCircuitProximitySearch;
    },
    
    setToProximitySearch: function() {
        this.proximitySearch = this.doProximitySearch;
    },

    proximitySearch: null,

    doCircuitProximitySearch:  function() {
        var that = this;
        this.circuitMarker.proximitySearching();
        that.createProximityOptions(function(options) {
            bqc.circuits.proximitySearch(this.circuitMarker.json.id, function(id) {
                options.p_parcours_id = id;
                that.circuitMarker.close();
                $(bqc.CHECKBOX_CIRCUIT).checked = false;
                that.searchManager.circuitProximitySearch(options);
            });

           // Nombre de recherches à proximité ventilé par texte de recherche,
           // le texte de recherche
           
           if (options.searchCriterion) {
                        bqc.gaLogger.log ( bqc.params.p_mode_org,
                                           bqc.GAnalyticsStrings.level2.miniFichesSearch,
                                           options.searchCriterion );
           }


           // Nombre  de requêtes de catégories ventilé par l’id de la catégorie
           for(var cat in options){
                if(cat.indexOf("searchCategory") >= 0){
                    var catId = cat.substring(15);
                    /*bqc.gaLogger.log ( bqc.params.p_mode_org,
                                       bqc.GAnalyticsStrings.level2.miniFichesCategory,
                                       catId );*/
                }
            }

        });
    },

    createProximityOptions: function(callback) {
        this.autoSearch = false;
        var options = {
            p_mode: this.mode,
            p_fromSite:this.fromSite

        };

        // *** Google Analytics
        if ( $("proximitySearchAccommodation").checked ) {
            bqc.gaLogger.log ( bqc.params.p_mode_org,
                bqc.GAnalyticsStrings.level2.miniFichesCategory,
                bqc.GAnalyticsStrings.level3.hebergement
                );
        }

        if ( $("proximitySearchAttraction").checked ) {
            bqc.gaLogger.log ( bqc.params.p_mode_org,
                bqc.GAnalyticsStrings.level2.miniFichesCategory,
                bqc.GAnalyticsStrings.level3.acommodation
                );
        }

        if($("proximitySearchInformation").checked){
            bqc.gaLogger.log ( bqc.params.p_mode_org,
                bqc.GAnalyticsStrings.level2.miniFichesCategory,
                '11'
                );
        }

        if($("proximitySearchServices").checked){
            bqc.gaLogger.log ( bqc.params.p_mode_org,
                bqc.GAnalyticsStrings.level2.miniFichesCategory,
                '12'
                );

        }

        options.searchCriterion = bqc.advInputBox.getValue($('proximitySearchInput'));
        options.searchCriterion = (options.searchCriterion == null ||
            options.searchCriterion.length > bqc.SEARCH_MAXCHAR) ?
                '' : bqc.trim(options.searchCriterion);
        var hasCriteria = false;
        for (var i = 0; i < this.searchCriteria.length; ++i) {
            var criteria = this.searchCriteria[i];
            var checked = $(criteria.input).checked;
            if (checked) {
                for (var j = 0; j < criteria.names.length; ++j) {
                    options[criteria.names[j]] = 'visible';
                }
                hasCriteria = true;
            } else {
                for (j = 0; j < criteria.names.length; ++j) {
                    delete options[criteria.names[j]];
                }
            }
        }
        if (hasCriteria || options.searchCriterion.length >= 3) {
            options.p_offset = 0;
            callback.apply(this, [options]);
        } else if (options.searchCriterion.length < 3) {
            this.resetProximity();
            this.searchManager.clearReferenceMarker();
            this.searchManager.clearSearch();
            bqc.resultList.showList();
            bqc.resultList.showError(bqc.locale.search.errCharacter);
        }
    },

    doProximitySearch: function() {
      

        this.createProximityOptions(function(options) {
            var cats = "";
            
            for(var cat in options){
                if(cat.indexOf("searchCategory") >= 0){
                    var catId = cat.substring(15);
                    /*bqc.gaLogger.log ( bqc.params.p_mode_org,
                                       bqc.GAnalyticsStrings.level2.miniFichesCategory,
                                       catId );*/
                                           
                    if(options[cat] == "visible"){
                        if(cats == ""){
                            cats += catId;
                        }else{
                            cats += "," + catId;
                        }
                    }
                }
            }
            var that = this;
            this.options.p_srcAddId = this.options.servicePointAddId;
            this.options.p_offset = 0;
            this.searchManager.proximitySearch(this.options.servicePointAddId,
                options, function() {
                    that.options.p_addId = that.options.p_srcAddId;
                    that.close();
                    that.autoSearch = true;
                }, this.currentMarker, false, cats);

           // Nombre de recherches à proximité ventilé par texte de recherche,
           // le texte de recherche
           if (options.searchCriterion) {
                        bqc.gaLogger.log ( bqc.params.p_mode_org,
                                           bqc.GAnalyticsStrings.level2.miniFichesSearch,
                                           options.searchCriterion );
           }


          
           
           
        });
    },

    routeFromText: function(text) {
        this.resetOptions();
        this.options.routingFromAddress = text;
        this.options.p_addId = this.options.servicePointAddId;
        bqc.gaLogger.log(bqc.params.p_mode_org, bqc.GAnalyticsStrings.level2.routingSearch, bqc.GAnalyticsStrings.level3.miniFiche);
        this.route();
    },

    routeToText: function(text) {
        this.resetOptions();
        this.options.routingFromAddId = this.options.servicePointAddId;
        this.options.routingToAddress = text;
        bqc.gaLogger.log(bqc.params.p_mode_org, bqc.GAnalyticsStrings.level2.routingSearch, bqc.GAnalyticsStrings.level3.miniFiche);
        this.route();
    },

    routeFromSrcPOI: function() {
        this.resetOptions();
        this.options.routingFromAddId = this.options.p_srcAddId;
        this.options.routingToAddId = this.options.servicePointAddId;
        this.options.comingFromProximity = true;
        this.route();
        delete this.options.comingFromProximity;
    },

    routeToSrcPOI: function() {
        this.resetOptions();
        this.options.routingFromAddId = this.options.servicePointAddId;
        this.options.routingToAddId = this.options.p_srcAddId;
        this.options.comingFromProximity = true;
        this.route();
        delete this.options.comingFromProximity;
    },

    routeFromPOI: function(poi) {
        if (poi != -1) {
            this.resetOptions();
            this.options.routingFromAddId = poi;
            this.options.p_addId = this.options.servicePointAddId;
            this.route();
        }
    },

    routeToPOI: function(poi) {
        if (poi != -1) {
            this.resetOptions();
            this.options.routingFromAddId = this.options.servicePointAddId;
            this.options.routingToAddId = poi;
            this.options.p_addId = this.options.servicePointAddId;
            this.options.comingFromProximity = true;
            this.route();
            delete this.options.comingFromProximity;
        }
    },

    resetOptions: function() {
        delete this.options.routingToAddress;
        delete this.options.routingFromAddress;
        delete this.options.routingFromAddId;
        delete this.options.routingToAddId;
        delete this.options.comingFromProximity;
    },

    route: function() {
        bqc.spider.clearSpidered();
        this.routingForm.isGoogleAnalyticsDone = true;
        this.routingForm.setOptions(this.options);
        this.close();
    },

    createParam: function(value) {
        return (value == undefined) ? null : value;
    },

    createParams: function(addId, fromSite, siteId, qpg) {
        return {
            p_addId: this.createParam(addId),
            p_qpgId: this.createParam(qpg),
            p_siteId: this.createParam(siteId),
            p_fromsite: this.createParam(fromSite),
            p_lcode: this.createParam(bqc.locale.lcode),
            ticket: this.createParam(bqc.params.ticket)
        };
    },

    createUrl: function(url, params) {
        return url + '?' + $H(params).toQueryString();
    },

    popup: function(tooId) {
        createPopupWindow(this.createUrl(bqc.callbackUrl,
            this.createParams(tooId, this.options.p_fromSite,
                bqc.params.p_siteId, bqc.params.p_qpgId)),'carto');
    },

    circuitPopup: function(tooId, siteId) {
        createPopupWindow(this.createUrl(bqc.callbackUrl,
            this.createParams(tooId, 'CIRCUIT', siteId, 73)),'carto');
    }
});
