]> dev.renevier.net Git - syj.git/blobdiff - public/js/syj.js
merge linestrings for gpx containting multiple trkseg elements.
[syj.git] / public / js / syj.js
index ed68bcf7a43b383751b66bfee28fee785079075f..8f5f509020fd0f6251055213aa3d050169f963fe 100644 (file)
@@ -1,11 +1,15 @@
 /*  This file is part of Syj, Copyright (c) 2010-2011 Arnaud Renevier,
     and is published under the AGPL license. */
 
+"use strict";
+
 // avoid openlayers alerts
 OpenLayers.Console.userError = function(error) {
     SYJView.messenger.setMessage(error, "error");
 };
 
+OpenLayers.Layer.Vector.prototype.renderers = ["SVG2", "VML", "Canvas"];
+
 var SyjSaveUI = {
     status: "unknown",
 
@@ -272,7 +276,7 @@ var SYJView = {
     mode: 'view',
 
     init: function() {
-        var externalGraphic, baseURL, osmLayer, layerOptions, hidemessenger, layerCode, parameters;
+        var externalGraphic, baseURL, baseLayer, layerOptions, hidemessenger;
 
         // is svg context, opera does not resolve links with base element is svg context
         externalGraphic = styleMap.edit.styles.select.defaultStyle.externalGraphic;
@@ -283,24 +287,16 @@ var SYJView = {
             controls: [
                 new OpenLayers.Control.Navigation(),
                 new OpenLayers.Control.PanZoom(),
-                this.createLayerSwitcher(),
                 new OpenLayers.Control.Attribution()
             ],
             theme: null
         });
 
-        osmLayer = new OpenLayers.Layer.OSM("OSM", [
+        baseLayer = new OpenLayers.Layer.OSM("OSM", [
                 'http://a.tile.openstreetmap.org/${z}/${x}/${y}.png',
                 'http://b.tile.openstreetmap.org/${z}/${x}/${y}.png',
                 'http://c.tile.openstreetmap.org/${z}/${x}/${y}.png'],
-                { wrapDateLine: true , attribution: SyjStrings.osmAttribution, layerCode: 'O'});
-
-        mapquestLayer = new OpenLayers.Layer.OSM("Mapquest", [
-            'http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png',
-            'http://otile2.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png',
-            'http://otile3.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png',
-            'http://otile4.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png'],
-                { wrapDateLine: true , attribution: SyjStrings.mapquestAttribution, layerCode: 'M'});
+                { attribution: SyjStrings.osmAttribution });
 
         layerOptions = {format:     OpenLayers.Format.WKT,
                         projection: WGS84,
@@ -308,39 +304,12 @@ var SYJView = {
                         attribution: SyjStrings.geomAttribution };
 
         this.viewLayer = new OpenLayers.Layer.Vector("View Layer", layerOptions);
-        this.map.addLayers([osmLayer, mapquestLayer, this.viewLayer]);
-
-        this.map.setBaseLayer(mapquestLayer);
-        layerCode = null;
-        parameters = OpenLayers.Util.getParameters(window.location.href);
-        if (parameters.layer) {
-            layerCode = parameters.layer;
-            try {
-                store.remove('baselayer');
-            } catch(e) {}
-        } else {
-            try {
-                layerCode = store.get('baselayer');
-            } catch(e) {}
-        }
-
-        if (layerCode) {
-            layerCode = layerCode.toUpperCase();
-            var self = this;
-            $([osmLayer, mapquestLayer]).each(function(layer) {
-                if (layer.layerCode === layerCode) {
-                    self.map.setBaseLayer(layer);
-                }
-            });
-        }
-
-
-        this.map.events.register("changebaselayer", this, this.saveBaseLayer);
+        this.map.addLayers([baseLayer, this.viewLayer]);
 
         if ($("edit-btn")) {
             $("edit-btn").observe('click', function() {
                 $("geom_submit").value = SyjStrings.editAction;
-                this.messenger.hide();
+                this.messenger.clearMessages();
                 this.editMode();
                 this.mode = 'edit';
             }.bind(this));
@@ -349,7 +318,7 @@ var SYJView = {
         if ($("create-btn")) {
             $("create-btn").observe('click', function() {
                 $("geom_submit").value = SyjStrings.createAction;
-                this.messenger.hide();
+                this.messenger.clearMessages();
                 this.editMode();
                 this.mode = 'create';
             }.bind(this));
@@ -359,7 +328,7 @@ var SYJView = {
             $("clone-btn").observe('click', function() {
                 $("geom_submit").value = SyjStrings.cloneAction;
                 $("geom_title").value = "";
-                this.messenger.hide();
+                this.messenger.clearMessages();
                 this.editMode();
                 this.mode = 'create';
             }.bind(this));
@@ -403,7 +372,7 @@ var SYJView = {
                     this.messenger.setMessage(SyjStrings.uploadFileError, "warn");
                 }.bind(this);
                 reader.onload = function(evt) {
-                    var data = null, results = null, engine = null, vector = null, i = 0, formats = ['KML', 'GPX', 'GeoJSON'];
+                    var data = null, results = null, engine = null, vector = null, i = 0, format = null, formats = ['KML', 'GPX', 'GeoJSON'];
 
                     $("geom_upload_container").removeClassName("disabled");
                     $("geom_upload").disabled = false;
@@ -414,7 +383,8 @@ var SYJView = {
                     data = evt.target.result;
 
                     for (i = 0; i < formats.length; i++) {
-                        engine = new OpenLayers.Format[formats[i]]({ internalProjection: Mercator, externalProjection: WGS84 });
+                        format = formats[i];
+                        engine = new OpenLayers.Format[format]({ internalProjection: Mercator, externalProjection: WGS84 });
                         try {
                             results = engine.read(data);
                         } catch(e) {
@@ -433,6 +403,12 @@ var SYJView = {
                         readerror();
                         return;
                     }
+                    // merge linestrings for gpx containting multiple trkseg elements.
+                    if (format === 'GPX') {
+                      for (i = 1; i < results.length; i++) {
+                        vector.geometry.addComponents(results[i].geometry.components);
+                      }
+                    }
                     this.viewLayer.addFeatures([vector]);
                     this.map.zoomToExtent(this.viewLayer.getDataExtent());
 
@@ -466,33 +442,6 @@ var SYJView = {
         SYJPathLength.update();
     },
 
-    saveBaseLayer: function(data) {
-        try {
-            store.set('baselayer', data.layer.layerCode);
-        } catch(e) {}
-    },
-
-    createLayerSwitcher: function() {
-        var control = new OpenLayers.Control.LayerSwitcher({roundedCorner: false});
-        // XXX: we need to "live-patch" LayerSwitcher to use our icons. We use
-        // a regexp instead of a string in case OpenLayers is modified and in
-        // case browsers modify the function representation
-        control.loadContents = eval('(function() { return (' + control.loadContents.toString().replace(
-                    /\s*=\s*imgLocation\s*\+\s*['"]layer-switcher-maximize\.png['"]\s*;/,
-                    " = 'icons/layer-switcher-maximize-flipped.png';"
-                    ) + ')}())');
-        var oldMaximizeControl = control.maximizeControl;
-        var self = this;
-        control.maximizeControl = (function(oldfunc) {
-            return function() {
-                oldfunc.apply(control, arguments);
-                self.messenger.hide();
-            };
-        }(control.maximizeControl));
-
-        return control;
-    },
-
     initMaPos: function (aPos) {
         var extent = null, center = null, zoom = 0;
 
@@ -516,7 +465,7 @@ var SYJView = {
 
     observer: function(evt) {
         if (evt.eventName === "simplebox:shown" && evt.memo.element !== $("termsofusearea")) {
-            this.messenger.hide();
+            this.messenger.clearMessages();
         }
     },
 
@@ -552,7 +501,7 @@ var SYJView = {
         }
         this.needsFormResubmit = false;
         SyjSaveUI.disable.bind(SyjSaveUI).defer();
-        this.messenger.hide();
+        this.messenger.clearMessages();
         return true;
     },
 
@@ -631,7 +580,7 @@ var SYJView = {
                     }
                 },
                 create: function(f, line) {
-                    this.messenger.hide();
+                    this.messenger.clearMessages();
                     $("geom_upload_container").hide();
                 }.bind(this)
             },
@@ -800,7 +749,7 @@ var SYJModalClass = Class.create({
     },
 
     reset: function() {
-        this.messenger.hide();
+        this.messenger.clearMessages();
         this.area.select('.message').invoke('setMessageStatus', null);
     }
 });
@@ -813,7 +762,11 @@ var SYJUserClass = Class.create(SYJModalClass, {
         $super();
         $("termsofusearea").hide();
 
-        $$("#user_termsofuse_anchor, #geom_termsofuse_anchor").invoke('observe', "click", function(evt) {
+        var touevt = (function(evt) {
+            if (evt.type === "keyup" && evt.keyCode !== 32) { // 32 = space
+                // allow opening box by pressing space
+                return;
+            }
             if (!this.toubox) {
                 this.toubox = new SimpleBox($("termsofusearea"), {
                     closeMethods: ["onescapekey", "onouterclick", "onbutton"]
@@ -825,7 +778,11 @@ var SYJUserClass = Class.create(SYJModalClass, {
                 $("termsofuseiframe").setAttribute("src", evt.target.href);
             }
             evt.stop();
-        }.bindAsEventListener(this));
+        }).bindAsEventListener(this);
+
+        ["click", "keyup"].each(function (evtName) {
+            $$("#user_termsofuse_anchor, #geom_termsofuse_anchor").invoke('observe', evtName, touevt);
+        })
 
         $$("#login_area_create > a").invoke('observe', 'click',
             function(evt) {
@@ -858,7 +815,7 @@ var SYJUserClass = Class.create(SYJModalClass, {
     },
 
     presubmit: function() {
-        this.messenger.hide();
+        this.messenger.clearMessages();
         PseudoChecker.reset();
         if (!(this.checkNotEmpty("user_pseudo", SyjStrings.userEmptyWarn))) {
             return false;
@@ -976,7 +933,7 @@ var SYJLoginClass = Class.create(SYJModalClass, {
     },
 
     presubmit: function() {
-        this.messenger.hide();
+        this.messenger.clearMessages();
         if (!(this.checkNotEmpty("login_user", SyjStrings.userEmptyWarn))) {
             return false;
         }