summaryrefslogtreecommitdiff
path: root/share/www/script/futon.js
diff options
context:
space:
mode:
Diffstat (limited to 'share/www/script/futon.js')
-rw-r--r--share/www/script/futon.js137
1 files changed, 84 insertions, 53 deletions
diff --git a/share/www/script/futon.js b/share/www/script/futon.js
index 33c72318..c4647ed1 100644
--- a/share/www/script/futon.js
+++ b/share/www/script/futon.js
@@ -10,13 +10,25 @@
// License for the specific language governing permissions and limitations under
// the License.
+// $$ inspired by @wycats: http://yehudakatz.com/2009/04/20/evented-programming-with-jquery/
+function $$(node) {
+ var data = $(node).data("$$");
+ if (data) {
+ return data;
+ } else {
+ data = {};
+ $(node).data("$$", data);
+ return data;
+ }
+};
+
(function($) {
function Session() {
- function doLogin(username, password, callback) {
+ function doLogin(name, password, callback) {
$.couch.login({
- username : username,
+ name : name,
password : password,
success : function() {
$.futon.session.sidebar();
@@ -24,36 +36,36 @@
},
error : function(code, error, reason) {
$.futon.session.sidebar();
- callback({username : "Error logging in: "+reason});
+ callback({name : "Error logging in: "+reason});
}
});
};
- function doSignup(username, password, callback, runLogin) {
+ function doSignup(name, password, callback, runLogin) {
$.couch.signup({
- username : username
+ name : name
}, password, {
success : function() {
if (runLogin) {
- doLogin(username, password, callback);
+ doLogin(name, password, callback);
} else {
callback();
}
},
error : function(status, error, reason) {
$.futon.session.sidebar();
- if (error = "conflict") {
- callback({username : "Name '"+username+"' is taken"});
+ if (error == "conflict") {
+ callback({name : "Name '"+name+"' is taken"});
} else {
- callback({username : "Signup error: "+reason});
+ callback({name : "Signup error: "+reason});
}
}
});
};
function validateUsernameAndPassword(data, callback) {
- if (!data.username || data.username.length == 0) {
- callback({username: "Please enter a username."});
+ if (!data.name || data.name.length == 0) {
+ callback({name: "Please enter a name."});
return false;
};
if (!data.password || data.password.length == 0) {
@@ -69,11 +81,21 @@
if (!validateUsernameAndPassword(data, callback)) return;
$.couch.config({
success : function() {
- callback();
- doLogin(data.username, data.password, callback);
- doSignup(data.username, null, callback, false);
+ doLogin(data.name, data.password, function(errors) {
+ if(!$.isEmptyObject(errors)) {
+ callback(errors);
+ return;
+ }
+ doSignup(data.name, null, function(errors) {
+ if (errors && errors.name && errors.name.indexOf && errors.name.indexOf("taken") == -1) {
+ callback(errors);
+ } else {
+ callback();
+ }
+ }, false);
+ });
}
- }, "admins", data.username, data.password);
+ }, "admins", data.name, data.password);
}
});
return false;
@@ -83,7 +105,7 @@
$.showDialog("dialog/_login.html", {
submit: function(data, callback) {
if (!validateUsernameAndPassword(data, callback)) return;
- doLogin(data.username, data.password, callback);
+ doLogin(data.name, data.password, callback);
}
});
return false;
@@ -101,7 +123,7 @@
$.showDialog("dialog/_signup.html", {
submit: function(data, callback) {
if (!validateUsernameAndPassword(data, callback)) return;
- doSignup(data.username, data.password, callback, true);
+ doSignup(data.name, data.password, callback, true);
}
});
return false;
@@ -118,9 +140,11 @@
// get users db info?
$("#userCtx span").hide();
$.couch.session({
- success : function(userCtx) {
+ success : function(r) {
+ var userCtx = r.userCtx;
+ $$("#userCtx").userCtx = userCtx;
if (userCtx.name) {
- $("#userCtx .username").text(userCtx.name).attr({href : "/_utils/document.html?users/org.couchdb.user%3A"+userCtx.name});
+ $("#userCtx .name").text(userCtx.name).attr({href : $.couch.urlPrefix + "/_utils/document.html?"+encodeURIComponent(r.info.authentication_db)+"/org.couchdb.user%3A"+encodeURIComponent(userCtx.name)});
if (userCtx.roles.indexOf("_admin") != -1) {
$("#userCtx .loggedinadmin").show();
} else {
@@ -159,7 +183,8 @@
}
this.addDatabase = function(name) {
- var recentDbs = $.futon.storage.get("recent", "").split(",");
+ var current = $.futon.storage.get("recent", "");
+ var recentDbs = current ? current.split(",") : [];
if ($.inArray(name, recentDbs) == -1) {
recentDbs.unshift(name);
if (recentDbs.length > 10) recentDbs.length = 10;
@@ -170,7 +195,8 @@
this.removeDatabase = function(name) {
// remove database from recent databases list
- var recentDbs = $.futon.storage.get("recent").split(",");
+ var current = $.futon.storage.get("recent", "");
+ var recentDbs = current ? current.split(",") : [];
var recentIdx = $.inArray(name, recentDbs);
if (recentIdx >= 0) {
recentDbs.splice(recentIdx, 1);
@@ -189,9 +215,10 @@
recentDbs.sort();
$.each(recentDbs, function(idx, name) {
if (name) {
+ name = encodeURIComponent(name);
$("#dbs").append("<li>" +
"<button class='remove' title='Remove from list' value='" + name + "'></button>" +
- "<a href='database.html?" + encodeURIComponent(name) + "' title='" + name + "'>" + name +
+ "<a href='database.html?" + name + "' title='" + name + "'>" + name +
"</a></li>");
}
});
@@ -308,11 +335,22 @@
return callback(decl);
}
+ function windowName() {
+ try {
+ return JSON.parse(window.name || "{}");
+ } catch (e) {
+ return {};
+ }
+ }
+
+ // add suffix to cookie names to be able to separate between ports
+ var cookiePrefix = location.port + "_";
+
var handlers = {
"cookie": {
get: function(name) {
- var nameEq = name + "=";
+ var nameEq = cookiePrefix + name + "=";
var parts = document.cookie.split(';');
for (var i = 0; i < parts.length; i++) {
var part = parts[i].replace(/^\s+/, "");
@@ -324,27 +362,28 @@
set: function(name, value) {
var date = new Date();
date.setTime(date.getTime() + 14*24*60*60*1000); // two weeks
- document.cookie = name + "=" + escape(value) + "; expires=" +
- date.toGMTString();
+ document.cookie = cookiePrefix + name + "=" + escape(value) +
+ "; expires=" + date.toGMTString();
},
del: function(name) {
var date = new Date();
date.setTime(date.getTime() - 24*60*60*1000); // yesterday
- document.cookie = name + "=; expires=" + date.toGMTString();
+ document.cookie = cookiePrefix + name + "=" +
+ "; expires=" + date.toGMTString();
}
},
"window": {
get: function(name) {
- return JSON.parse(window.name || "{}")[name];
+ return windowName()[name];
},
set: function(name, value) {
- var obj = JSON.parse(window.name || "{}");
+ var obj = windowName();
obj[name] = value || null;
window.name = JSON.stringify(obj);
},
del: function(name) {
- var obj = JSON.parse(window.name || "{}");
+ var obj = windowName();
delete obj[name];
window.name = JSON.stringify(obj);
}
@@ -354,6 +393,7 @@
}
+ $.couch.urlPrefix = "..";
$.futon = $.futon || {};
$.extend($.futon, {
navigation: new Navigation(),
@@ -361,31 +401,21 @@
storage: new Storage()
});
- $.fn.addPlaceholder = function(text) {
- return this.each(function() {
+ $.fn.addPlaceholder = function() {
+ if (this[0] && "placeholder" in document.createElement("input")) {
+ return; // found native placeholder support
+ }
+ return this.live('focusin', function() {
var input = $(this);
- if ($.browser.safari) {
- input.attr("placeholder", text);
- return;
+ if (input.val() === input.attr("placeholder")) {
+ input.removeClass("placeholder").val("");
}
- input.blur(function() {
- if ($.trim(input.val()) == "") {
- input.addClass("placeholder").val(text);
- } else {
- input.removeClass("placeholder");
- }
- }).triggerHandler("blur")
- input.focus(function() {
- if (input.is(".placeholder")) {
- input.val("").removeClass("placeholder");
- }
- });
- $(this.form).submit(function() {
- if (input.is(".placeholder")) {
- input.val("");
- }
- });
- });
+ }).live("focusout", function() {
+ var input = $(this);
+ if (input.val() === "") {
+ input.val(input.attr("placeholder")).addClass("placeholder");
+ }
+ }).trigger("focusout");
}
$.fn.enableTabInsertion = function(chars) {
@@ -421,6 +451,8 @@
// doing this as early as possible prevents flickering
$(document.body).addClass("fullwidth");
}
+ $("input[placeholder]").addPlaceholder();
+
$.get("_sidebar.html", function(resp) {
$("#wrap").append(resp)
.find("#sidebar-toggle").click(function(e) {
@@ -442,7 +474,6 @@
$("#version").text(info.version);
}
});
-
});
});