]> dev.renevier.net Git - syj.git/blobdiff - public/js/syj.js
general class for accout info toggler
[syj.git] / public / js / syj.js
index 44dd2ff6d4aba093b7b363fe6594e7f5ac095553..39ecd4f90bdf86b8321054ead2e08f823a28612d 100644 (file)
@@ -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 + ' ' + '<strong>' + gLoggedInfo.creatorname + '</strong>';
-        }
+                        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();
+            }
         }
     },
 
@@ -904,7 +966,15 @@ var PseudoChecker = {
 document.observe("dom:loaded", function() {
     SYJLogin.init();
     SYJUser.init();
+    SYJDataUi.viewmode();
     SYJView.init();
     SYJNewpwd.init();
     LoginMgr.updateUI();
 });
+window.onbeforeunload = function() {
+    if (SYJView.unsavedRoute) {
+        return SyjStrings.unsavedConfirmExit;
+    } else {
+        return undefined;
+    }
+};