Permalink
Browse files

integrating train 2011.08.04

  • Loading branch information...
2 parents 5ddc894 + ff0db60 commit 1ea708453f9b25c337e447f4e78edff036ad75ee @lloyd lloyd committed Aug 12, 2011
View
10 ChangeLog
@@ -1,4 +1,12 @@
+train-2011.08.04:
+ * when user closes dialog without clicking "cancel", properly return 'null' to the webpage (via getVerifiedEmail callback) - issue #107
+ * improve checks to warn developer that prerequisite software is missing. issue #110
+ * parameterize software to support multiple deployment environments (dev/beta/prod) issues #102 & #52
+ * documentation updates.
+ * improved logging (using the winston logging framework for node.js)
+ * [website] fixed inclusion of youtube video (now over https to keep browsers from getting scared about mixed mode resource inclusion)
+
train-1:
- * beginning of time, everything is new.
+ * beginning of time, everything is new.
* (2011.08.03) include youtube video embedding over https (issue #112)
* (2011.08.04) fix mozillalabs.com link in dialog (issue #116)
View
36 README.md
@@ -1,27 +1,41 @@
-This is an exploration of the distributed identity system
-[described here](https://wiki.mozilla.org/Labs/Identity/VerifiedEmailProtocol).
+Here lives the [BrowserID] implementation. BrowserID is an implementation of the
+[verified email protocol].
-## Required software:
+ [BrowserID]:https://browserid.org
+ [verified email protocol]:https://wiki.mozilla.org/Labs/Identity/VerifiedEmailProtocol
-All of the servers here are based on node.js, and some number of 3rd party node modules are required to make them go. ([npm](http://npmjs.org/) is a good way to get these libraries)
+This repository contains several distinct things related to BrowserID:
-* node.js (>= 0.4.5): http://nodejs.org/
-* Several node.js 3rd party libraries - check `package.json` for details
+ * **the browserid server** - a node.js server which implements a web services api, stores a record of users, the email addresses they've verified, a bcrypted password, outstanding verification tokens, etc
+ * **the verifier** - a stateless node.js server which does cryptographic verification of assertions. This thing is hosted on browserid.org as a convenience, but people using browserid can choose to relocated it if they want to their own servers.
+ * **sample and test code** - to test the above
+ * **the browserid.org website** - the templates, css, and javascript that make up the visible part of browserid.org
+ * **the javascript/HTML dialog & include library** - this is include.js and the code that it includes, the bit that someone using browserid will include.
+
+## Dependencies
+
+Here's the software you'll need installed:
+* node.js (>= 0.4.5): http://nodejs.org/
+* npm: http://npmjs.org/
+* sqlite (3) development libraries: http://www.sqlite.org/
+* Several node.js 3rd party libraries - see `package.json` for details
## Getting started:
1. install node
2. run `npm install` to installed 3rd party libraries into `node_modules`
3. run the top level *run.js* script: `node ./run.js`
-4. visit the demo application ('rp') in your web browser (url output on the console at runtime)
+4. visit the demo application ('rp') in your web browser (url output on the console at runtime)
## Testing
-We should start using this:
+Unit tests are under `browserid/tests/`, and you should run them often. Like before committing code.
+
+## Development model
+
+**branching & release model** - You'll notice some funky branching conventions, like the default branch is named `dev` rather than `master` as you might expect. We're using gitflow: the approach is described in a [blog post](http://lloyd.io/applying-gitflow).
- https://github.com/LearnBoost/tobi
+**contributions** - please issue pull requests targeted at the `dev` branch
-for integration testing
-and straight Vows for unit testing
View
4 browserid/app.js
@@ -18,6 +18,7 @@ secrets = require('./lib/secrets.js'),
db = require('./lib/db.js'),
configuration = require('../libs/configuration.js'),
substitution = require('../libs/substitute.js');
+logging = require("../libs/logging.js");
// looks unused, see run.js
// const STATIC_DIR = path.join(path.dirname(__dirname), "static");
@@ -40,7 +41,8 @@ function router(app) {
// this should probably be an internal redirect
// as soon as relative paths are figured out.
- app.get('/sign_in', function(req, res, next ){
+ app.get('/sign_in', function(req, res, next ) {
+ logging.userEntry('browserid', req);
res.render('dialog.ejs', {
title: 'A Better Way to Sign In',
layout: false,
View
2 browserid/compress.sh
@@ -7,7 +7,7 @@ if [ ! -x "$UGLIFY" ]; then
fi
JAVA=`which java 2> /dev/null`
-if [ ! -x "$UGLIFY" ]; then
+if [ ! -x "$JAVA" ]; then
echo "java not found in your path. can't create production resources. disaster."
exit 1
fi
View
14 browserid/static/dialog/controllers/dialog_controller.js
@@ -103,6 +103,10 @@ $.Controller("Dialog", {}, {
var issuer = storedID.issuer;
var audience = this.remoteOrigin.replace(/^(http|https):\/\//, '');
var assertion = CryptoStubs.createAssertion(audience, email, privkey, issuer);
+ // Clear onerror before the call to onsuccess - the code to onsuccess
+ // calls window.close, which would trigger the onerror callback if we
+ // tried this afterwards.
+ this.onerror = null;
this.onsuccess(assertion);
},
@@ -219,6 +223,14 @@ $.Controller("Dialog", {}, {
this.onerror = onerror;
this.remoteOrigin = origin_url.replace(/^.*:\/\//, "");
this.doStart();
+ var me=this;
+ $(window).bind("unload", function() {
+ // In the success case, me.onerror will have been cleared before unload
+ // is triggered.
+ if (me.onerror) {
+ me.onerror("canceled");
+ }
+ });
},
doStart: function() {
@@ -550,3 +562,5 @@ $.Controller("Dialog", {}, {
}
});
+
+
View
12 libs/configuration.js
@@ -25,25 +25,29 @@ const g_configs = {
hostname: 'browserid.org',
port: '443',
scheme: 'https',
- use_minified_resources: true
+ use_minified_resources: true,
+ log_path: '/home/browserid/var/'
},
development: {
hostname: 'dev.diresworb.org',
port: '443',
scheme: 'https',
- use_minified_resources: true
+ use_minified_resources: true,
+ log_path: '/home/browserid/var/'
},
beta: {
hostname: 'diresworb.org',
port: '443',
scheme: 'https',
- use_minified_resources: true
+ use_minified_resources: true,
+ log_path: '/home/browserid/var/'
},
local: {
hostname: '127.0.0.1',
port: '10002',
scheme: 'http',
- use_minified_resources: false
+ use_minified_resources: false,
+ log_path: './'
}
};
View
52 libs/logging.js
@@ -0,0 +1,52 @@
+const winston = require("winston");
+const configuration = require("./configuration");
+
+// go through the configuration and determine log location
+// for now we only log to one place
+// FIXME: separate logs depending on purpose?
+
+var log_path = configuration.get('log_path');
+var LOGGERS = [];
+
+function setupLogger(category) {
+ if (!log_path)
+ return console.log("no log path! Not logging!");
+
+ // don't create the logger if it already exists
+ if (LOGGERS[category])
+ return;
+
+ // FIXME: check if log_path is properly terminated
+ var filename = log_path + category + "-log.txt";
+
+ LOGGERS[category] = new (winston.Logger)({
+ transports: [new (winston.transports.File)({filename: filename})]
+ });
+}
+
+// entry is an object that will get JSON'ified
+exports.log = function(category, entry) {
+ // entry must have at least a type
+ if (!entry.type)
+ throw new Error("every log entry needs a type");
+
+ // setup the logger if need be
+ setupLogger(category);
+
+ // timestamp
+ entry.at = new Date().toUTCString();
+
+ // if no logger, go to console (FIXME: do we really want to log to console?)
+ LOGGERS[category].info(JSON.stringify(entry));
+};
+
+// utility function to log a bunch of stuff at user entry point
+exports.userEntry = function(category, req) {
+ exports.log(category, {
+ type: 'signin',
+ browser: req.headers['user-agent'],
+ rp: req.headers['referer'],
+ // IP address (this probably needs to be replaced with the X-forwarded-for value
+ ip: req.connection.remoteAddress
+ });
+};
View
1 package.json
@@ -15,5 +15,6 @@
, "temp": "0.2.0"
, "express-csrf": "0.3.2"
, "uglify-js": "1.0.6"
+ , "winston" : "0.3.3"
}
}
View
1 primary/.gitignore
@@ -1 +0,0 @@
-/var
View
60 primary/app.js
@@ -1,60 +0,0 @@
-const path = require('path'),
-fs = require('fs'),
-url = require('url'),
-wsapi = require('./lib/wsapi.js'),
-httputils = require('./lib/httputils.js'),
-webfinger = require('./lib/webfinger.js'),
-sessions = require('cookie-sessions'),
-secrets = require('./lib/secrets.js');
-
-// create the var directory if it doesn't exist
-var VAR_DIR = path.join(__dirname, "var");
-try { fs.mkdirSync(VAR_DIR, 0755); } catch(e) { }
-
-const STATIC_DIR = path.join(__dirname, "static");
-
-const COOKIE_SECRET = secrets.hydrateSecret('cookie_secret', VAR_DIR);
-
-function handler(request, response, next) {
- // dispatch!
- var urlpath = url.parse(request.url).pathname;
-
- if (urlpath === '/sign_in') {
- request.url = "/dialog/index.html";
- next();
- } else if (/^\/wsapi\/\w+$/.test(urlpath)) {
- try {
- var method = path.basename(urlpath);
- wsapi[method](request, response);
- } catch(e) {
- var errMsg = "oops, error executing wsapi method: " + method + " (" + e.toString() +")";
- console.log(errMsg);
- httputils.fourOhFour(response, errMsg);
- }
- } else if (/^\/users\/[^\/]+.xml$/.test(urlpath)) {
- var identity = path.basename(urlpath).replace(/.xml$/, '').replace(/^acct:/, '');
-
- webfinger.renderUserPage(identity, function (resultDocument) {
- if (resultDocument === undefined) {
- httputils.fourOhFour(response, "I don't know anything about: " + identity + "\n");
- } else {
- httputils.xmlResponse(response, resultDocument);
- }
- });
- } else if (urlpath === "/code_update") {
- console.log("code updated. shutting down.");
- process.exit();
- }
-};
-
-exports.varDir = VAR_DIR;
-
-exports.setup = function(app) {
- var week = (7 * 24 * 60 * 60 * 1000);
- app.use(sessions({
- secret: COOKIE_SECRET,
- session_key: "primary_state",
- path: '/'
- }));
- app.use(handler);
-};
View
141 primary/lib/db.js
@@ -1,141 +0,0 @@
-const sqlite = require('sqlite'),
- path = require('path');
-
-var db = new sqlite.Database();
-
-db.open(path.join(path.dirname(__dirname), "var", "userdb.sqlite"), function (error) {
- if (error) {
- console.log("Couldn't open database: " + error);
- throw error;
- }
-
- function createTable(name, sql) {
- db.execute(sql, function (error, rows) {
- if (error) {
- console.log("Couldn't create " + name + " table: " + error);
- throw error;
- }
- });
- }
-
- createTable('users', "CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT, password TEXT )");// NB "password" is SHA1 of actual PW
- createTable('keys', "CREATE TABLE IF NOT EXISTS keys ( id INTEGER PRIMARY KEY, user INTEGER, key TEXT, expires INTEGER )");
-});
-
-function executeTransaction(statements, cb) {
- function executeTransaction2(statements, cb) {
- if (statements.length == 0) cb();
- else {
- var s = statements.shift();
- db.execute(s[0], s[1], function(err, rows) {
- if (err) cb(err);
- else executeTransaction2(statements, cb);
- });
- }
- }
-
- db.execute('BEGIN', function(err, rows) {
- executeTransaction2(statements, function(err) {
- if (err) cb(err);
- else db.execute('COMMIT', function(err, rows) {
- cb(err);
- });
- });
- });
-}
-
-exports.usernameToUserID = function(username, cb) {
- db.execute(
- "SELECT id FROM users WHERE name = ?",
- [ username ],
- function (err, rows) {
- if (rows && rows.length == 1) {
- cb(rows[0].id);
- } else {
- if (err) console.log("database error: " + err);
- cb(undefined);
- }
- });
-}
-
-
-
-exports.userIDToUsername = function(userid, cb) {
- db.execute(
- "SELECT name FROM users WHERE id = ?",
- [ userid ],
- function (err, rows) {
- if (rows && rows.length == 1) {
- cb(rows[0].name);
- } else {
- if (err) console.log("database error: " + err);
- cb(undefined);
- }
- });
-}
-
-exports.usernameKnown = function(username, cb) {
- db.execute(
- "SELECT id FROM users WHERE name = ?",
- [ username ],
- function(error, rows) {
- cb(rows && rows.length > 0);
- });
-};
-
-/* Given a username, adds a public key to it */
-exports.addKeyToAccount = function(userID, pubkey, cb) {
- executeTransaction([
- [ "INSERT INTO keys (user, key, expires) VALUES(?,?,?)",
- [ userID, pubkey, ((new Date()).getTime() + (14 * 24 * 60 * 60 * 1000)) ]
- ]
- ], function (error) {
- if (error) cb(error);
- else cb();
- });
-}
-
-/* create a user account, with no saved keys */
-exports.create_user = function(username, password, cb) {
-
- if (exports.usernameKnown(username, function(known) {
- if (known) cb("email already exists!");
- else {
- executeTransaction([
- [ "INSERT INTO users (name, password) VALUES(?,?)", [ username, password ] ]
- ], function (error) {
- if (error) cb(error);
- else cb();
- });
- }
- }));
-};
-
-/* check username and password; returns true if the password hash matches. */
-exports.checkAuth = function(username, pass, cb) {
- db.execute("SELECT id FROM users WHERE name = ? AND password = ?",
- [ username, pass ],
- function (error, rows) {
- if (rows.length == 1) {
- cb(rows[0].id);
- } else {
- cb(null);
- }
- });
-};
-
-/* Given a username return an array of public keys for it */
-exports.pubkeysForUsername = function(username, cb) {
- db.execute('SELECT keys.key FROM keys, users WHERE users.name = ? AND keys.user = users.id',
- [ username ],
- function(err, rows) {
- var keys = undefined;
- if (!err && rows && rows.length) {
- keys = [ ];
- for (var i = 0; i < rows.length; i++) keys.push(rows[i].key);
- }
- cb(keys);
- });
-};
-
-/* TODO: write flush_keys */
View
52 primary/lib/httputils.js
@@ -1,52 +0,0 @@
-// various little utilities to make crafting boilerplate responses
-// simple
-
-exports.fourOhFour = function(resp, reason)
-{
- resp.writeHead(404, {"Content-Type": "text/plain"});
- resp.write("Not Found");
- if (reason) {
- resp.write(": " + reason);
- }
- resp.end();
-};
-
-exports.serverError = function(resp, reason)
-{
- resp.writeHead(500, {"Content-Type": "text/plain"});
- if (reason) resp.write(reason);
- resp.end();
-};
-
-exports.badRequest = function(resp, reason)
-{
- resp.writeHead(400, {"Content-Type": "text/plain"});
- resp.write("Bad Request");
- if (reason) {
- resp.write(": " + reason);
- }
- resp.end();
-};
-
-exports.jsonResponse = function(resp, obj)
-{
- resp.writeHead(200, {"Content-Type": "application/json"});
- if (obj !== undefined) resp.write(JSON.stringify(obj));
- resp.end();
-};
-
-exports.xmlResponse = function(resp, doc)
-{
- resp.writeHead(200, {"Content-Type": "text/xml"});
- if (doc !== undefined) resp.write(doc);
- resp.end();
-};
-
-exports.checkGetArgs = function(req, args) {
- [ "email", "pass", "pubkey" ].forEach(function(k) {
- if (!urlobj.hasOwnProperty(k) || typeof urlobj[k] !== 'string') {
- throw k;
- }
- });
-
-};
View
26 primary/lib/secrets.js
@@ -1,26 +0,0 @@
-const path = require('path'),
- fs = require('fs');
-
-function generateSecret() {
- var str = "";
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for (var i=0; i < 128; i++) {
- str += alphabet.charAt(Math.floor(Math.random() * alphabet.length));
- }
- return str;
-}
-
-exports.hydrateSecret = function(name, dir) {
- var p = path.join(dir, name + ".sekret");
- var fileExists = false;
- var secret = undefined;
-
- try{ secret = fs.readFileSync(p).toString(); } catch(e) {};
-
- if (secret === undefined) {
- console.log("Generating server secret ("+name+")...");
- secret = generateSecret();
- fs.writeFileSync(p, secret);
- }
- return secret;
-};
View
22 primary/lib/webfinger.js
@@ -1,22 +0,0 @@
-const db = require('./db.js'),
- fs = require('fs'),
- mustache = require('mustache'),
- path = require('path');
-
-const TEMPLATE = fs.readFileSync(path.join(__dirname, "webfinger_template.xml")).toString();
-
-exports.renderUserPage = function(identity, cb) {
-
- var idParts = identity.split("@");
- var userpart = idParts[0];
-
- db.pubkeysForUsername(userpart, function(keys) {
- if (!keys || keys.length === 0) cb(undefined);
- else {
- cb(mustache.to_html(TEMPLATE, {
- keys: keys,
- email: identity
- }));
- }
- });
-};
View
11 primary/lib/webfinger_template.xml
@@ -1,11 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
- xmlns:hm='http://host-meta.net/xrd/1.0'>
- <Subject>acct:{{email}}</Subject>
-{{#keys}}
- <Link
- rel='public-key'
- value="{{.}}"
- />
-{{/keys}}
-</XRD>
View
158 primary/lib/wsapi.js
@@ -1,158 +0,0 @@
-// a module which implements the primary authority web server api.
-// every export is a function which is a WSAPI method handler
-
-const db = require('./db.js'),
- url = require('url'),
- httputils = require('./httputils.js');
-
-function logRequest(method, args) {
- console.log("WSAPI ("+method+") " + (args ? JSON.stringify(args) : ""));
-}
-
-function checkParams(getArgs, resp, params) {
- try {
- params.forEach(function(k) {
- if (!getArgs.hasOwnProperty(k) || typeof getArgs[k] !== 'string') {
- throw k;
- }
- });
- } catch(e) {
- httputils.badRequest(resp, "missing '" + e + "' argument");
- return false;
- }
- return true;
-}
-
-function isAuthed(req) {
- return (req.session && typeof req.session.userid === 'number');
-}
-
-function checkAuthed(req, resp) {
- if (!isAuthed(req)) {
- httputils.badRequest(resp, "requires authentication");
- return false;
- }
- return true;
-}
-
-function normalizeUsername(uname) {
- if (typeof uname === "string") return uname.toLowerCase();
- return undefined;
-}
-
-/* checks to see if a username address is known to the server
- * takes 'username' as a GET argument */
-exports.username_available = function(req, resp) {
- // get inputs from get data!
- var username = normalizeUsername(url.parse(req.url, true).query['username']);
- logRequest("username_available", {username: username});
- db.usernameKnown(username, function(known) {
- resp.json(known);
- });
-};
-
-/* Account creation. Takes a username and password and puts it
- * into the database. */
-exports.create_user = function(req, resp) {
- var urlobj = url.parse(req.url, true);
- var getArgs = urlobj.query;
-
- if (!checkParams(getArgs, resp, [ "username", "pass" ])) return;
-
- logRequest("create_user", getArgs);
-
- try {
- var normalized_username = normalizeUsername(getArgs["username"]);
- db.create_user(normalized_username, getArgs["pass"], function(error) {
- if (error) {
- logRequest("create_user", error);
- resp.json(undefined);
- } else {
- if (!req.session) req.session = {};
- db.usernameToUserID(normalized_username, function(userid) {
- req.session.userid = userid;
- resp.json({ username: normalized_username, id: userid });
- });
- }
- });
- } catch(e) {
- // we should differentiate tween' 400 and 500 here.
- httputils.badRequest(resp, e.toString());
- }
-};
-
-exports.authenticate_user = function(req, resp) {
- var urlobj = url.parse(req.url, true);
- var getArgs = urlobj.query;
-
- logRequest("authenticate_user", getArgs);
- if (!checkParams(getArgs, resp, [ "username", "pass" ])) return;
- var normalized_username = normalizeUsername(getArgs.username);
- db.checkAuth(normalized_username, getArgs.pass, function(userid) {
- logRequest("authenticate_user", "login attempt status: " + userid);
- if (userid) {
- if (!req.session) req.session = {};
- req.session.userid = userid;
- }
- var rp = {username: normalized_username, status: userid != null};
- resp.json(rp);
- });
-};
-
-exports.signout = function(req, resp) {
-
- if (req.session) {
- req.session.userid = undefined;// can I reference undefined safely like this?
- }
- resp.json({});
-};
-
-exports.add_key = function (req, resp) {
- var urlobj = url.parse(req.url, true);
- var getArgs = urlobj.query;
-
- if (!checkParams(getArgs, resp, [ "pubkey" ])) {
- logRequest("add_key", "Missing required pubkey");
- return;
- }
- if (!checkAuthed(req, resp)) {
- logRequest("add_key", "Not authed - req.session is " + req.session);
- return;
- }
-
- logRequest("add_key", getArgs);
- db.addKeyToAccount(req.session.userid, getArgs.pubkey, function (rv) {
- logRequest("add_key", "Success");
- resp.json(rv);
- });
-};
-
-exports.am_authed = function(req,resp) {
- logRequest("am_authed", req.session);
- resp.json(isAuthed(req));
-};
-
-exports.current_username = function(req,resp) {
- logRequest("current_username", req.session);
- try {
- if (isAuthed(req)) {
- logRequest("current_username", "isAuthed");
- db.userIDToUsername(req.session.userid, function(username) {
- if (username !== undefined) {
- logRequest("current_username", username);
- resp.json(username);
- } else {
- logRequest("current_username", "userid doesn't exist: " + req.session.userid);
- req.session.userid = undefined;
- resp.json(false);
- }
- });
- } else {
- logRequest("current_username", "notAuthed");
- resp.json(false);
- }
- } catch (e) {
- console.log(e);
- }
-};
-
View
25 primary/run.js
@@ -1,25 +0,0 @@
-#!/usr/bin/env node
-
-var sys = require("sys"),
- path = require("path"),
- fs = require("fs"),
- express = require("express");
-
-var PRIMARY_HOST = "127.0.0.1";
-var PRIMARY_PORT = 62900;
-
-var handler = require("./app.js");
-
-var app = express.createServer();
-
-app.use(express.logger({
- stream: fs.createWriteStream(path.join(handler.varDir, "server.log"))
-}));
-
-// let the specific server interact directly with the connect server to register their middleware
-if (handler.setup) handler.setup(app);
-
-// use the connect 'static' middleware for serving of static files (cache headers, HTTP range, etc)
-app.use(express.static(path.join(__dirname, "static")));
-
-app.listen(PRIMARY_PORT, PRIMARY_HOST);
View
11 primary/static/.well-known/host-meta
@@ -1,11 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
- xmlns:hm='http://host-meta.net/xrd/1.0'>
-
- <hm:Host xmlns='http://host-meta.net/xrd/1.0'>eyedee.me</hm:Host>
-
- <Link rel='lrdd' template='http://primary.eyedee.me/users/{uri}.xml'></Link>
-
- <Link rel='other' value='something-different'></Link>
-</XRD>
View
585 primary/static/include.js
@@ -1,585 +0,0 @@
-// this is the file that the RP includes to shim in the
-// navigator.id.getVerifiedEmail() function
-
-if (!navigator.id) {
- navigator.id = {};
-}
-
-if (!navigator.id.getVerifiedEmail || navigator.id._getVerifiedEmailIsShimmed)
-{
- // local embedded copy of jschannel: http://github.com/mozilla/jschannel
- var Channel = (function() {
- // current transaction id, start out at a random *odd* number between 1 and a million
- // There is one current transaction counter id per page, and it's shared between
- // channel instances. That means of all messages posted from a single javascript
- // evaluation context, we'll never have two with the same id.
- var s_curTranId = Math.floor(Math.random()*1000001);
-
- // no two bound channels in the same javascript evaluation context may have the same origin & scope.
- // futher if two bound channels have the same scope, they may not have *overlapping* origins
- // (either one or both support '*'). This restriction allows a single onMessage handler to efficiently
- // route messages based on origin and scope. The s_boundChans maps origins to scopes, to message
- // handlers. Request and Notification messages are routed using this table.
- // Finally, channels are inserted into this table when built, and removed when destroyed.
- var s_boundChans = { };
-
- // add a channel to s_boundChans, throwing if a dup exists
- function s_addBoundChan(origin, scope, handler) {
- // does she exist?
- var exists = false;
- if (origin === '*') {
- // we must check all other origins, sadly.
- for (var k in s_boundChans) {
- if (!s_boundChans.hasOwnProperty(k)) continue;
- if (k === '*') continue;
- if (typeof s_boundChans[k][scope] === 'object') {
- exists = true;
- }
- }
- } else {
- // we must check only '*'
- if ((s_boundChans['*'] && s_boundChans['*'][scope]) ||
- (s_boundChans[origin] && s_boundChans[origin][scope]))
- {
- exists = true;
- }
- }
- if (exists) throw "A channel already exists which overlaps with origin '"+ origin +"' and has scope '"+scope+"'";
-
- if (typeof s_boundChans[origin] != 'object') s_boundChans[origin] = { };
- s_boundChans[origin][scope] = handler;
- }
-
- function s_removeBoundChan(origin, scope) {
- delete s_boundChans[origin][scope];
- // possibly leave a empty object around. whatevs.
- }
-
- function s_isArray(obj) {
- if (Array.isArray) return Array.isArray(obj);
- else {
- return (obj.constructor.toString().indexOf("Array") != -1);
- }
- }
-
- // No two outstanding outbound messages may have the same id, period. Given that, a single table
- // mapping "transaction ids" to message handlers, allows efficient routing of Callback, Error, and
- // Response messages. Entries are added to this table when requests are sent, and removed when
- // responses are received.
- var s_transIds = { };
-
- // class singleton onMessage handler
- // this function is registered once and all incoming messages route through here. This
- // arrangement allows certain efficiencies, message data is only parsed once and dispatch
- // is more efficient, especially for large numbers of simultaneous channels.
- var s_onMessage = function(e) {
- var m = JSON.parse(e.data);
- if (typeof m !== 'object') return;
-
- var o = e.origin;
- var s = null;
- var i = null;
- var meth = null;
-
- if (typeof m.method === 'string') {
- var ar = m.method.split('::');
- if (ar.length == 2) {
- s = ar[0];
- meth = ar[1];
- } else {
- meth = m.method;
- }
- }
-
- if (typeof m.id !== 'undefined') i = m.id;
-
- // o is message origin
- // m is parsed message
- // s is message scope
- // i is message id (or null)
- // meth is unscoped method name
- // ^^ based on these factors we can route the message
-
- // if it has a method it's either a notification or a request,
- // route using s_boundChans
- if (typeof meth === 'string') {
- if (s_boundChans[o] && s_boundChans[o][s]) {
- s_boundChans[o][s](o, meth, m);
- } else if (s_boundChans['*'] && s_boundChans['*'][s]) {
- s_boundChans['*'][s](o, meth, m);
- }
- }
- // otherwise it must have an id (or be poorly formed
- else if (typeof i != 'undefined') {
- if (s_transIds[i]) s_transIds[i](o, meth, m);
- }
- };
-
- // Setup postMessage event listeners
- if (window.addEventListener) window.addEventListener('message', s_onMessage, false);
- else if(window.attachEvent) window.attachEvent('onmessage', s_onMessage);
-
- /* a messaging channel is constructed from a window and an origin.
- * the channel will assert that all messages received over the
- * channel match the origin
- *
- * Arguments to Channel.build(cfg):
- *
- * cfg.window - the remote window with which we'll communication
- * cfg.origin - the expected origin of the remote window, may be '*'
- * which matches any origin
- * cfg.scope - the 'scope' of messages. a scope string that is
- * prepended to message names. local and remote endpoints
- * of a single channel must agree upon scope. Scope may
- * not contain double colons ('::').
- * cfg.debugOutput - A boolean value. If true and window.console.log is
- * a function, then debug strings will be emitted to that
- * function.
- * cfg.debugOutput - A boolean value. If true and window.console.log is
- * a function, then debug strings will be emitted to that
- * function.
- * cfg.postMessageObserver - A function that will be passed two arguments,
- * an origin and a message. It will be passed these immediately
- * before messages are posted.
- * cfg.gotMessageObserver - A function that will be passed two arguments,
- * an origin and a message. It will be passed these arguments
- * immediately after they pass scope and origin checks, but before
- * they are processed.
- * cfg.onReady - A function that will be invoked when a channel becomes "ready",
- * this occurs once both sides of the channel have been
- * instantiated and an application level handshake is exchanged.
- * the onReady function will be passed a single argument which is
- * the channel object that was returned from build().
- */
- return {
- build: function(cfg) {
- var debug = function(m) {
- if (cfg.debugOutput && window.console && window.console.log) {
- // try to stringify, if it doesn't work we'll let javascript's built in toString do its magic
- try { if (typeof m !== 'string') m = JSON.stringify(m); } catch(e) { }
- console.log("["+chanId+"] " + m);
- }
- }
-
- /* browser capabilities check */
- if (!window.postMessage) throw("jschannel cannot run this browser, no postMessage");
- if (!window.JSON || !window.JSON.stringify || ! window.JSON.parse) {
- throw("jschannel cannot run this browser, no JSON parsing/serialization");
- }
-
- /* basic argument validation */
- if (typeof cfg != 'object') throw("Channel build invoked without a proper object argument");
-
- if (!cfg.window || !cfg.window.postMessage) throw("Channel.build() called without a valid window argument");
-
- /* we'd have to do a little more work to be able to run multiple channels that intercommunicate the same
- * window... Not sure if we care to support that */
- if (window === cfg.window) throw("target window is same as present window -- not allowed");
-
- // let's require that the client specify an origin. if we just assume '*' we'll be
- // propagating unsafe practices. that would be lame.
- var validOrigin = false;
- if (typeof cfg.origin === 'string') {
- var oMatch;
- if (cfg.origin === "*") validOrigin = true;
- // allow valid domains under http and https. Also, trim paths off otherwise valid origins.
- else if (null !== (oMatch = cfg.origin.match(/^https?:\/\/(?:[-a-zA-Z0-9\.])+(?::\d+)?/))) {
- cfg.origin = oMatch[0];
- validOrigin = true;
- }
- }
-
- if (!validOrigin) throw ("Channel.build() called with an invalid origin");
-
- if (typeof cfg.scope !== 'undefined') {
- if (typeof cfg.scope !== 'string') throw 'scope, when specified, must be a string';
- if (cfg.scope.split('::').length > 1) throw "scope may not contain double colons: '::'"
- }
-
- /* private variables */
- // generate a random and psuedo unique id for this channel
- var chanId = (function () {
- var text = "";
- var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- for(var i=0; i < 5; i++) text += alpha.charAt(Math.floor(Math.random() * alpha.length));
- return text;
- })();
-
- // registrations: mapping method names to call objects
- var regTbl = { };
- // current oustanding sent requests
- var outTbl = { };
- // current oustanding received requests
- var inTbl = { };
- // are we ready yet? when false we will block outbound messages.
- var ready = false;
- var pendingQueue = [ ];
-
- var createTransaction = function(id,origin,callbacks) {
- var shouldDelayReturn = false;
- var completed = false;
-
- return {
- origin: origin,
- invoke: function(cbName, v) {
- // verify in table
- if (!inTbl[id]) throw "attempting to invoke a callback of a non-existant transaction: " + id;
- // verify that the callback name is valid
- var valid = false;
- for (var i = 0; i < callbacks.length; i++) if (cbName === callbacks[i]) { valid = true; break; }
- if (!valid) throw "request supports no such callback '" + cbName + "'";
-
- // send callback invocation
- postMessage({ id: id, callback: cbName, params: v});
- },
- error: function(error, message) {
- completed = true;
- // verify in table
- if (!inTbl[id]) throw "error called for non-existant message: " + id;
-
- // remove transaction from table
- delete inTbl[id];
-
- // send error
- postMessage({ id: id, error: error, message: message });
- },
- complete: function(v) {
- completed = true;
- // verify in table
- if (!inTbl[id]) throw "complete called for non-existant message: " + id;
- // remove transaction from table
- delete inTbl[id];
- // send complete
- postMessage({ id: id, result: v });
- },
- delayReturn: function(delay) {
- if (typeof delay === 'boolean') {
- shouldDelayReturn = (delay === true);
- }
- return shouldDelayReturn;
- },
- completed: function() {
- return completed;
- }
- };
- }
-
- var onMessage = function(origin, method, m) {
- // if an observer was specified at allocation time, invoke it
- if (typeof cfg.gotMessageObserver === 'function') {
- // pass observer a clone of the object so that our
- // manipulations are not visible (i.e. method unscoping).
- // This is not particularly efficient, but then we expect
- // that message observers are primarily for debugging anyway.
- try {
- cfg.gotMessageObserver(origin, m);
- } catch (e) {
- debug("gotMessageObserver() raised an exception: " + e.toString());
- }
- }
-
- // now, what type of message is this?
- if (m.id && method) {
- // a request! do we have a registered handler for this request?
- if (regTbl[method]) {
- var trans = createTransaction(m.id, origin, m.callbacks ? m.callbacks : [ ]);
- inTbl[m.id] = { };
- try {
- // callback handling. we'll magically create functions inside the parameter list for each
- // callback
- if (m.callbacks && s_isArray(m.callbacks) && m.callbacks.length > 0) {
- for (var i = 0; i < m.callbacks.length; i++) {
- var path = m.callbacks[i];
- var obj = m.params;
- var pathItems = path.split('/');
- for (var j = 0; j < pathItems.length - 1; j++) {
- var cp = pathItems[j];
- if (typeof obj[cp] !== 'object') obj[cp] = { };
- obj = obj[cp];
- }
- obj[pathItems[pathItems.length - 1]] = (function() {
- var cbName = path;
- return function(params) {
- return trans.invoke(cbName, params);
- }
- })();
- }
- }
- var resp = regTbl[method](trans, m.params);
- if (!trans.delayReturn() && !trans.completed()) trans.complete(resp);
- } catch(e) {
- // automagic handling of exceptions:
- var error = "runtime_error";
- var message = null;
- // * if its a string then it gets an error code of 'runtime_error' and string is the message
- if (typeof e === 'string') {
- message = e;
- } else if (typeof e === 'object') {
- // either an array or an object
- // * if its an array of length two, then array[0] is the code, array[1] is the error message
- if (e && s_isArray(e) && e.length == 2) {
- error = e[0];
- message = e[1];
- }
- // * if its an object then we'll look form error and message parameters
- else if (typeof e.error === 'string') {
- error = e.error;
- if (!e.message) message = "";
- else if (typeof e.message === 'string') message = e.message;
- else e = e.message; // let the stringify/toString message give us a reasonable verbose error string
- }
- }
-
- // message is *still* null, let's try harder
- if (message === null) {
- try {
- message = JSON.stringify(e);
- } catch (e2) {
- message = e.toString();
- }
- }
-
- trans.error(error,message);
- }
- }
- } else if (m.id && m.callback) {
- if (!outTbl[m.id] ||!outTbl[m.id].callbacks || !outTbl[m.id].callbacks[m.callback])
- {
- debug("ignoring invalid callback, id:"+m.id+ " (" + m.callback +")");
- } else {
- // XXX: what if client code raises an exception here?
- outTbl[m.id].callbacks[m.callback](m.params);
- }
- } else if (m.id) {
- if (!outTbl[m.id]) {
- debug("ignoring invalid response: " + m.id);
- } else {
- // XXX: what if client code raises an exception here?
- if (m.error) {
- (1,outTbl[m.id].error)(m.error, m.message);
- } else {
- if (m.result !== undefined) (1,outTbl[m.id].success)(m.result);
- else (1,outTbl[m.id].success)();
- }
- delete outTbl[m.id];
- delete s_transIds[m.id];
- }
- } else if (method) {
- // tis a notification.
- if (regTbl[method]) {
- // yep, there's a handler for that.
- // transaction is null for notifications.
- regTbl[method](null, m.params);
- // if the client throws, we'll just let it bubble out
- // what can we do? Also, here we'll ignore return values
- }
- }
- }
-
- // now register our bound channel for msg routing
- s_addBoundChan(cfg.origin, ((typeof cfg.scope === 'string') ? cfg.scope : ''), onMessage);
-
- // scope method names based on cfg.scope specified when the Channel was instantiated
- var scopeMethod = function(m) {
- if (typeof cfg.scope === 'string' && cfg.scope.length) m = [cfg.scope, m].join("::");
- return m;
- }
-
- // a small wrapper around postmessage whose primary function is to handle the
- // case that clients start sending messages before the other end is "ready"
- var postMessage = function(msg, force) {
- if (!msg) throw "postMessage called with null message";
-
- // delay posting if we're not ready yet.
- var verb = (ready ? "post " : "queue ");
- debug(verb + " message: " + JSON.stringify(msg));
- if (!force && !ready) {
- pendingQueue.push(msg);
- } else {
- if (typeof cfg.postMessageObserver === 'function') {
- try {
- cfg.postMessageObserver(cfg.origin, msg);
- } catch (e) {
- debug("postMessageObserver() raised an exception: " + e.toString());
- }
- }
-
- cfg.window.postMessage(JSON.stringify(msg), cfg.origin);
- }
- }
-
- var onReady = function(trans, type) {
- debug('ready msg received');
- if (ready) throw "received ready message while in ready state. help!";
-
- if (type === 'ping') {
- chanId += '-R';
- } else {
- chanId += '-L';
- }
-
- obj.unbind('__ready'); // now this handler isn't needed any more.
- ready = true;
- debug('ready msg accepted.');
-
- if (type === 'ping') {
- obj.notify({ method: '__ready', params: 'pong' });
- }
-
- // flush queue
- while (pendingQueue.length) {
- postMessage(pendingQueue.pop());
- }
-
- // invoke onReady observer if provided
- if (typeof cfg.onReady === 'function') cfg.onReady(obj);
- };
-
- var obj = {
- // tries to unbind a bound message handler. returns false if not possible
- unbind: function (method) {
- if (regTbl[method]) {
- if (!(delete regTbl[method])) throw ("can't delete method: " + method);
- return true;
- }
- return false;
- },
- bind: function (method, cb) {
- if (!method || typeof method !== 'string') throw "'method' argument to bind must be string";
- if (!cb || typeof cb !== 'function') throw "callback missing from bind params";
-
- if (regTbl[method]) throw "method '"+method+"' is already bound!";
- regTbl[method] = cb;
- },
- call: function(m) {
- if (!m) throw 'missing arguments to call function';
- if (!m.method || typeof m.method !== 'string') throw "'method' argument to call must be string";
- if (!m.success || typeof m.success !== 'function') throw "'success' callback missing from call";
-
- // now it's time to support the 'callback' feature of jschannel. We'll traverse the argument
- // object and pick out all of the functions that were passed as arguments.
- var callbacks = { };
- var callbackNames = [ ];
-
- var pruneFunctions = function (path, obj) {
- if (typeof obj === 'object') {
- for (var k in obj) {
- if (!obj.hasOwnProperty(k)) continue;
- var np = path + (path.length ? '/' : '') + k;
- if (typeof obj[k] === 'function') {
- callbacks[np] = obj[k];
- callbackNames.push(np);
- delete obj[k];
- } else if (typeof obj[k] === 'object') {
- pruneFunctions(np, obj[k]);
- }
- }
- }
- };
- pruneFunctions("", m.params);
-
- // build a 'request' message and send it
- var msg = { id: s_curTranId, method: scopeMethod(m.method), params: m.params };
- if (callbackNames.length) msg.callbacks = callbackNames;
-
- // insert into the transaction table
- outTbl[s_curTranId] = { callbacks: callbacks, error: m.error, success: m.success };
- s_transIds[s_curTranId] = onMessage;
-
- // increment current id
- s_curTranId++;
-
- postMessage(msg);
- },
- notify: function(m) {
- if (!m) throw 'missing arguments to notify function';
- if (!m.method || typeof m.method !== 'string') throw "'method' argument to notify must be string";
-
- // no need to go into any transaction table
- postMessage({ method: scopeMethod(m.method), params: m.params });
- },
- destroy: function () {
- s_removeBoundChan(cfg.origin, ((typeof cfg.scope === 'string') ? cfg.scope : ''));
- if (window.removeEventListener) window.removeEventListener('message', onMessage, false);
- else if(window.detachEvent) window.detachEvent('onmessage', onMessage);
- ready = false;
- regTbl = { };
- inTbl = { };
- outTbl = { };
- cfg.origin = null;
- pendingQueue = [ ];
- debug("channel destroyed");
- chanId = "";
- }
- };
-
- obj.bind('__ready', onReady);
- setTimeout(function() {
- postMessage({ method: scopeMethod('__ready'), params: "ping" }, true);
- }, 0);
-
- return obj;
- }
- };
- })();
-
- function JWTWrapper(jwtBlob) {
- var obj = {
- jwt: jwtBlob,
- email: undefined,
- audience: undefined,
- issuer: undefined,
- "valid-until": undefined,
- toString: function() { return this.jwt; }
- };
- // attempt to decode the middle part of the assertion to populate object keys
- try {
- var jwtContents = JSON.parse(window.atob(jwtBlob.split(".")[1]));
- for (var k in obj) {
- if (obj.hasOwnProperty(k) && obj[k] === undefined) {
- if (typeof jwtContents[k] === 'string' || typeof jwtContents[k] === 'number') obj[k] = jwtContents[k];
- }
- }
- } catch(e) {
- // failure is an option.
- }
-
- return obj;
- }
-
- var chan = undefined;
-
- navigator.id.getVerifiedEmail = function(onsuccess, onerror) {
- var ipServer = "https://eyedee.me"
- var w = window.open(
- ipServer + "/sign_in", "_mozid_signin",
- "menubar=0,location=0,resizable=0,scrollbars=0,status=0,dialog=1,width=600,height=400");
-
- // clean up a previous channel that never was reaped
- if (chan) chan.destroy();
- chan = Channel.build({window: w, origin: ipServer, scope: "mozid"});
-
- function cleanup() {
- chan.destroy();
- chan = undefined;
- w.close();
- }
-
- chan.call({
- method: "getVerifiedEmail",
- success: function(rv) {
- if (onsuccess) {
- // wrap the raw JWT with a handy dandy object that exposes everything in a readable form
- onsuccess(JWTWrapper(rv));
- }
- cleanup();
- },
- error: function(code, msg) {
- if (onerror) onerror(code, msg);
- cleanup();
- }
- });
- };
-
- navigator.id._getVerifiedEmailIsShimmed = true;
-}
View
100 primary/static/index.html
@@ -1,100 +0,0 @@
-<html>
-<head>
- <title>BrowserID Demo Primary</title>
- <link href="style.css" type="text/css" media="screen" rel="stylesheet"></link>
-</head>
-<body id="body">
-
-<div id="logged_in" class="status">
-<div>You are <b>signed in</b> to PrimaryCo as <span id="username"></span></div>
-
-<div><a id="sign_out" href="#">Sign out</a>.</div>
-</div>
-
-<div id="logged_out" class="status">
-<div>You are <b>not signed in</b> to PrimaryCo.</div>
-
-<div><a id="sign_in" href="#">Sign in now.</a></div>
-</div>
-
-<div id="authenticate_dialog" class="dialog">
- <div class="title"> Sign in to PrimaryCo </div>
- <div class="content">
- <div class="summary">Sign in to your PrimaryCo account: <span class="sitename bad"></span>:</div>
- <div class="input">
- <div class="label"> Account </div>
- <div class="input"> <input type="text"></input></div>
- </div>
- <div class="input">
- <div class="label"> Password </div>
- <div class="input"> <input type="password"></input></div>
- <div class="note"> <a href="#">I forgot my password</a> </div>
- </div>
- <div class="attention_lame">
- No such account exists with that username and/or password
- </div>
- <div class="actions">
- <div class="action"><a href="#">Don't have a PrimaryCo account yet?</a></div>
- </div>
- <div class="bottom-bar">
- <button id="signin_submit" class="righty action">Sign In</button>
- <button id="signin_cancel" class="righty">Cancel</button>
- </div>
- </div>
-</div>
-<div id="create_dialog" class="dialog">
- <div class="title"> Create an Account With PrimaryCo. </div>
- <div class="content">
- <div class="summary"><p>PrimaryCo provides such valuable services that you want to use it as your identifier online!</p>
- <p>Please pick a name - this will become your @primaryco.com address!</p></div>
- <div class="input">
- <div class="label"> Username </div>
- <div class="input"> <input type="text"></input></div>
- <div class="note"></div>
- </div>
- <div class="input">
- <div class="label"> Password </div>
- <div class="input"> <input type="password"></input></div>
- </div>
- <div class="input">
- <div class="label"> Verify </div>
- <div class="input"> <input type="password"></input></div>
- <div class="note"><span class="bad">Enter a password</span></div>
- </div>
- <div class="attention_lame">
- <span id="in_use_email">Username</span> is already registered. Did you already register it? You can <a href="#">sign in</a> if you like.
- </div>
- <div class="bottom-bar">
- <button id="create_submit" class="righty action">Sign In</button>
- <button id="create_cancel" class="righty">Cancel</button>
- </div>
- </div>
-</div>
-
-<div id="welcome_dialog" class="dialog">
- <div class="title"> Welcome to PrimaryCo!</div>
- <div class="content">
- <div class="summary">Your PrimaryCo email address is
- <div id="welcome_address"></div>
- </div>
- <div class="bottom-bar">
- <button id="create_welcome" class="righty action">Let's Go</button>
- </div>
- </div>
-</div>
-
-<div id="error_dialog" class="dialog">
- <div class="title"></div>
- <div class="content"></div>
- <div class="bottom-bar">
- <button id="error_submit" class="righty action">Rats</button>
- </div>
-</div>
-
-
-</body>
-<!-- XXX: jquery shouldn't be used, it's too big. we're using it now cause this is a proof of concept -->
-<script src="jquery-min.js"></script>
-<script src="https://eyedee.me/include.js"></script>
-<script src="main.js"></script>
-</html>
View
16 primary/static/jquery-min.js
@@ -1,16 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.5.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Mar 31 15:28:23 2011 -0400
- */
-(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
View
341 primary/static/main.js
@@ -1,341 +0,0 @@
-// this is the picker code! it runs in the identity provider's domain, and
-// fiddles the dom expressed by picker.html
-(function() {
-
- function refreshAuthStatus() {
- $.ajax({
- url: '/wsapi/current_username',
- success: function(status, textStatus, jqXHR) {
- var currentUsername = JSON.parse(jqXHR.responseText);
- if (!currentUsername) {
- $("#logged_out").show();
- } else {
- $("#username").text(currentUsername);
- $("#logged_in").show();
- }
- },
- error: function() {
- runErrorDialog(
- "serverError",
- "Error Communicating With Server!",
- "There was a technical problem while trying to log you in. Yucky!");
- }
- });
- }
-
- function runErrorDialog(code, title, message, onsuccess, onerror) {
- $(".dialog").hide();
-
- $("#error_dialog div.title").text(title);
- $("#error_dialog div.content").text(message);
-
- $("#back").hide();
- $("#cancel").hide();
- $("#submit").show().unbind('click').click(function() {
- onerror(code);
- }).text("Close");
-
- $("#error_dialog").fadeIn(500);
- }
-
- function runConfirmationDialog(username) {
- refreshAuthStatus();
- $("#welcome_address").text(username + "@primary.eyedee.me");
- $("#welcome_dialog").fadeIn(500);
- $("#create_welcome").show().unbind('click').click(function() {
- $("#welcome_dialog").fadeOut(500);
- });
- };
-
- function runCreateDialog() {
- $(".dialog").hide();
-
- $("#back").show().unbind('click').click(function() {
- runAuthenticateDialog(undefined);
- });
- $("#create_cancel").show().unbind('click').click(function() {
- onerror("canceled");
- });
- $("#create_submit").show().unbind('click').click(function() {
- // ignore the click if we're disabled
- if ($(this).hasClass('disabled')) return true;
-
- // now we need to actually try to stage the creation of this account.
- var username = $("#create_dialog input:eq(0)").val();
- var pass = $("#create_dialog input:eq(1)").val();
-
- // Go do it...
- $.ajax({
- url: '/wsapi/create_user?username=' + encodeURIComponent(username) + '&pass=' + encodeURIComponent(pass),
- success: function(result) {
- $(".dialog").hide();
- if (result) {
- // the server may have "normalized" our username, a success payload includes the actual
- // username registered
- username = result.username;
- $("#create_dialog input:eq(0)").val(username);
- runConfirmationDialog(username);
- try {
- navigator.id.registerVerifiedEmail(username + "@primary.eyedee.me", function(publicKey) {
- $.ajax({
- url: '/wsapi/add_key?pubkey=' + encodeURIComponent(publicKey),
- success: function() {
- // key is saved - we're done?
- },
- error: function() {
- }});
- }, function(error) {
- runErrorDialog(
- "serverError",
- "Error Registering Address!",
- "There was a technical problem while trying to register your address. Sorry.");
- });
- } catch (e) {
- alert("Whoops, unable to register verified email: " + e);
- }
- } else {
- runErrorDialog(
- "serverError",
- "Error Creating Account!",
- "There was a technical problem while trying to create your account. Sorry.");
- }
- },
- error: function() {
- runErrorDialog(
- "serverError",
- "Error Creating Account!",
- "There was a technical problem while trying to create your account. Yucky.");
- }
- });
- }).text("Continue").addClass("disabled");
-
- $("#create_dialog div.attention_lame").hide();
- $("#create_dialog div.attention_lame a").unbind('click').click(function() {
- var username = $("#create_dialog input:eq(0)").val();
- runAuthenticateDialog(username);
- });
-
- function checkInput() {
- $("#create_submit").removeClass("disabled");
-
- // check the username
- var email = $("#create_dialog input:eq(0)").val();
- $("#create_dialog div.note:eq(0)").empty();
- if (typeof email === 'string' && email.length) {
-
- var valid = checkedEmails[email];
- if (typeof valid === 'string') {
- // oh noes. we tried to check this email, but it failed. let's just not tell the
- // user anything, cause this is a non-critical issue
-
- } else if (typeof valid === 'boolean') {
- if (valid) {
- $("#create_dialog div.note:eq(0)").html($('<span class="good"/>').text("Username available!"));
- $("#create_dialog div.attention_lame").hide();
- } else {
- $("#create_dialog div.attention_lame").fadeIn(300);
- $("#create_dialog div.attention_lame span.email").text(email);
- $("#create_submit").addClass("disabled");
- }
- } else {
- // this is an email that needs to be checked!
- if (emailCheckState !== 'querying') {
- if (emailCheckState) window.clearTimeout(emailCheckState);
- emailCheckState = setTimeout(function() {
- emailCheckState = 'querying';
- var checkingNow = nextEmailToCheck;
- // bounce off the server and enter the 'querying' state
- $.ajax({
- url: '/wsapi/username_available?username=' + encodeURIComponent(checkingNow),
- success: function(data, textStatus, jqXHR) {
- checkedEmails[checkingNow] = !JSON.parse(data);
- emailCheckState = undefined;
- checkInput();
- }, error: function(jqXHR, textStatus, errorThrown) {
- // some kind of error was encountered. This is non-critical, we'll simply ignore it
- // and mark this email check as failed.
- checkedEmails[checkingNow] = "server failed";
- emailCheckState = undefined;
- checkInput();
- }
- });
- }, 700);
- } else {
- $("#create_dialog div.note:eq(0)").html($('<span class="warning"/>').text("Checking address"));
- }
- nextEmailToCheck = email;
- $("#create_submit").addClass("disabled");
- }
- } else {
- $("#create_submit").addClass("disabled");
- }
-
- // next let's check the password entry
- var pass = $("#create_dialog input:eq(1)").val();
- var match = pass === $("#create_dialog input:eq(2)").val();
- if (!match) {
- $("#create_submit").addClass("disabled");
- $("#create_dialog div.note:eq(1)").html($('<span class="bad"/>').text("Passwords different"));
- } else {
- if (!pass) {
- $("#create_submit").addClass("disabled");
- $("#create_dialog div.note:eq(1)").html($('<span class="bad"/>').text("Enter a password"));
- } else if (pass.length < 5) {
- $("#create_submit").addClass("disabled");
- $("#create_dialog div.note:eq(1)").html($('<span class="bad"/>').text("Password too short"));
- } else {
- $("#create_dialog div.note:eq(1)").html($('<span class="good"/>').text("Password OK"))
- }
- }
- }
-
- // watch input dialogs
- $("#create_dialog input").unbind('keyup').bind('keyup', checkInput);
-
- // do a check at load time, in case the user is using the back button (enables the continue button!)
- checkInput();
-
- $("#create_dialog").fadeIn(500);
- } // end runCreateDialog
-
- // a handle to a timeout of a running email check
- var emailCheckState = undefined;
- // the next email to check, if one is entered while a check is running
- var nextEmailToCheck = undefined;
- // a set of emails that we've checked for this session
- var checkedEmails = {
- };
-
- function runAuthenticateDialog(email, onsuccess, onerror) {
- $(".status").hide();
-
- $(".dialog").hide();
- $("#back").hide();
- $("#cancel").show().unbind('click').click(function() {
- onerror("canceled");
- });
- $("#signin_submit").show().unbind('click').click(function() {
- if ($(this).hasClass('disabled')) return true;
-
- var email = $("#authenticate_dialog input:eq(0)").val();
- var pass = $("#authenticate_dialog input:eq(1)").val();
-
- $.ajax({
- url: '/wsapi/authenticate_user?username=' + encodeURIComponent(email) + '&pass=' + encodeURIComponent(pass),
- success: function(status, textStatus, jqXHR) {
- var authenticated = JSON.parse(jqXHR.responseText);
- if (!authenticated) {
- $("#authenticate_dialog div.attention_lame").hide().fadeIn(400);
- } else {
- navigator.id.registerVerifiedEmail(status.username + "@primary.eyedee.me", function(publicKey) {
- $.ajax({
- url: '/wsapi/add_key?pubkey=' + encodeURIComponent(publicKey),
- success: function() {
- // key is saved - we're done?
- },
- error: function() {
- }});
- }, function(error) {
- runErrorDialog(
- "serverError",
- "Error Registering Address!",
- "There was a technical problem while trying to register your address. Sorry.");
- });
-
- $("#authenticate_dialog").hide(500);
- refreshAuthStatus();
- }
- },
- error: function() {
- runErrorDialog(
- "serverError",
- "Error Authenticating!",
- "There was a technical problem while trying to log you in. Yucky!",
- onsuccess, onerror);
- }
- });
- }).text("Sign In").addClass("disabled");;
-
- // preseed the email input if whoever triggered us told us to
- if (email) {
- $("#authenticate_dialog input:eq(0)").val(email);
- }
-
- $("#authenticate_dialog div.note > a").unbind('click').click(function() {
- onerror("notImplemented");
- });
- $("#authenticate_dialog div.actions div.action").unbind('click').click(function() {
- runCreateDialog(onsuccess, onerror);
- });
-
- $("#authenticate_dialog div.attention_lame").hide();
-
- $("#authenticate_dialog input").unbind('keyup').bind('keyup', function() {
- var email = $("#authenticate_dialog input:eq(0)").val();
- var pass = $("#authenticate_dialog input:eq(1)").val();
- if (email.length > 0 && pass.length > 0) $("#signin_submit").removeClass('disabled');
- else $("#signin_submit").addClass('disabled');
- });
-// $("#authenticate_dialog .bottom-bar button").hide();
- $("#authenticate_dialog").fadeIn(
- 500,
- function() {
- // where should we put the focus? On login if empty, else password
- var email = $("#authenticate_dialog input:eq(0)").val();
- if (typeof email === 'string' && email.length) {
- $("#authenticate_dialog input:eq(1)").focus();
- } else {
- $("#authenticate_dialog input:eq(0)").focus();
- }
- });
- }
-
- function runErrorDialog(code, title, message) {
- $(".dialog").hide();
-
- $("#error_dialog div.title").text(title);
- $("#error_dialog div.content").text(message);
-
- $("#error_submit").show().unbind('click').click(function() {
- $("#error_dialog").fadeOut(500);
- }).text("Close");
-
- $("#error_dialog").fadeIn(500);
- }
-
-
-
- // Set up initial bindings
- $("#sign_in").click(function() {
- runAuthenticateDialog(undefined);
- });
-
- $("#sign_out").click(function() {
- $("#logged_in").hide();
- $("#logged_out").hide();
- $.ajax({
- url: '/wsapi/signout',
- success: function(status, textStatus, jqXHR) {
- refreshAuthStatus();
- },
- error: function() {
- runErrorDialog(
- "serverError",
- "Error Communicating With Server!",
- "There was a technical problem while trying to log you out. Sorry!",
- onsuccess, onerror);
- }
- });
- });
-
- refreshAuthStatus();
-
-/* // 'Enter' in any input field triggers a click on the submit button
- $('input').keypress(function(e){
- if(e.which == 13) {
- $('#submit').click();
- e.preventDefault();
- }
- });
- */
-})();
View
0 primary/static/ping.txt
No changes.
View
236 primary/static/style.css
@@ -1,236 +0,0 @@
-body {
- position: absolute;
- font-family: Helvetica Narrow, sans-serif;
- font-size: 11pt;
- width: 598px;
- height: 398px;
- padding: 0;
- margin: 0;
-}
-span.sitename, span.email {
- font-weight: bold;
-}
-.title {
- font-size: 2em;
- font-weight: bold;
- margin: auto;
- margin-top: 1.5em;
- margin-bottom: 1em;
-}
-
-#logo {
- margin: 0;
- padding: 0;
- width: 575px;
- position: fixed;
- left: 30px;
- top: 120px;
- opacity: .1;
- -moz-transform: rotate(-25deg);
- -webkit-transform: rotate(-25deg);
- transform: rotate(-25deg);
- z-index: -5;
-}
-
-#logo > img {
- width: 100%;
-}
-
-.dialog {
- display: none;
- position: relative;
- top: 0;
- left: 0;
- width:450px;
- margin: auto;
- text-align: center;
-/* border: 2px solid rgb(218, 230, 237); */
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
-}
-
-.bottom-bar {
- margin: 0;
- padding: 0;
- border: 0;
-/* left: 0;*/
-/* top: 450px;*/
- height: 60px;
- width: 450px;
- border-top: 2px solid rgb(218, 230, 237);
- background-color: rgb(244, 247, 251);
-}
-
-.bottom-bar button {
- height: 25px;
- border: 1px solid rgb(145, 145, 145);
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- background-color: rgb(242, 242, 242);
- padding-left: 2em;
- padding-right: 2em;
- margin-left: 1em;
- margin-right: 1em;
- margin-top: 16px;
- z-index: 0;
-}
-
-.bottom-bar button.righty {
- float: right;
-}
-
-.bottom-bar button.action {
- background-color: rgb(0,128,211);
- color: #fff;
- font-weight: bold;
-}
-
-div.actions > div.action {
- float: left;
- margin-right: 1em;
-}
-
-div.actions > div.action a {
- cursor: pointer;
- color: rgb(65, 126, 208);
- text-decoration: none;
-}
-
-div.actions {
-/* position: fixed;
- top: 268px;*/
- height: 32px;
- font-size: .8em;
- margin-left: 79px;
-}
-
-#identities {
- width: 450px;
- margin: auto;
-}
-
-#identities > div {
- margin-bottom: .5em;
- height: 1.4em;
- font-size: .9em;
-}
-
-#identities > div > * {
- float: left;
- cursor: pointer;
-}
-
-button {
- cursor: pointer;
-}
-
-button.disabled {
- cursor: default;
- opacity: .3;
-}
-
-div.input > * {
- float: left;
-}
-
-div.input > div.note {
- float: right;
- margin-top: .7em;
-}
-
-div.content {
- width: 450px;
- margin: auto;
- text-align: left;