X-Git-Url: https://dev.renevier.net/?a=blobdiff_plain;f=public%2Fjs%2Fsyj.js;h=b3c8d800cbe3a5a74f2eb9ab812958a99d6d345a;hb=db98e1f62272cff0b425133aa3b909c5cfa6183d;hp=44dd2ff6d4aba093b7b363fe6594e7f5ac095553;hpb=ce001229accb2aff799560eec402344f0dbb1762;p=syj.git diff --git a/public/js/syj.js b/public/js/syj.js index 44dd2ff..b3c8d80 100644 --- a/public/js/syj.js +++ b/public/js/syj.js @@ -14,18 +14,6 @@ var SyjSaveUI = { return this; }, - hide: function() { - $("geom_submit").blur(); - $("geom_title").blur(); - $("geomform").hide(); - return this; - }, - - show: function() { - $("geomform").show(); - return this; - }, - enable: function() { if (this.status === "enabled") { return this; @@ -52,6 +40,7 @@ var SyjSaveUI = { enableSubmit: function() { $("geom_submit").disabled = false; + $("geom_accept").disabled = false; this.status = "partial"; return this; }, @@ -59,23 +48,30 @@ var SyjSaveUI = { disableSubmit: function() { $("geom_submit").blur(); $("geom_submit").disabled = true; + $("geom_accept").blur(); + $("geom_accept").disabled = true; this.status = "partial"; return this; } }; -var SyjEditUI = { - hide: function() { - $("edit-btn").blur(); - $("edit-btn").hide(); - return this; - }, - - show: function() { - $("edit-btn").show(); - return this; - } -}; +var SYJDataUi = (function() { + var deck = null, + getdeck = function() { + if (!deck) { + deck = new Deck("data_controls"); + } + return deck; + }; + return { + viewmode: function() { + getdeck().setIndex(0); + }, + editmode: function() { + getdeck().setIndex(1); + } + }; +}()); OpenLayers.Handler.SyjModifiablePath = OpenLayers.Class(OpenLayers.Handler.ModifiablePath, { mouseup: function(evt) { @@ -210,6 +206,8 @@ var SYJView = { map: null, wkt: new OpenLayers.Format.WKT({ internalProjection: Mercator, externalProjection: WGS84 }), needsFormResubmit: false, + unsavedRoute: null, + mode: 'view', init: function() { var externalGraphic, baseURL, baseLayer, layerOptions, extent, hidemessenger; @@ -232,25 +230,46 @@ var SYJView = { layerOptions = {format: OpenLayers.Format.WKT, projection: WGS84, - styleMap: styleMap.view}; - if (gLoggedInfo.creatorname) { - layerOptions.attribution = SyjStrings.routeBy + ' ' + '' + gLoggedInfo.creatorname + ''; - } + styleMap: styleMap.view, + attribution: SyjStrings.geomAttribution }; this.viewLayer = new OpenLayers.Layer.Vector("View Layer", layerOptions); this.map.addLayers([baseLayer, this.viewLayer]); - $("edit-btn").observe('click', (function() { - this.messenger.hide(); - this.editMode(); - }).bind(this)); + if ($("edit-btn")) { + $("edit-btn").observe('click', function() { + $("geom_submit").value = SyjStrings.editAction; + this.messenger.hide(); + this.editMode(); + this.mode = 'edit'; + }.bind(this)); + } + + if ($("create-btn")) { + $("create-btn").observe('click', function() { + $("geom_submit").value = SyjStrings.createAction; + this.messenger.hide(); + this.editMode(); + this.mode = 'create'; + }.bind(this)); + } + + if ($("clone-btn")) { + $("clone-btn").observe('click', function() { + $("geom_submit").value = SyjStrings.cloneAction; + $("geom_title").value = ""; + this.messenger.hide(); + this.editMode(); + this.mode = 'create'; + }.bind(this)); + } $("geomform").ajaxize({ presubmit: this.prepareForm.bind(this), onSuccess: this.saveSuccess.bind(this), onFailure: this.saveFailure.bind(this) }); - SyjSaveUI.init().hide(); + SyjSaveUI.init(); this.messenger = $('message'); hidemessenger = this.messenger.empty(); @@ -263,8 +282,8 @@ var SYJView = { this.messenger.hide(); } - if ($("geom_data").value) { - this.viewLayer.addFeatures([this.wkt.read($("geom_data").value)]); + if (typeof gInitialGeom !== "undefined" && typeof gInitialGeom.data !== "undefined") { + this.viewLayer.addFeatures([this.wkt.read(gInitialGeom.data)]); extent = this.viewLayer.getDataExtent(); // XXX: ie has not guessed height of map main div yet during map // initialisation. Now, it will read it correctly. @@ -291,7 +310,7 @@ var SYJView = { return false; } - var line, realPoints, idx, handler; + var line, realPoints, idx; line = new OpenLayers.Geometry.LineString(); realPoints = this.editControl.handler.realPoints; @@ -299,21 +318,31 @@ var SYJView = { line.addComponent(realPoints[idx].geometry.clone()); } this.viewLayer.addFeatures(new OpenLayers.Feature.Vector(line)); - handler = this.editControl.handler; - OpenLayers.Handler.ModifiablePath.prototype.finalize.apply(handler, arguments); - // we need to recreate them on next createFeature; otherwise - // they'll reference destroyed features - delete(handler.handlers.drag); - delete(handler.handlers.feature); - this.editControl.deactivate(); + + this.viewMode(); $("geom_data").value = this.wkt.write(new OpenLayers.Feature.Vector(line)); + if (this.mode === "edit" && typeof gLoggedInfo.pathid !== "undefined") { + $("geomform").setAttribute("action", "path/" + gLoggedInfo.pathid.toString() + '/update'); + } else { + $("geomform").setAttribute("action", "path"); + } this.needsFormResubmit = false; SyjSaveUI.disable.bind(SyjSaveUI).defer(); this.messenger.hide(); return true; }, + viewMode: function() { + var handler = this.editControl.handler; + OpenLayers.Handler.ModifiablePath.prototype.finalize.apply(handler, arguments); + // we need to recreate them on next createFeature; otherwise + // they'll reference destroyed features + delete(handler.handlers.drag); + delete(handler.handlers.feature); + this.editControl.deactivate(); + }, + editMode: function() { var components, point0, point, pixels, pixel, idx; @@ -334,15 +363,19 @@ var SYJView = { } this.editControl.handler.addPoints(pixels); } + this.unsavedRoute = { + features: this.viewLayer.features.invoke('clone'), + title: $("geom_title").value + }; } this.viewLayer.destroyFeatures(); - SyjEditUI.hide(); + SYJDataUi.editmode(); if (this.editControl.handler.realPoints && this.editControl.handler.realPoints.length >= 2) { - SyjSaveUI.show().disableSubmit(); + SyjSaveUI.disableSubmit(); } else { - SyjSaveUI.show().disable(); + SyjSaveUI.disable(); } }, @@ -356,10 +389,13 @@ var SYJView = { this.editControl = new OpenLayers.Control.DrawFeature(new OpenLayers.Layer.Vector(), OpenLayers.Handler.SyjModifiablePath, { callbacks: { modify: function(f, line) { + if (!SYJView.unsavedRoute) { + SYJView.unsavedRoute = {}; + } if (this.handler.realPoints.length < 2) { - SyjSaveUI.show().disable(); + SyjSaveUI.disable(); } else { - SyjSaveUI.show().enable(); + SyjSaveUI.enable(); } } }, @@ -376,17 +412,40 @@ var SYJView = { styles = this.editControl.handler.layerOptions.styleMap.styles; styles.select = styles.select_for_canvas; } + new CloseBtn($("geomform"), { + style : { + marginRight: "-40px", + marginTop: "-20px" + }, + callback: function(form) { + this.viewMode(); + this.mode = 'view'; + SYJDataUi.viewmode(); + this.messenger.hide(); + + if (this.unsavedRoute && typeof this.unsavedRoute.features !== "undefined") { + this.viewLayer.addFeatures(this.unsavedRoute.features); + } + if (this.unsavedRoute && typeof this.unsavedRoute.title !== "undefined") { + $("geom_title").value = this.unsavedRoute.title; + } else { + $("geom_title").value = ""; + } + this.unsavedRoute = null; + }.bind(this) + }); }, saveSuccess: function(transport) { + this.unsavedRoute = null; + if (transport.responseJSON && (typeof transport.responseJSON.redirect === "string")) { location = transport.responseJSON.redirect; return; } this.messenger.setMessage(SyjStrings.saveSuccess, "success"); - SyjSaveUI.hide(); - SyjEditUI.show(); + SYJDataUi.viewmode(); document.title = $('geom_title').value; }, @@ -540,13 +599,15 @@ var SYJUserClass = Class.create(SYJModalClass, { $$("#user_termsofuse_anchor, #geom_termsofuse_anchor").invoke('observe', "click", function(evt) { if (!this.toubox) { - $("termsofusearea").show(); - $("termsofuseiframe").setAttribute("src", evt.target.href); this.toubox = new SimpleBox($("termsofusearea"), { closeMethods: ["onescapekey", "onouterclick", "onbutton"] }); } this.toubox.show(); + if (!$("termsofuseiframe").getAttribute("src")) { + $("termsofusearea").show(); + $("termsofuseiframe").setAttribute("src", evt.target.href); + } evt.stop(); }.bindAsEventListener(this)); @@ -577,18 +638,7 @@ var SYJUserClass = Class.create(SYJModalClass, { } }.bindAsEventListener(this)); - $("account-info").hide(); - $("account-info-bullet").observe('click', function(evt) { - var elt = $("account-info"); - if (elt.visible()) { - evt.target.src = "icons/bullet_arrow_right.png"; - elt.hide(); - } else { - evt.target.src = "icons/bullet_arrow_down.png"; - elt.show(); - } - evt.stop(); - }); + $('account-create-anchor').insert({after: new Toggler('account-info').element}); }, presubmit: function() { @@ -713,11 +763,21 @@ var SYJLoginClass = Class.create(SYJModalClass, { }, success: function(transport) { - if (transport.responseText === "1") { - LoginMgr.login(true); - } else { - LoginMgr.login(); + if (!transport.responseJSON || + typeof transport.responseJSON.iscreator !== "boolean" || + typeof transport.responseJSON.pseudo !== "string" + ) { + this.messenger.setMessage(SyjStrings.unknownError, "error"); + return; } + LoginMgr.login(transport.responseJSON.iscreator); + $$('.logged-pseudo').each(function(elt) { + $A(elt.childNodes).filter(function(node) { + return (node.nodeType === 3 || node.tagName.toLowerCase() === 'br'); + }).each(function(node) { + node.nodeValue = node.nodeValue.replace('%s', transport.responseJSON.pseudo); + }); + }); SYJView.messenger.setMessage(SyjStrings.loginSuccess, "success"); this.modalbox.hide(); if (SYJView.needsFormResubmit) { @@ -791,10 +851,12 @@ var LoginMgr = Object.extend(gLoggedInfo, { $$(".logged-show").invoke('hide'); } - if (this.iscreator) { - $("data_controls").show(); - } else { - $("data_controls").hide(); + if ($("edit-btn")) { + if (this.iscreator && SYJView.mode === 'view') { + $("edit-btn").show(); + } else { + $("edit-btn").hide(); + } } }, @@ -825,7 +887,7 @@ var PseudoChecker = { $("user_pseudo").up('tr').insert({after: row}); this.messageelt = new Element('span'); - this.throbber = new Element("img", { src: "icons/pseudo-throbber.gif"}); + this.throbber = new Element("img", { src: "icons/throbber.gif"}); row.down('div').insert(this.throbber).insert(this.messageelt); } if (throbber) { @@ -900,11 +962,162 @@ var PseudoChecker = { } }; +var Nominatim = (function() { + var presubmit = function() { + var input = $("nominatim-search"); + if (input.value.strip().empty()) { + $("nominatim-message").setMessage(SyjStrings.notEmptyField, "warn"); + input.activate(); + return false; + } + $("nominatim-suggestions").hide(); + $("nominatim-message").hide(); + $("nominatim-throbber").show(); + return true; + }; + + var zoomToExtent = function(bounds) { // we must call map.setCenter with forceZoomChange to true. See ol#2798 + var center = bounds.getCenterLonLat(); + if (this.baseLayer.wrapDateLine) { + var maxExtent = this.getMaxExtent(); + bounds = bounds.clone(); + while (bounds.right < bounds.left) { + bounds.right += maxExtent.getWidth(); + } + center = bounds.getCenterLonLat().wrapDateLine(maxExtent); + } + this.setCenter(center, this.getZoomForExtent(bounds), false, true); + } + + var success = function(transport) { + $("nominatim-throbber").hide(); + + if (!transport.responseJSON || !transport.responseJSON.length) { + $("nominatim-message").setMessage(SyjStrings.noResult, 'error'); + $("nominatim-search").activate(); + return; + } + + var place = transport.responseJSON[0], + bbox = place.boundingbox; + + if (!bbox || bbox.length !== 4) { + $("nominatim-message").setMessage(SyjStrings.requestError, 'error'); + return; + } + + extent = new OpenLayers.Bounds(bbox[2], bbox[1], bbox[3], bbox[0]).transform(WGS84, Mercator); + zoomToExtent.call(SYJView.map, extent); + + $("nominatim-suggestions-list").update(); + + var clickhandler = function(bbox) { + return function(evt) { + evt.stop(); + var extent = new OpenLayers.Bounds(bbox[2], bbox[1], bbox[3], bbox[0]).transform(WGS84, Mercator); + $("nominatim-suggestions-list").select("li").invoke('removeClassName', 'current'); + evt.target.up('li').addClassName('current'); + SYJView.map.zoomToExtent(extent); + }; + }; + + for (var i = 0; i < transport.responseJSON.length; i++) { + var item = transport.responseJSON[i]; + if (item.display_name && item.boundingbox && item.boundingbox.length === 4) { + var li = new Element("li"); + var anchor = new Element("a", { + href: "", + className: "nominatim-suggestions-link" + }); + + anchor.observe('click', clickhandler(item.boundingbox)); + + var text = document.createTextNode(item.display_name); + var icon = new Element("img", { + className: "nominatim-suggestions-icon", + src: item.icon || 'icons/world.png' + }); + anchor.appendChild(text); // insert does not work; see prototype #1125 + li.insert(icon).insert(anchor); + $("nominatim-suggestions-list").insert(li); + if ($("nominatim-suggestions-list").childNodes.length >= 6) { + break; + } + } + } + + if ($("nominatim-suggestions-list").childNodes.length > 1) { + $("nominatim-suggestions").show(); + $("nominatim-suggestions-list").select("li:first-child")[0].addClassName('current'); + } else { + $("nominatim-suggestions").hide(); + } + + }; + + var failure = function(transport) { + $("nominatim-throbber").hide(); + + var httpCode = 0, message = SyjStrings.unknownError, input; // default message error + + if (transport) { + httpCode = transport.getStatus(); + } + + switch (httpCode) { + case 0: + message = SyjStrings.notReachedError; + break; + case 400: + case 404: + message = SyjStrings.requestError; + break; + case 500: + message = SyjStrings.serverError; + break; + } + + $("nominatim-message").setMessage(message, 'error'); + }; + + return { + init: function() { + if (!$("nominatim-form")) { + return; + } + $("nominatim-controls").hide(); + $("nominatim-label").observe('click', function(evt) { + $("nominatim-controls").show(); + $("nominatim-search").activate(); + evt.stop(); + }); + + $("nominatim-form").ajaxize({ + presubmit: presubmit, + onSuccess: success, + onFailure: failure + }); + new CloseBtn($("nominatim-suggestions")); + + $$("#nominatim-message, #nominatim-suggestions, #nominatim-throbber").invoke('hide'); + } + }; +}()); document.observe("dom:loaded", function() { SYJLogin.init(); SYJUser.init(); + SYJDataUi.viewmode(); SYJView.init(); SYJNewpwd.init(); LoginMgr.updateUI(); + Nominatim.init(); }); + +window.onbeforeunload = function() { + if (SYJView.unsavedRoute) { + return SyjStrings.unsavedConfirmExit; + } else { + return undefined; + } +};