bqc.Router = Class.create({

    initialize: function(map) {
        this.map = map;
        this.options = {};
        this.listeners = [];
        this.eraseButton = $('eraseItinaryBtn');
        this.tooltipManager = null;
        this.searchManager = null;

        this.routeObj = new bqc.Route(this.map, this);
    },

    setTooltipManager: function(tooltipManager) {
        this.tooltipManager = tooltipManager;
    },

    setSearchManager: function(searchManager) {
        this.searchManager = searchManager;
    },

    remove: function() {
        if (this.fromPlacemark != null && this.toPlacemark != null) {
            this.fromPlacemark = null;
            this.toPlacemark = null;
            this.routeObj.clear();
            this.inform(function(listener) {
                listener.cleared();
            });
        }
        if (this.eraseButton != null) {
            bqc.setVisible(this.eraseButton, false);
        }
    },

    addPoint: function(latlng, img) {
        var point = bqc.createPoint(latlng.lat(), latlng.lng(), img);
        this.map.addOverlay(point);
        return point;
    },

    addStartPoint: function(latlng, addToWaypoints) {
        return this.addPoint(latlng, 'Itineraire_point_a.png', addToWaypoints);
    },

    addEndPoint: function(latlng, addToWaypoints) {
        return this.addPoint(latlng, 'Itineraire_point_b.png', addToWaypoints);
    },

    isActive: function(){
        if(this.routeObj){
            return this.routeObj.isActive();
        }
        return false;
    },

    printRoute: function(isMail){
        clearMailPrintForm();
        var mailForm = $("mailPrintForm");
        var input = document.createElement("input");
        input.type = "hidden";
        input.name = "isMail";
        input.id = "isMail";
        input.value = isMail;
        mailForm.appendChild(input);

        var zoomLevel = map.getZoom();
        var center = map.getCenter();
        var centerY = center.lat();
        var centerX = center.lng();
        var bounds = map.getBounds();
        var mapType = getMapType(map);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "longitude";
        input.id = "longitude";
        input.value = centerX;
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "latitude";
        input.id = "latitude";
        input.value = centerY;
        mailForm.appendChild(input);
        
        input = document.createElement("input");
        input.type = "hidden";
        input.name = "mapType";
        input.id = "mapType";
        input.value = mapType;
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "fromTitle";
        input.id = "fromTitle";
        input.value = encodeURIComponent(this.fromPlacemark.displayText);
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "toTitle";
        input.id = "toTitle";
        input.value = encodeURIComponent(this.toPlacemark.displayText);
        mailForm.appendChild(input);
        
        input = document.createElement("input");
        input.type = "hidden";
        input.name = "from";
        input.id = "from";
        input.value = this.fromPlacemark.Point.coordinates[1] + "," + this.fromPlacemark.Point.coordinates[0];
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "to";
        input.id = "to";
        input.value = this.toPlacemark.Point.coordinates[1] + "," + this.toPlacemark.Point.coordinates[0];
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "zoomLevel";
        input.id = "zoomLevel";
        input.value = zoomLevel;
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "p_unit";
        input.id = "p_unit";
        if(bqc.params.p_unit){
            input.value = bqc.params.p_unit.toLowerCase();
        }else{
            input.value = "km";
        }
        mailForm.appendChild(input);

        var visibleSegmentListInfos = "";
        var waypoints = "";
        for (var i = 0; i < bqc.routerDetail.gdir.getNumRoutes(); i++) {
            var route = bqc.routerDetail.gdir.getRoute(i);
            for (var j = 0; j < route.getNumSteps(); j++) {
                var segmentId = j;
                var div = document.getElementById("mapSegmentContainer-" + i + "-" + segmentId);
                var visible = false;
                if (div != null && div.style.display != "none") {
                    visible = true;
                }

                if(bqc.routerDetail.segmentMaps[i]){
                    var segmentMap = bqc.routerDetail.segmentMaps[i][segmentId];
                    if(segmentMap && visible){
                        if (visibleSegmentListInfos != "") {
                            visibleSegmentListInfos += "|";
                        }
                        var zoomLevel = segmentMap.getZoom();
                        var center = segmentMap.getCenter();
                        var centerY = center.lat();
                        var centerX = center.lng();

                        visibleSegmentListInfos += segmentId + "," + centerX + "," + centerY + "," + zoomLevel + "," + getMapType(segmentMap) + "," + i;
                    }
                }
            }
        }

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "visibleSegmentListInfos";
        input.id = "visibleSegmentListInfos";
        input.value = visibleSegmentListInfos;
        mailForm.appendChild(input);

        for(var k = 0; k < this.routeObj.waypoints.length; k++){
            if (waypoints != "") {
                waypoints += "|";
            }
            var point = this.routeObj.waypoints[k].getPoint();
            waypoints += point.lat() + "," + point.lng();
        }
        input = document.createElement("input");
        input.type = "hidden";
        input.name = "waypoints";
        input.id = "waypoints";
        input.value = waypoints;
        mailForm.appendChild(input);

        var addIds = "";
        for(var l = 0; l < bqc.searchManager.markedMarkers.length; l++){
            var addId = bqc.searchManager.markedMarkers[l].json.addId;
            if (addIds != "") {
                addIds += "|";
            }
            addIds += addId;
        }
        input = document.createElement("input");
        input.type = "hidden";
        input.name = "addIds";
        input.id = "addIds";
        input.value = addIds;
        mailForm.appendChild(input);

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "regionPrint";
        input.id = "regionPrint";
        input.value = getRegionValue();
        

        mailForm.appendChild(input);
       
        
        if(bqc.circuits.kml.id && bqc.circuits.kml.id.length){
            input = document.createElement("input");
            input.type = "hidden";
            input.name = "p_circuitId";
            input.id = "p_circuitId";
            input.value = bqc.circuits.kml.id;
            mailForm.appendChild(input);
        }

        if(bqc.params.p_mode){
            input = document.createElement("input");
            input.type = "hidden";
            input.name = "p_mode";
            input.id = "p_mode";
            input.value = bqc.params.p_mode;
            mailForm.appendChild(input);
        }

        if(bqc.params.p_mailBannerId){
            input = document.createElement("input");
            input.type = "hidden";
            input.name = "p_mailBannerId";
            input.id = "p_mailBannerId";
            input.value = bqc.params.p_mailBannerId;
            mailForm.appendChild(input);
        }

        if(bqc.params.p_fromSite){
            input = document.createElement("input");
            input.type = "hidden";
            input.name = "p_fromSite";
            input.id = "p_fromSite";
            input.value = bqc.params.p_fromSite;
            mailForm.appendChild(input);
        }

        if(bqc.params.p_mailto){
            input = document.createElement("input");
            input.type = "hidden";
            input.name = "p_mailto";
            input.id = "p_mailto";
            input.value = bqc.params.p_mailto;
            mailForm.appendChild(input);
        }

        input = document.createElement("input");
        input.type = "hidden";
        input.name = "p_lcode";
        input.id = "p_lcode";
        input.value = bqc.locale.language;
        mailForm.appendChild(input);

        return openPrintEmptyWindow();
    },

    resetRoute: function() {
        this.routeObj.reset();
    },

    addListener: function(listener) {
        this.listeners.push(listener);
    },

    inform: function(callback) {
        for (var i = 0; i < this.listeners.length; ++i) {
            callback.apply(this, [this.listeners[i]]);
        }
    },

    clearPoints: function() {
        this.tooltipManager.resetProximity();
        this.searchManager.clearReferenceMarker();
        this.searchManager.clearSearch();
        bqc.resultList.clear();
    },

    route: function(fromPlacemark, toPlacemark) {
        this.fromPlacemark = fromPlacemark;
        this.toPlacemark = toPlacemark;
        this.clearPoints();
        this.routeObj.load(fromPlacemark, toPlacemark, bqc.locale.language);
    },

    routingFailed: function() {
        bqc.hideLoading();
        bqc.routingForm.failed();
    },

    reverse: function() {
        var temp = this.fromPlacemark;
        this.fromPlacemark = this.toPlacemark;
        this.toPlacemark = temp;
        this.routeObj.reverse();
    },

    routeLoaded: function(gdir, setCenter, updateListeners) {
        bqc.hideLoading();
        var polyline = gdir.getPolyline();
        if (setCenter) {
            this.map.setCenter(polyline.getBounds().getCenter(), this.map.getBoundsZoomLevel(polyline.getBounds()));
            var bounds = getIncreasedBounds(this.map, bqc.itinaryPointAnchor.x, bqc.itinaryPointAnchor.y, bqc.itinaryPointAnchor.x);
            this.map.setCenter(bounds.getCenter(), this.map.getBoundsZoomLevel(bounds));
        }
        if (this.eraseButton != null) {
            bqc.setVisible(this.eraseButton, true);
        }
        if (updateListeners) {
            this.inform(function(listener) {
                listener.route(gdir, this.fromPlacemark.displayText, this.toPlacemark.displayText, !setCenter);
            });
        }
    }
});
