﻿/**
 *
 * Gestion de OpenLayers
 *
 */
var map;
var LayerDepartement, LayerCommunes, LayerSites, LayerSitesSurface;
//mode GP et Pro (pas même dossier d'appel
var relPath = "";
//var ModifyControl;
var bPro = false;
var bUpdate = false;
var drawPoint,drawPoly;

OpenLayers.Lang.fr["baseLayer"] = "Fonds graphiques";
OpenLayers.Lang.fr["overlays"] = "Données www.patrimoine-lot.com";

function initmap(refer){
    var options = {
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        units: "m",
        maxResolution: 156543.0339,
        maxExtent: new OpenLayers.Bounds(-738687.44, 4774562.53,
                                         1462698.97, 6878109.55)
    };
    
    var idMap = "map";
    if(refer) idMap = "map_"+refer;
    map = new OpenLayers.Map(idMap, options);
    
    map.zoomToMaxExtent = function() {
        map.setCenter(new OpenLayers.LonLat(177639.65, 5563698.41), 9);
    };

    /*
    var gphy = new OpenLayers.Layer.Google(
        "Google Physical",
        {type: G_PHYSICAL_MAP}
    );
    var gsat = new OpenLayers.Layer.Google(
        "Google Satellite",
        {type: G_SATELLITE_MAP, numZoomLevels: 20}
    );     
    */
    var gmap = new OpenLayers.Layer.Google(
        "Google Streets (cartographie)", // the default
        {sphericalMercator:true, numZoomLevels: 20}
    );
    //gmap.setOpacity(0.2);
    map.addLayer(gmap);
    var ghyb = new OpenLayers.Layer.Google(
        "Google Hybrid (+ photo aérienne)",
        {sphericalMercator:true, type: G_HYBRID_MAP, numZoomLevels: 20}
    );
    map.addLayer(ghyb);
   
    /*
    try{
        addSpecialLayer();
    } catch(e) {};
    */
    layer = new OpenLayers.Layer.WMS( "IGN Scan25",
        "http://www.patrimoine-lot.com/scripts/mapserv.exe?map=D:/_BDD/cg46/wms/scan25.map", 
        {
            layers: 'ign_scan25',
            format: 'image/gif',
            transparent: true
       },{
            visibility: bPro,
            isBaseLayer: false,
            singleTile: true,
            ratio: 1,
            transitionEffect: 'resize',
            maxResolution: 10
        }
    );
    
    map.addLayer(layer);
        
    layer2 = new OpenLayers.Layer.WMS( "CG46 Cadastre",
        "http://www.patrimoine-lot.com/scripts/mapserv.exe?map=D:/_BDD/cg46/wms/cadastre.map", 
        {
            layers: 'cg46_cadastre',
            format: 'image/gif',
            transparent: true
       },{
            visibility: bPro,
            isBaseLayer: false,
            singleTile: true,
            ratio: 1,
            //transitionEffect: 'resize',
            maxResolution: 10
        }
    );
    map.addLayer(layer2);
    
    LayerDepartement = new OpenLayers.Layer.Vector("Département du Lot", {
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                fillColor: "none",
                strokeColor: "gray",
                strokeWidth: 3
            }, OpenLayers.Feature.Vector.style["default"]))
        }),
        projection: map.displayProjection,
        maxResolution: 156543.0339,
        minResolution: 76.43702827148438,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
            url: relPath+"kml/departement.kml",
            format: new OpenLayers.Format.KML({
                /*extractStyles: true,*/
                extractAttributes: true
            })
        })
    });
    
    map.addLayer(LayerDepartement);
    
    if(!bPro) {
        LayerCommunes = new OpenLayers.Layer.Vector("Communes concernées par des données", {
            styleMap: new OpenLayers.StyleMap({
                "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                    externalGraphic: "images/patrimoine.gif",
                    graphicWidth: "${size}",
                    fillOpacity: 0.8
                }, OpenLayers.Feature.Vector.style["default"])),
                "temporary": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                    externalGraphic: "images/patrimoine.gif",
                    graphicWidth: "${size}",
                    fillOpacity: 1
                }, OpenLayers.Feature.Vector.style["temporary"])),
                "select": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                    externalGraphic: "images/patrimoine_sel.gif",
                    graphicWidth: "${size}",
                    fillOpacity: 0.9
                }, OpenLayers.Feature.Vector.style["select"]))
            }),
            projection: map.displayProjection,
            strategies: [new OpenLayers.Strategy.Fixed()],
            protocol: new OpenLayers.Protocol.HTTP({
                url: relPath+"kml/communes.asp?liste="+ListINSEE+"&selection=oui",
                format: new OpenLayers.Format.KML({
                    /*extractStyles: true,*/
                    extractAttributes: true
                })
            }),
            eventListeners: {
                featureselected: function(e) {    
                    var comm = document.getElementById('COM2');
                    var R2_comm = document.getElementById('R2_COM2');
                    if(onglet == 0) { // onglet recherche
                        //recherche.asp > renseigne le input de recherche
                        if(Concat) Concat(comm,'vstyle',', ','text');
                    }
                    
                    if(communesChargees ) { 
                        if(Popup) Popup(e.feature.attributes.insee)
                    }
                },
                featureunselected: function() {
                    //var comm = document.getElementById('vstyle');
                    //if(comm) comm.value = "";
                },
                loadend: function(e) {
                    var bounds = this.getDataExtent();
                    if(bounds) {
                        map.zoomToExtent(bounds);
                        if(map.zoom > 14) map.zoomTo(14);
                    }
                }
            }
        });
        map.addLayer(LayerCommunes);
    }
 
    if(!bUpdate) {
        var urlSiteSurface = relPath+"kml/sites.asp?type=surface&";
        var LayerSitesSurfacevisibility = false;
        if(refer != "") {
            urlSiteSurface += "liste="+refer;
            LayerSitesSurfacevisibility = true;
        }    
        //Affiche les surfaces sur une couche à part en consultation
        //pour afficher/masquer facilement la couche
        LayerSitesSurface = new OpenLayers.Layer.Vector("Edifices ou sites recensés (surfaces)", {
            styleMap: new OpenLayers.StyleMap({
                "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                    fillColor: "#F0F0E0",
                    strokeColor: "#F0BF10",
                    fillOpacity: 0.7
                    
                }, OpenLayers.Feature.Vector.style["default"])),
                "temporary": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                    fillColor: "#F0F0E0",
                    strokeColor: "#603000",
                    fillOpacity:  0.7,
                    label: "${name}",
                    fontSize: "11px",
                    fontFamily: "Arial, monospace"
                }, OpenLayers.Feature.Vector.style["temporary"]))
            }),
            projection: map.displayProjection,
            strategies: [new OpenLayers.Strategy.Fixed()],
            protocol: new OpenLayers.Protocol.HTTP({
                url: urlSiteSurface,
                format: new OpenLayers.Format.KML({
                    /*extractStyles: true,*/
                    extractAttributes: true
                })
            }),
            visibility: LayerSitesSurfacevisibility,
            eventListeners: {
                featureselected: function(e) {
                    var sx = document.getElementById('siteX');
                    if(sx) {
                        //update
                        //ModifyControl.activate();
                        //ModifyControl.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
                    } else {
                        //ouvre la fiche...
                        //if(AffichFiche) AffichFiche(e.feature.attributes.refer);
                        if(showSite) showSite(e.feature.attributes.refer);
                    }
                }
            }
        });
        map.addLayer(LayerSitesSurface);
    }
    
 
    var urlSite = relPath+"kml/sites.asp?type=point&";
    var LayerSitesfillOpacity = 1;
    var LayerSiteslabel = "${name}";
    var LayerSitesvisibility = false;
    if(bUpdate) {
        urlSite = relPath+"kml/sites.asp?";
        LayerSitesfillOpacity = 0.6;
        LayerSiteslabel = "";
    }
    if(refer != "") {
        urlSite += "liste="+refer;
        LayerSitesvisibility = true;
    }    
    LayerSites = new OpenLayers.Layer.Vector("Edifices ou sites recensés", {
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                //externalGraphic: "images/patrimoine.gif",
                graphicYOffset: 10,
                graphicWidth: 25,
                fillColor: "#F0F0E0",
                strokeColor: "#F0BF10",
                fillOpacity: 0.8
            }, OpenLayers.Feature.Vector.style["default"])),
            "temporary": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
                //externalGraphic: "images/patrimoine.gif",
                graphicYOffset: 10,
                graphicWidth: 30,
                fillColor: "#F0F0E0",
                strokeColor: "#603000",
                fillOpacity:  LayerSitesfillOpacity,
                label: LayerSiteslabel,
                fontSize: "11px",
                fontFamily: "Arial, monospace"
            }, OpenLayers.Feature.Vector.style["temporary"]))
        }),
        projection: map.displayProjection,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
            url: urlSite,
            format: new OpenLayers.Format.KML({
                /*extractStyles: true,*/
                extractAttributes: true
            })
        }),
        visibility: LayerSitesvisibility,
        eventListeners: {
            featureselected: function(e) {
                var sx = document.getElementById('siteX');
                if(sx) {
                    //rien...
                } else {
                    //ouvre la fiche...
                    //if(AffichFiche) AffichFiche(e.feature.attributes.refer);
                    if(showSite) showSite(e.feature.attributes.refer);
                }
            },
            featureunselected: function() {
                //var comm = document.getElementById('vstyle');
                //if(comm) comm.value = "";
            },
            
            featureadded: function(obj) {
                if(!bUpdate) return;
                if(!obj) return;
                
                UpdateForm(obj.feature);
            },
            
            sketchstarted: function(obj) {
                if(!bUpdate) return;
                if(!obj) return;
                var z=1;
                if(obj.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
                    return isSitePoint();
                }
                if(obj.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
                    return isSiteSurface();
                }
            },
            
            vertexmodified: function(obj) {
                if(!bUpdate) return;
                if(!obj) return;
                
                UpdateForm(obj.feature);
            },
            
            loadend: function(e) {
                var bounds = this.getDataExtent();
                if(bounds) {
                    map.zoomToExtent(bounds);
                    if(map.zoom > 16) map.zoomTo(16);
                }
            }/**/
        }
    });
    if(!bUpdate) {
        // Classification des ponctuels (sauf pour le mode UPDATE)
        var classif = {
            "Fortifie": {externalGraphic: relPath+"images/fortifié.gif"},
            "Urbain": {externalGraphic: relPath+"images/urbain.gif"},
            "Rural": {externalGraphic: relPath+"images/rural.gif"},
            "Religieux": {externalGraphic: relPath+"images/religieux.gif"},
            "Faune": {externalGraphic: relPath+"images/faune.gif"},
            "Flore": {externalGraphic: relPath+"images/flore.gif"},
            "Geologie": {externalGraphic: relPath+"images/geologie.gif"},
            "Histoire": {externalGraphic: relPath+"images/patrimoine.gif"},
            "Hydrologie": {externalGraphic: relPath+"images/hydrologie.gif"},
            "Archeologie": {externalGraphic: relPath+"images/archeologie.gif"},
            "Industriel": {externalGraphic: relPath+"images/industriel.gif"},
            "Naturel": {externalGraphic: relPath+"images/paysage.gif"},
            "Technique": {externalGraphic: relPath+"images/patrimoine.gif"},
            "Tradition": {externalGraphic: relPath+"images/patrimoine.gif"},
            "Defaut": {externalGraphic: relPath+"images/patrimoine.gif"}
        }
        // add rules from the above lookup table, with the keyes mapped to
        // the "type" property of the features, for the "default" intent
        LayerSites.styleMap.addUniqueValueRules("default", "class", classif);
        LayerSites.styleMap.addUniqueValueRules("temporary", "class", classif);
        LayerSites.styleMap.addUniqueValueRules("select", "class", classif);
    }
    map.addLayer(LayerSites);

    map.addControl(new OpenLayers.Control.LayerSwitcher());
    
    var scalebar = new OpenLayers.Control.ScaleBar({
        scaleText: "Echelle 1:",
        abbreviateLabel: true,
        align: 'center'
    });
    map.addControl(scalebar);
 
    if(bUpdate) {
        var panel = new OpenLayers.Control.Panel({
            displayClass: "olControlEditingToolbar"
        });
        drawPoint = new OpenLayers.Control.DrawFeature(
            LayerSites, OpenLayers.Handler.Point,
            {
                title: "Placer le Site",
                displayClass: "olControlDrawFeaturePoint",
                eventListeners: {
                    activate : isSitePoint
                }
            }
        );
        drawPoly = new OpenLayers.Control.DrawFeature(
            LayerSites, OpenLayers.Handler.Polygon, 
            {
                title: "Dessiner une surface",
                displayClass: "olControlDrawFeaturePolygon", 
                eventListeners: {
                    activate : isSiteSurface
                }
            }
        );
        modify = new OpenLayers.Control.ModifyFeature(
            LayerSites, 
            {displayClass: "olControlModifyFeature", title: "Déplacer le site, Modifier la surface"}
        );
        panel.addControls([
            new OpenLayers.Control.Navigation({title: "Déplacer la carte"}),
            drawPoint, drawPoly, modify
        ]);
        map.addControl(panel);
    }else{
        if(refer) {
            var panel = new OpenLayers.Control.Panel({
                displayClass: "olControlEditingToolbar"
            });
            var button = new OpenLayers.Control.Button({
                displayClass: "olControlExportKml",
                title: "Export KML",
                trigger: function() {
                    window.open('kml/sites.asp?format=kml&liste='+refer,'GoogleEarth','fullscreen=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=500,height=550,top=5,left=50,dependent=yes,true');
                }
            });
            panel.addControls([button]);
            map.addControl(panel);
        }
    }
    
    if(!bPro) {
        var highlightControl  = new OpenLayers.Control.SelectFeature(
            //LayerCommunes,
            [LayerCommunes, LayerSites, LayerSitesSurface],
            {
                hover: true,
                highlightOnly: true,
                renderIntent: "temporary",
                eventListeners: {
                    featurehighlighted: function(e) {
                        var comm = document.getElementById('COM2');
                        if(comm) comm.value = e.feature.attributes.name;
                        // recherche approfondie
                        var R2_comm = document.getElementById('R2_COM2');
                        if(R2_comm) R2_comm.value = e.feature.attributes.name;
                        
                        
                        var panier = document.getElementById('panier');
                        if(panier){
                            var li = document.getElementById(e.feature.attributes.refer);
                            if(li) li.style.border = "1px solid red";
                        }
                    },
                    featureunhighlighted: function(e) {
                        var comm = document.getElementById('COM2');
                        if(onglet == 0) comm.value = "";
                        
                        // recherche approfondie
                        var R2_comm = document.getElementById('R2_COM2');
                        if(onglet == 1) R2_comm.value ="";
                        
                        var panier = document.getElementById('panier');
                        if(panier){
                            var li = document.getElementById(e.feature.attributes.refer);
                            if(li) li.style.border = "1px solid #BFB77F";
                        }
                    }
                }
            }
        );
        map.addControl(highlightControl);
        highlightControl.activate();
        
        var selectControl = new OpenLayers.Control.SelectFeature(
            //LayerCommunes,
            [LayerCommunes, LayerSites, LayerSitesSurface],
            {
                clickout: true,
                toggle: false,
                multiple: false//, hover: false,
                //toggleKey: "ctrlKey", // ctrl key removes from selection
                //multipleKey: "shiftKey" // shift key adds to selection
            }
        );
        map.addControl(selectControl);
        selectControl.activate();
    }
    
    map.setCenter(new OpenLayers.LonLat(177639.65, 5563698.41), 9);
}

