X-Git-Url: https://dev.renevier.net/?a=blobdiff_plain;f=public%2Fjs%2Fsyj.js;h=85db31ac775e901508f4b65116bf498449d94fcb;hb=d52fa81549b32a16a59b17732adb19a0c6559cc1;hp=bfd0a64e7a7bd22cbb7cd50ab4d5b0e29997c75a;hpb=c1aeb7538786d8c9f3b3337c0b71e21ef89d9c77;p=syj.git diff --git a/public/js/syj.js b/public/js/syj.js index bfd0a64..85db31a 100644 --- a/public/js/syj.js +++ b/public/js/syj.js @@ -1,4 +1,4 @@ -/* This file is part of Syj, Copyright (c) 2010 Arnaud Renevier, +/* This file is part of Syj, Copyright (c) 2010-2011 Arnaud Renevier, and is published under the AGPL license. */ // avoid openlayers alerts @@ -100,7 +100,12 @@ var SYJDataUi = (function() { if (!infotoggler) { infotoggler = new Toggler('path-infos-content'); $("path-infos-toggler").insert({bottom: infotoggler.element}); - $("path-infos-anchor").observe('click', function(evt) { + var anchor = $("path-infos-anchor"); + var parent = anchor.up('.menu-item'); + if (parent) { + anchor = parent; + } + anchor.observe('click', function(evt) { evt.stop(); infotoggler.toggle(evt); }); @@ -283,7 +288,11 @@ var SYJView = { theme: null }); - baseLayer = new OpenLayers.Layer.OSM("OSM", null, { wrapDateLine: true , attribution: SyjStrings.osmAttribution }); + 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 }); layerOptions = {format: OpenLayers.Format.WKT, projection: WGS84, @@ -350,7 +359,69 @@ var SYJView = { } $("map-overlay").hide(); - $("geom_upload").observe('change', function() { + $("geom_upload").observe('change', function(evt) { + var file = null, reader = null, readerror = null; + if (window.FileList && window.FileReader) { + file = evt.target.files[0]; + reader = new FileReader(); + readerror = function() { + 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']; + + $("geom_upload_container").removeClassName("disabled"); + $("geom_upload").disabled = false; + if (evt.error) { + readerror(); + return; + } + data = evt.target.result; + + for (i = 0; i < formats.length; i++) { + engine = new OpenLayers.Format[formats[i]]({ internalProjection: Mercator, externalProjection: WGS84 }); + try { + results = engine.read(data); + } catch(e) { + } + if (results && results.length) { + break; + } + } + if (!results || !results.length) { + readerror(); + return; + } + + vector = results[0]; + if (vector.geometry.CLASS_NAME !== "OpenLayers.Geometry.LineString") { + readerror(); + return; + } + this.viewLayer.addFeatures([vector]); + this.map.zoomToExtent(this.viewLayer.getDataExtent()); + + if ($("edit-btn")) { + $("edit-btn").click(); + } else if ($("create-btn")) { + $("create-btn").click(); + } + + if (this.editControl.handler.realPoints.length < 2) { + SyjSaveUI.disable(); + } else { + SyjSaveUI.enable(); + } + + if (vector.data && vector.data.name) { + $("geom_title").value = vector.data.name; + } + }.bind(this); + $("geom_upload_container").addClassName("disabled"); + $("geom_upload").disabled = true; + reader.readAsText(file); + return; + } $("map-overlay").show(); SyjSaveUI.enable(); this.editControl.deactivate(); @@ -365,7 +436,7 @@ var SYJView = { if (aPos.hasOwnProperty('lon') && aPos.hasOwnProperty('lat') && aPos.hasOwnProperty('zoom')) { center = new OpenLayers.LonLat(parseFloat(aPos.lon), parseFloat(aPos.lat)).transform(WGS84, Mercator); - zoom = parseInt(aPos.zoom); + zoom = parseInt(aPos.zoom, 10); } else if (aPos.hasOwnProperty('minlon') && aPos.hasOwnProperty('minlat') && aPos.hasOwnProperty('maxlon') && aPos.hasOwnProperty('maxlat')) { extent = new OpenLayers.Bounds(aPos.minlon, aPos.minlat, aPos.maxlon, aPos.maxlat) @@ -379,6 +450,13 @@ var SYJView = { } else { this.map.setCenter(center, zoom); } + this.resizeMap(); + }, + + resizeMap: function() { + var map = $('map'); + map.style.width = map.offsetWidth.toString() + 'px'; + map.style.height = map.offsetHeight.toString() + 'px'; }, observer: function(evt) { @@ -498,8 +576,9 @@ var SYJView = { } }, create: function(f, line) { + this.messenger.hide(); $("geom_upload_container").hide(); - } + }.bind(this) }, handlerOptions: { @@ -517,8 +596,14 @@ var SYJView = { }, saveSuccess: function(transport) { - this.unsavedRoute = null; + // server sends and empty response on success. If we get a response, that + // probably means an error or warning has been printed by server. + if (!transport.responseJSON && transport.responseText.length) { + this.saveFailure(null, 500); + return; + } + this.unsavedRoute = null; if (transport.responseJSON && (typeof transport.responseJSON.redirect === "string")) { location = transport.responseJSON.redirect; return; @@ -529,12 +614,12 @@ var SYJView = { document.title = $('geom_title').value; }, - saveFailure: function(transport) { - var httpCode = 0, message = ""; - - if (transport) { - httpCode = transport.getStatus(); + saveFailure: function(transport, httpCode) { + var message = ""; + if (typeof httpCode === "undefined") { + httpCode = transport? transport.getStatus(): 0; } + switch (httpCode) { case 0: message = SyjStrings.notReachedError; @@ -542,15 +627,6 @@ var SYJView = { case 400: case 404: message = SyjStrings.requestError; - if (transport.responseJSON) { - switch (transport.responseJSON.message) { - case "uniquepath": - message = SyjStrings.uniquePathError; - break; - default: - break; - } - } break; case 403: message = ""; @@ -591,7 +667,12 @@ var SYJModalClass = Class.create({ closeMethods: ["onescapekey", "onouterclick", "onbutton"] }); - $(this.type + "_control_anchor").observe("click", function(evt) { + var anchor = $(this.type + '_control_anchor'); + var parent = anchor.up('.menu-item'); + if (parent) { + anchor = parent; + } + anchor.observe("click", function(evt) { this.modalbox.show(); evt.stop(); }.bindAsEventListener(this)); @@ -624,7 +705,7 @@ var SYJModalClass = Class.create({ input = this.area.select('input[type="text"]')[0]; (function () { input.activate(); - }).defer(); + }.defer()); } else { this.modalbox.hide(); } @@ -1212,3 +1293,7 @@ window.onbeforeunload = function() { return undefined; } }; + +window.onresize = function() { + SYJView.resizeMap(); +};