X-Git-Url: https://dev.renevier.net/?a=blobdiff_plain;f=public%2Fjs%2Fsyj.js;h=44dd2ff6d4aba093b7b363fe6594e7f5ac095553;hb=ce001229accb2aff799560eec402344f0dbb1762;hp=b5121d4752a5a56fda3605ae5f1fa26674cb374b;hpb=f3d301cf61cd09ad9089efb5d016e05ce6318bee;p=syj.git diff --git a/public/js/syj.js b/public/js/syj.js index b5121d4..44dd2ff 100644 --- a/public/js/syj.js +++ b/public/js/syj.js @@ -1,20 +1,5 @@ /* This file is part of Syj, Copyright (c) 2010 Arnaud Renevier, and is published under the AGPL license. */ -Element.addMethods('input', { - observe : Element.Methods.observe.wrap(function(proceed, element, eventName, handler) { - if (eventName === "contentchange") { - proceed(element, 'keyup', function(evt) { - if (evt.keyCode === 13) { - return; - } - handler.apply(null, arguments); - }); - proceed(element, 'paste', handler); - return proceed(element, 'change', handler); - } - return proceed(element, eventName, handler); - }) -}); // avoid openlayers alerts OpenLayers.Console.userError = function(error) { @@ -80,10 +65,6 @@ var SyjSaveUI = { }; var SyjEditUI = { - init: function() { - return this; - }, - hide: function() { $("edit-btn").blur(); $("edit-btn").hide(); @@ -231,7 +212,7 @@ var SYJView = { needsFormResubmit: false, init: function() { - var externalGraphic, baseURL, baseLayer, layerOptions, extent = null, hidemessenger; + var externalGraphic, baseURL, baseLayer, layerOptions, extent, hidemessenger; // is svg context, opera does not resolve links with base element is svg context externalGraphic = styleMap.edit.styles.select.defaultStyle.externalGraphic; @@ -263,7 +244,6 @@ var SYJView = { this.messenger.hide(); this.editMode(); }).bind(this)); - SyjEditUI.init().hide(); $("geomform").ajaxize({ presubmit: this.prepareForm.bind(this), @@ -283,18 +263,15 @@ var SYJView = { this.messenger.hide(); } - extent = null; if ($("geom_data").value) { this.viewLayer.addFeatures([this.wkt.read($("geom_data").value)]); extent = this.viewLayer.getDataExtent(); // XXX: ie has not guessed height of map main div yet during map // initialisation. Now, it will read it correctly. this.map.updateSize(); - SyjEditUI.show(); } else { extent = new OpenLayers.Bounds(gMaxExtent.minlon, gMaxExtent.minlat, gMaxExtent.maxlon, gMaxExtent.maxlat) .transform(WGS84, Mercator); - this.editMode(); } this.map.zoomToExtent(extent); document.observe('simplebox:shown', this.observer.bindAsEventListener(this)); @@ -307,7 +284,7 @@ var SYJView = { }, prepareForm: function(form) { - if (!loginMgr.logged && !$("geom_accept").checked) { + if (!LoginMgr.logged && !$("geom_accept").checked) { this.messenger.setMessage(SyjStrings.acceptTermsofuseWarn, "warn"); $("geom_accept_container").highlight('#F08080'); $("geom_accept").activate(); @@ -402,12 +379,12 @@ var SYJView = { }, saveSuccess: function(transport) { - if (!$("geom_id").value) { - location = "idx/" + transport.responseText; + if (transport.responseJSON && (typeof transport.responseJSON.redirect === "string")) { + location = transport.responseJSON.redirect; return; } - this.messenger.setMessage(SyjStrings.saveSuccess, "success"); + this.messenger.setMessage(SyjStrings.saveSuccess, "success"); SyjSaveUI.hide(); SyjEditUI.show(); document.title = $('geom_title').value; @@ -419,20 +396,15 @@ var SYJView = { if (transport) { httpCode = transport.getStatus(); } - message = ""; switch (httpCode) { case 0: message = SyjStrings.notReachedError; break; case 400: case 404: - case 410: - message = SyjStrings.requestError; // default message + message = SyjStrings.requestError; if (transport.responseJSON) { switch (transport.responseJSON.message) { - case "unreferenced": - message = SyjStrings.unreferencedError; - break; case "uniquepath": message = SyjStrings.uniquePathError; break; @@ -441,6 +413,15 @@ var SYJView = { } } break; + case 403: + message = ""; + SYJLogin.messenger.setMessage(SyjStrings.loginNeeded, "warn"); + SYJLogin.modalbox.show(); + this.needsFormResubmit = true; + break; + case 410: + message = SyjStrings.gonePathError; + break; case 500: message = SyjStrings.serverError; this.needsFormResubmit = true; @@ -575,6 +556,19 @@ var SYJUserClass = Class.create(SYJModalClass, { evt.stop(); }.bindAsEventListener(this)); + $("user_pseudo-desc").hide(); + $("user_pseudo").observe('contentchange', function(evt) { + var value = evt.target.value; + PseudoChecker.reset(); + if (value && !(value.match(/^[a-zA-Z0-9_.]+$/))) { + $("user_pseudo-desc").show().setMessageStatus("warn"); + } else { + $("user_pseudo-desc").hide(); + } + }).timedobserve(function() { + PseudoChecker.check(); + }); + $("user_password").observe('contentchange', function(evt) { if (evt.target.value.length < 6) { $("user_password-desc").setMessageStatus("warn"); @@ -598,12 +592,20 @@ var SYJUserClass = Class.create(SYJModalClass, { }, presubmit: function() { + this.messenger.hide(); + PseudoChecker.reset(); if (!(this.checkNotEmpty("user_pseudo", SyjStrings.userEmptyWarn))) { return false; } if (!($("user_pseudo").value.match(/^[a-zA-Z0-9_.]+$/))) { - this.messenger.setMessage(SyjStrings.invalidPseudo, "warn"); + $("user_pseudo-desc").show().setMessageStatus("warn"); + $("user_pseudo").highlight('#F08080').activate(); + return false; + } + + if (PseudoChecker.exists[$("user_pseudo").value]) { + PseudoChecker.availableMessage(false); $("user_pseudo").highlight('#F08080').activate(); return false; } @@ -640,7 +642,7 @@ var SYJUserClass = Class.create(SYJModalClass, { }, success: function(transport) { - loginMgr.login(); + LoginMgr.login(); SYJView.messenger.setMessage(SyjStrings.userSuccess, "success"); this.modalbox.hide(); if (SYJView.needsFormResubmit) { @@ -668,7 +670,7 @@ var SYJUserClass = Class.create(SYJModalClass, { focusInput = $("user_email"); break; case "uniquepseudo": - message = SyjStrings.uniqueUserError; + PseudoChecker.availableMessage(false); focusInput = $("user_pseudo"); break; case "uniqueemail": @@ -680,11 +682,11 @@ var SYJUserClass = Class.create(SYJModalClass, { break; } - if (message) { - this.messenger.setMessage(message, "error"); - if (focusInput) { - focusInput.highlight('#F08080').activate(); + if (focusInput) { + if (message) { + this.messenger.setMessage(message, "error"); } + focusInput.highlight('#F08080').activate(); return; } @@ -701,6 +703,7 @@ var SYJLoginClass = Class.create(SYJModalClass, { }, presubmit: function() { + this.messenger.hide(); if (!(this.checkNotEmpty("login_user", SyjStrings.userEmptyWarn))) { return false; } @@ -711,9 +714,9 @@ var SYJLoginClass = Class.create(SYJModalClass, { success: function(transport) { if (transport.responseText === "1") { - loginMgr.login(true); + LoginMgr.login(true); } else { - loginMgr.login(); + LoginMgr.login(); } SYJView.messenger.setMessage(SyjStrings.loginSuccess, "success"); this.modalbox.hide(); @@ -771,7 +774,7 @@ var SYJNewpwdClass = Class.create(SYJModalClass, { }); var SYJNewpwd = new SYJNewpwdClass(); -var loginMgr = Object.extend(gLoggedInfo, { +var LoginMgr = Object.extend(gLoggedInfo, { controlsdeck: null, updateUI: function() { @@ -804,10 +807,104 @@ var loginMgr = Object.extend(gLoggedInfo, { } }); +var PseudoChecker = { + req: null, + exists: {}, + currentvalue: null, + messageelt: null, + throbber: null, + + message: function(str, status, throbber) { + var row; + if (!this.messageelt) { + row = new Element('tr'); + // we can't use row.update('
') + // because gecko would mangle the s + row.insert(new Element('td')) + .insert((new Element('td')).update(new Element('div'))); + + $("user_pseudo").up('tr').insert({after: row}); + this.messageelt = new Element('span'); + this.throbber = new Element("img", { src: "icons/pseudo-throbber.gif"}); + row.down('div').insert(this.throbber).insert(this.messageelt); + } + if (throbber) { + this.throbber.show(); + } else { + this.throbber.hide(); + } + this.messageelt.up().setStyle({visibility: ''}); + this.messageelt.className = status; + this.messageelt.update(str); + }, + + availableMessage: function(available) { + var message = available ? SyjStrings.availablePseudo: SyjStrings.unavailablePseudo, + status = available ? "success": "warn"; + this.message(message, status, false); + }, + + reset: function() { + if (this.req) { + this.req.abort(); + this.req = this.currentvalue = null; + } + if (this.messageelt) { + this.messageelt.up().setStyle({visibility: 'hidden'}); + } + }, + + check: function() { + var pseudo = $("user_pseudo").value; + + this.reset(); + + if (!pseudo || !(pseudo.match(/^[a-zA-Z0-9_.]+$/))) { + return; + } + + if (typeof this.exists[pseudo] === "boolean") { + this.reset(); + this.availableMessage(!this.exists[pseudo]); + return; + } + + this.message(SyjStrings.pseudoChecking, "", true); + + this.currentvalue = pseudo; + this.req = new Ajax.TimedRequest('userexists/' + encodeURIComponent(pseudo), 20, { + onFailure: this.failure.bind(this), + onSuccess: this.success.bind(this) + }); + }, + + failure: function(transport) { + var httpCode = 0, value = this.currentvalue; + + if (transport) { + httpCode = transport.getStatus(); + } + this.reset(); + if (httpCode === 404) { + this.exists[value] = false; + this.availableMessage(true); + } + + }, + + success: function(transport) { + var httpCode = transport.getStatus(), value = this.currentvalue; + this.reset(); + this.exists[value] = true; + this.availableMessage(false); + } +}; + + document.observe("dom:loaded", function() { SYJLogin.init(); SYJUser.init(); SYJView.init(); SYJNewpwd.init(); - loginMgr.updateUI(); + LoginMgr.updateUI(); });