function loadSites(refer) {
    if(!LayerSites) return;
    if(LayerDepartement) LayerDepartement.setVisibility(false);
    if(LayerCommunes) LayerCommunes.setVisibility(false);
    LayerSites.setVisibility(true);

    var urlSite = relPath+"kml/sites.asp?type=point&liste="+refer;
    if(bUpdate) urlSite = relPath+"kml/sites.asp?liste="+refer;
    
    LayerSites.strategies[0].load({
        url: urlSite
    });
    if(LayerSitesSurface) { 
        LayerSitesSurface.setVisibility(true);
        LayerSitesSurface.strategies[0].load({
            url: relPath+"kml/sites.asp?type=surface&liste="+refer
        });
    }
            var panel = new OpenLayers.Control.Panel({
                displayClass: "olControlEditingToolbar"
            });
            var button = new OpenLayers.Control.Button({
                displayClass: "olControlExportKml",
                title: "Export KML",
                trigger: function() {
                    window.open('kml/sites.asp?format=kml&liste='+refer,'GoogleEarth','fullscreen=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=500,height=550,top=5,left=50,dependent=yes,true');
                }
            });
            panel.addControls([button]);
            map.addControl(panel);
    
}

function loadCommunes(liste, selection) {
    if(!LayerCommunes) return;
    if(!LayerSites) return;

    LayerSites.setVisibility(false);
    if(LayerSitesSurface) LayerSitesSurface.setVisibility(false);
    LayerCommunes.setVisibility(true);
    LayerCommunes.strategies[0].load({
        url: relPath+"kml/communes.asp?liste="+liste+"&selection="+selection
    });
}

function placeSite(x,y) {
    /*
    //if(!LayerSites) return;
    var feature = LayerSites.features[0];
    
    var nPt = new OpenLayers.Geometry.Point(x,y);
    nPt.transform(                            
        new OpenLayers.Projection('EPSG:27572'),
        map.getProjectionObject()
    );
    feature.geometry = nPt;
    //pt.x = nPt.x;
    //pt.y = nPt.y;
    //LayerSites.redraw();
    */
}

function isSitePoint() {
    if(!LayerSites) return true;
    
    for(var f=0 ;f<LayerSites.features.length; f++) {
        if(LayerSites.features[f].geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
            alert("Le site est déjà positionné, veuillez le déplacer.");
            //if(this.deactivate) this.deactivate();
            if(this.drawPoint) this.drawPoint.deactivate();
            return false;
        }
    }
    return true
}

function isSiteSurface() {
    if(!LayerSites) return true;
    
    for(var f=0 ;f<LayerSites.features.length; f++) {
        if(LayerSites.features[f].geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
            alert("Le site (surface) est déjà positionné, veuillez le modifier.");
            //if(this.deactivate) this.deactivate();
            if(this.drawPoly) this.drawPoly.deactivate();
            return false;
        }
    }
    return true
}


function UpdateForm(feature) {
    if(!feature) return;
    
    // ! '$' c via jQuery en gp et mootools en pro :( 
    var sx = document.getElementById('siteX');
    var sy = document.getElementById('siteY');
    var scoorm = document.getElementById('siteCOORM');
    
    if(sx && sy) {
        if(feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
            //Récupère la geométrie...
            var pt = feature.geometry.clone();
            pt.transformed = false;
            //Reprojection des coordonnées en L2e
            pt.transform( 
                map.getProjectionObject(), 
                new OpenLayers.Projection('EPSG:27572')
            );
            
            sx.value = parseInt(pt.x);
            sy.value = parseInt(pt.y);
            
            //désactive l'outil de création : 1 seul objet
            if(this.drawPoint) this.drawPoint.deactivate();
        }
    }
    if(scoorm) {
        if(feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
            //Récupère la geométrie...
            var geom = feature.geometry.clone();
            geom.transformed = false;
            //Reprojection des coordonnées en L2e
            geom.transform( 
                map.getProjectionObject(), 
                new OpenLayers.Projection('EPSG:27572')
            );

            scoorm.value = formatGeom(geom);
            
            //désactive l'outil de création : 1 seul objet
            if(this.drawPoly) this.drawPoly.deactivate();
        }
    }
}

function formatGeom(geom) {
    var components = geom.components[0].components;
    var strings = [];
    for(var i=0, len=components.length; i<len; i++) {
        strings.push(parseInt(components[i].x) + " ; "+ parseInt(components[i].y)); 
    }
    return strings.join("/");
}
