From 68e574cc52a94f9210ac2c69a9083fdafb12e4e4 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Fri, 26 Apr 2013 01:23:22 -0700 Subject: [PATCH] Stub new client --- fx/client-bg.jpg | Bin 0 -> 113609 bytes fx/client-topbar-bg.png | Bin 0 -> 2852 bytes index.template.html | 55 +- js/client-ladder.js | 11 + js/client-mainmenu.js | 33 + js/client-teambuilder.js | 11 + js/client.js | 228 ++ js/lib/backbone.js | 1571 +++++++++++ js/lib/lodash.compat.js | 5516 ++++++++++++++++++++++++++++++++++++++ style/client.css | 295 ++ 10 files changed, 7684 insertions(+), 36 deletions(-) create mode 100644 fx/client-bg.jpg create mode 100644 fx/client-topbar-bg.png create mode 100644 js/client-ladder.js create mode 100644 js/client-mainmenu.js create mode 100644 js/client-teambuilder.js create mode 100644 js/client.js create mode 100644 js/lib/backbone.js create mode 100644 js/lib/lodash.compat.js create mode 100644 style/client.css diff --git a/fx/client-bg.jpg b/fx/client-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1f53eca4797d2670a13f9938773ef21934f4b23 GIT binary patch literal 113609 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%0D<&J;`eDV0H7ZJ-=_@ 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 F`oBP~%N_s# literal 0 HcmV?d00001 diff --git a/index.template.html b/index.template.html index d88eb8b2d..a34252603 100644 --- a/index.template.html +++ b/index.template.html @@ -4,7 +4,7 @@ Showdown! - + @@ -17,6 +17,9 @@ psim: /^(.*)\.psim\.us$/i.exec(document.location.hostname) }; + - @@ -54,28 +54,12 @@ -
-

Pokemon Showdown! (beta)

-
-
-
- +
-
Initializing...
+
Initializing...
-
-
- Connecting... -
-
-
-
- -
-
@@ -88,6 +72,8 @@ soundManager.setup({url: '//play.pokemonshowdown.com/swf/'}); + + - - - + + + + - + - + @@ -118,13 +104,10 @@ - + - + - + diff --git a/js/client-ladder.js b/js/client-ladder.js new file mode 100644 index 000000000..007da89dd --- /dev/null +++ b/js/client-ladder.js @@ -0,0 +1,11 @@ +(function($) { + + var LadderRoom = this.LadderRoom = this.Room.extend({ + initialize: function() { + // left menu + var buf = '

Insert ladder here

'; + this.$el.addClass('ps-room-light').html(buf); + } + }); + +}).call(this, jQuery); diff --git a/js/client-mainmenu.js b/js/client-mainmenu.js new file mode 100644 index 000000000..fc49ae804 --- /dev/null +++ b/js/client-mainmenu.js @@ -0,0 +1,33 @@ +(function($) { + + var MainMenuRoom = this.MainMenuRoom = this.Room.extend({ + events: { + 'click .button': 'clickButton' + }, + initialize: function() { + // left menu + var buf = '
'; + buf += '
'; + + // right menu + buf += '
'; + this.$el.html(buf); + }, + clickButton: function(e) { + e.preventDefault(); + var $target = $(e.currentTarget); + switch ($target.val()) { + case 'lobby': + app.joinRoom('lobby'); + break; + case 'teambuilder': + app.joinRoom('teambuilder'); + break; + case 'ladder': + app.joinRoom('ladder'); + break; + } + } + }); + +}).call(this, jQuery); diff --git a/js/client-teambuilder.js b/js/client-teambuilder.js new file mode 100644 index 000000000..f93abf825 --- /dev/null +++ b/js/client-teambuilder.js @@ -0,0 +1,11 @@ +(function($) { + + var TeambuilderRoom = this.TeambuilderRoom = this.Room.extend({ + initialize: function() { + // left menu + var buf = '

Insert teambuilder here

'; + this.$el.addClass('ps-room-light').html(buf); + } + }); + +}).call(this, jQuery); diff --git a/js/client.js b/js/client.js new file mode 100644 index 000000000..8ddef3796 --- /dev/null +++ b/js/client.js @@ -0,0 +1,228 @@ +(function($) { + + Config.defaultserver = { + server: 'sim.smogon.com', + serverid: 'dev', + serverport: 8001, + serverprotocol: 'ws', + registered: true + }; + Config.sockjsprefix = '/showdown'; + Config.root = '/'; + + var User = this.User = Backbone.Model.extend({ + defaults: { + name: "Guest", + registered: false, + named: false, + avatar: 0 + } + }); + + var App = this.App = Backbone.Router.extend({ + root: '/', + routes: { + '*path': 'dispatchFragment' + }, + initialize: function() { + window.app = this; + $('#main').html(''); + this.initializeRooms(); + this.user = new User(); + this.topbar = new Topbar({el: $('#header')}); + Backbone.history.start({pushState: true}); + this.addRoom(''); + }, + dispatchFragment: function(fragment) { + this.joinRoom(fragment||''); + }, + /** + * Send to sim server + */ + send: function(data, type) { + if (!this.socket) return; + if (typeof data === 'object') { + if (type) data.type = type; + this.socket.send($.toJSON(data)); + } else { + this.socket.send('|'+data); + } + }, + /** + * Receive from sim server + */ + receive: function() { + // + }, + + // Room management + + initializeRooms: function() { + this.rooms = {}; + }, + curRoom: null, + curSideRoom: null, + joinRoom: function(id, type) { + if (this.rooms[id]) { + this.focusRoom(id); + return this.rooms[id]; + } + + var room = this.addRoom(id, type); + this.focusRoom(id); + return room; + }, + addRoom: function(id, type) { + if (this.rooms[id]) return this.rooms[id]; + + var el = $('').appendTo('body'); + type = type || { + '': MainMenuRoom, + 'teambuilder': TeambuilderRoom, + 'ladder': LadderRoom + }[id]; + if (!type) type = ChatRoom; + var room = this.rooms[id] = new type({ + id: id, + el: el + }); + return room; + }, + focusRoom: function(id) { + var room = this.rooms[id]; + if (!room) return false; + if (this.curRoom === room || this.curSideRoom === room) return true; + + if (this.curRoom) { + this.curRoom.hide(); + this.curRoom = null; + } + this.curRoom = room; + this.curRoom.show(); + + app.navigate(id); + this.topbar.updateTabbar(); + return; + }, + leaveRoom: function(id) { + var room = this.rooms[id]; + if (!room) return false; + if (room.requestLeave && !room.requestLeave()) return false; + return this.removeRoom(id); + }, + removeRoom: function(id) { + var room = this.rooms[id]; + if (room) { + if (room === this.curRoom) this.focusRoom(''); + delete this.rooms[id]; + room.destroy(); + this.topbar.updateTabbar(); + return true; + } + return false; + } + }); + + var Topbar = this.Topbar = Backbone.View.extend({ + events: { + 'click a': 'click' + }, + initialize: function() { + this.$el.html('
'); + this.$tabbar = this.$('.maintabbar'); + this.$sidetabbar = this.$('.sidetabbar'); + this.updateTabbar(); + }, + '$tabbar': null, + updateTabbar: function() { + var curId = ''; + if (app.curRoom) curId = app.curRoom.id; + var buf = ''; + var atLeastOne = false; + for (var id in app.rooms) { + if (!id) continue; + var name = id; + if (id === 'lobby') name = ' Lobby chat'; + else if (id === 'teambuilder') name = ' Teambuilder'; + else if (id === 'ladder') name = ' Ladder'; + if (!atLeastOne) { + buf += '
    '; + atLeastOne = true; + } + buf += '
  • '+name+'
  • '; + } + if (atLeastOne) buf += '
'; + this.$tabbar.html(buf); + }, + click: function(e) { + e.preventDefault(); + var $target = $(e.currentTarget); + var id = $target.attr('href'); + if (id.substr(0, app.root.length) === app.root) { + id = id.substr(app.root.length); + } + if ($target.hasClass('closebutton')) { + app.leaveRoom(id); + } else { + app.focusRoom(id); + } + } + }); + + var Room = this.Room = Backbone.View.extend({ + + // communication + + /** + * Send to sim server + */ + send: function(data, type) { + if (!app.socket) return; + if (typeof data === 'object') { + if (type) data.type = type; + data.room = this.id; + app.socket.send($.toJSON(data)); + } else { + app.socket.send(''+this.id+'|'+data); + } + }, + /** + * Receive from sim server + */ + receive: function(data) { + // + }, + + // graphical + + show: function() { + this.$el.show(); + this.focus(); + }, + hide: function() { + this.blur(); + this.$el.hide(); + }, + focus: function() {}, + blur: function() {}, + + // allocation + + destroy: function() { + this.remove(); + delete this.app; + } + }); + + var ChatRoom = this.ChatRoom = Room.extend({ + initialize: function() { + var buf = '
Connecting...
'; + this.$el.addClass('ps-room-light').html(buf); + app.user.on('change', this.updateUser, this); + }, + updateUser: function() { + // + } + }); + +}).call(this, jQuery); diff --git a/js/lib/backbone.js b/js/lib/backbone.js new file mode 100644 index 000000000..3512d42fb --- /dev/null +++ b/js/lib/backbone.js @@ -0,0 +1,1571 @@ +// Backbone.js 1.0.0 + +// (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +(function(){ + + // Initial Setup + // ------------- + + // Save a reference to the global object (`window` in the browser, `exports` + // on the server). + var root = this; + + // Save the previous value of the `Backbone` variable, so that it can be + // restored later on, if `noConflict` is used. + var previousBackbone = root.Backbone; + + // Create local references to array methods we'll want to use later. + var array = []; + var push = array.push; + var slice = array.slice; + var splice = array.splice; + + // The top-level namespace. All public Backbone classes and modules will + // be attached to this. Exported for both the browser and the server. + var Backbone; + if (typeof exports !== 'undefined') { + Backbone = exports; + } else { + Backbone = root.Backbone = {}; + } + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '1.0.0'; + + // Require Underscore, if we're on the server, and it's not already present. + var _ = root._; + if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); + + // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns + // the `$` variable. + Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option + // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and + // set a `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Backbone.Events + // --------------- + + // A module that can be mixed in to *any object* in order to provide it with + // custom events. You may bind with `on` or remove with `off` callback + // functions to an event; `trigger`-ing an event fires all callbacks in + // succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.on('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + var Events = Backbone.Events = { + + // Bind an event to a `callback` function. Passing `"all"` will bind + // the callback to all events fired. + on: function(name, callback, context) { + if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this; + this._events || (this._events = {}); + var events = this._events[name] || (this._events[name] = []); + events.push({callback: callback, context: context, ctx: context || this}); + return this; + }, + + // Bind an event to only be triggered a single time. After the first time + // the callback is invoked, it will be removed. + once: function(name, callback, context) { + if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this; + var self = this; + var once = _.once(function() { + self.off(name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + return this.on(name, once, context); + }, + + // Remove one or many callbacks. If `context` is null, removes all + // callbacks with that function. If `callback` is null, removes all + // callbacks for the event. If `name` is null, removes all bound + // callbacks for all events. + off: function(name, callback, context) { + var retain, ev, events, names, i, l, j, k; + if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this; + if (!name && !callback && !context) { + this._events = {}; + return this; + } + + names = name ? [name] : _.keys(this._events); + for (i = 0, l = names.length; i < l; i++) { + name = names[i]; + if (events = this._events[name]) { + this._events[name] = retain = []; + if (callback || context) { + for (j = 0, k = events.length; j < k; j++) { + ev = events[j]; + if ((callback && callback !== ev.callback && callback !== ev.callback._callback) || + (context && context !== ev.context)) { + retain.push(ev); + } + } + } + if (!retain.length) delete this._events[name]; + } + } + + return this; + }, + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + trigger: function(name) { + if (!this._events) return this; + var args = slice.call(arguments, 1); + if (!eventsApi(this, 'trigger', name, args)) return this; + var events = this._events[name]; + var allEvents = this._events.all; + if (events) triggerEvents(events, args); + if (allEvents) triggerEvents(allEvents, arguments); + return this; + }, + + // Tell this object to stop listening to either specific events ... or + // to every object it's currently listening to. + stopListening: function(obj, name, callback) { + var listeners = this._listeners; + if (!listeners) return this; + var deleteListener = !name && !callback; + if (typeof name === 'object') callback = this; + if (obj) (listeners = {})[obj._listenerId] = obj; + for (var id in listeners) { + listeners[id].off(name, callback, this); + if (deleteListener) delete this._listeners[id]; + } + return this; + } + + }; + + // Regular expression used to split event strings. + var eventSplitter = /\s+/; + + // Implement fancy features of the Events API such as multiple event + // names `"change blur"` and jQuery-style event maps `{change: action}` + // in terms of the existing API. + var eventsApi = function(obj, action, name, rest) { + if (!name) return true; + + // Handle event maps. + if (typeof name === 'object') { + for (var key in name) { + obj[action].apply(obj, [key, name[key]].concat(rest)); + } + return false; + } + + // Handle space separated event names. + if (eventSplitter.test(name)) { + var names = name.split(eventSplitter); + for (var i = 0, l = names.length; i < l; i++) { + obj[action].apply(obj, [names[i]].concat(rest)); + } + return false; + } + + return true; + }; + + // A difficult-to-believe, but optimized internal dispatch function for + // triggering events. Tries to keep the usual cases speedy (most internal + // Backbone events have 3 arguments). + var triggerEvents = function(events, args) { + var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; + switch (args.length) { + case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; + case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; + case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; + case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; + default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); + } + }; + + var listenMethods = {listenTo: 'on', listenToOnce: 'once'}; + + // Inversion-of-control versions of `on` and `once`. Tell *this* object to + // listen to an event in another object ... keeping track of what it's + // listening to. + _.each(listenMethods, function(implementation, method) { + Events[method] = function(obj, name, callback) { + var listeners = this._listeners || (this._listeners = {}); + var id = obj._listenerId || (obj._listenerId = _.uniqueId('l')); + listeners[id] = obj; + if (typeof name === 'object') callback = this; + obj[implementation](name, callback, this); + return this; + }; + }); + + // Aliases for backwards compatibility. + Events.bind = Events.on; + Events.unbind = Events.off; + + // Allow the `Backbone` object to serve as a global event bus, for folks who + // want global "pubsub" in a convenient place. + _.extend(Backbone, Events); + + // Backbone.Model + // -------------- + + // Backbone **Models** are the basic data object in the framework -- + // frequently representing a row in a table in a database on your server. + // A discrete chunk of data and a bunch of useful, related methods for + // performing computations and transformations on that data. + + // Create a new model with the specified attributes. A client id (`cid`) + // is automatically generated and assigned for you. + var Model = Backbone.Model = function(attributes, options) { + var defaults; + var attrs = attributes || {}; + options || (options = {}); + this.cid = _.uniqueId('c'); + this.attributes = {}; + _.extend(this, _.pick(options, modelOptions)); + if (options.parse) attrs = this.parse(attrs, options) || {}; + if (defaults = _.result(this, 'defaults')) { + attrs = _.defaults({}, attrs, defaults); + } + this.set(attrs, options); + this.changed = {}; + this.initialize.apply(this, arguments); + }; + + // A list of options to be attached directly to the model, if provided. + var modelOptions = ['url', 'urlRoot', 'collection']; + + // Attach all inheritable methods to the Model prototype. + _.extend(Model.prototype, Events, { + + // A hash of attributes whose current and previous value differ. + changed: null, + + // The value returned during the last failed validation. + validationError: null, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute: 'id', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Return a copy of the model's `attributes` object. + toJSON: function(options) { + return _.clone(this.attributes); + }, + + // Proxy `Backbone.sync` by default -- but override this if you need + // custom syncing semantics for *this* particular model. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Get the value of an attribute. + get: function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape: function(attr) { + return _.escape(this.get(attr)); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has: function(attr) { + return this.get(attr) != null; + }, + + // Set a hash of model attributes on the object, firing `"change"`. This is + // the core primitive operation of a model, updating the data and notifying + // anyone who needs to know about the change in state. The heart of the beast. + set: function(key, val, options) { + var attr, attrs, unset, changes, silent, changing, prev, current; + if (key == null) return this; + + // Handle both `"key", value` and `{key: value}` -style arguments. + if (typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options || (options = {}); + + // Run validation. + if (!this._validate(attrs, options)) return false; + + // Extract attributes and options. + unset = options.unset; + silent = options.silent; + changes = []; + changing = this._changing; + this._changing = true; + + if (!changing) { + this._previousAttributes = _.clone(this.attributes); + this.changed = {}; + } + current = this.attributes, prev = this._previousAttributes; + + // Check for changes of `id`. + if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; + + // For each `set` attribute, update or delete the current value. + for (attr in attrs) { + val = attrs[attr]; + if (!_.isEqual(current[attr], val)) changes.push(attr); + if (!_.isEqual(prev[attr], val)) { + this.changed[attr] = val; + } else { + delete this.changed[attr]; + } + unset ? delete current[attr] : current[attr] = val; + } + + // Trigger all relevant attribute changes. + if (!silent) { + if (changes.length) this._pending = true; + for (var i = 0, l = changes.length; i < l; i++) { + this.trigger('change:' + changes[i], this, current[changes[i]], options); + } + } + + // You might be wondering why there's a `while` loop here. Changes can + // be recursively nested within `"change"` events. + if (changing) return this; + if (!silent) { + while (this._pending) { + this._pending = false; + this.trigger('change', this, options); + } + } + this._pending = false; + this._changing = false; + return this; + }, + + // Remove an attribute from the model, firing `"change"`. `unset` is a noop + // if the attribute doesn't exist. + unset: function(attr, options) { + return this.set(attr, void 0, _.extend({}, options, {unset: true})); + }, + + // Clear all attributes on the model, firing `"change"`. + clear: function(options) { + var attrs = {}; + for (var key in this.attributes) attrs[key] = void 0; + return this.set(attrs, _.extend({}, options, {unset: true})); + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged: function(attr) { + if (attr == null) return !_.isEmpty(this.changed); + return _.has(this.changed, attr); + }, + + // Return an object containing all the attributes that have changed, or + // false if there are no changed attributes. Useful for determining what + // parts of a view need to be updated and/or what attributes need to be + // persisted to the server. Unset attributes will be set to undefined. + // You can also pass an attributes object to diff against the model, + // determining if there *would be* a change. + changedAttributes: function(diff) { + if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; + var val, changed = false; + var old = this._changing ? this._previousAttributes : this.attributes; + for (var attr in diff) { + if (_.isEqual(old[attr], (val = diff[attr]))) continue; + (changed || (changed = {}))[attr] = val; + } + return changed; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous: function(attr) { + if (attr == null || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes: function() { + return _.clone(this._previousAttributes); + }, + + // Fetch the model from the server. If the server's representation of the + // model differs from its current attributes, they will be overridden, + // triggering a `"change"` event. + fetch: function(options) { + options = options ? _.clone(options) : {}; + if (options.parse === void 0) options.parse = true; + var model = this; + var success = options.success; + options.success = function(resp) { + if (!model.set(model.parse(resp, options), options)) return false; + if (success) success(model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save: function(key, val, options) { + var attrs, method, xhr, attributes = this.attributes; + + // Handle both `"key", value` and `{key: value}` -style arguments. + if (key == null || typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`. + if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false; + + options = _.extend({validate: true}, options); + + // Do not persist invalid models. + if (!this._validate(attrs, options)) return false; + + // Set temporary attributes if `{wait: true}`. + if (attrs && options.wait) { + this.attributes = _.extend({}, attributes, attrs); + } + + // After a successful server-side save, the client is (optionally) + // updated with the server-side state. + if (options.parse === void 0) options.parse = true; + var model = this; + var success = options.success; + options.success = function(resp) { + // Ensure attributes are restored during synchronous saves. + model.attributes = attributes; + var serverAttrs = model.parse(resp, options); + if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); + if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { + return false; + } + if (success) success(model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + + method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); + if (method === 'patch') options.attrs = attrs; + xhr = this.sync(method, this, options); + + // Restore attributes. + if (attrs && options.wait) this.attributes = attributes; + + return xhr; + }, + + // Destroy this model on the server if it was already persisted. + // Optimistically removes the model from its collection, if it has one. + // If `wait: true` is passed, waits for the server to respond before removal. + destroy: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + + var destroy = function() { + model.trigger('destroy', model, model.collection, options); + }; + + options.success = function(resp) { + if (options.wait || model.isNew()) destroy(); + if (success) success(model, resp, options); + if (!model.isNew()) model.trigger('sync', model, resp, options); + }; + + if (this.isNew()) { + options.success(); + return false; + } + wrapError(this, options); + + var xhr = this.sync('delete', this, options); + if (!options.wait) destroy(); + return xhr; + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url: function() { + var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); + if (this.isNew()) return base; + return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse: function(resp, options) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone: function() { + return new this.constructor(this.attributes); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew: function() { + return this.id == null; + }, + + // Check if the model is currently in a valid state. + isValid: function(options) { + return this._validate({}, _.extend(options || {}, { validate: true })); + }, + + // Run validation against the next complete set of model attributes, + // returning `true` if all is well. Otherwise, fire an `"invalid"` event. + _validate: function(attrs, options) { + if (!options.validate || !this.validate) return true; + attrs = _.extend({}, this.attributes, attrs); + var error = this.validationError = this.validate(attrs, options) || null; + if (!error) return true; + this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error})); + return false; + } + + }); + + // Underscore methods that we want to implement on the Model. + var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit']; + + // Mix in each Underscore method as a proxy to `Model#attributes`. + _.each(modelMethods, function(method) { + Model.prototype[method] = function() { + var args = slice.call(arguments); + args.unshift(this.attributes); + return _[method].apply(_, args); + }; + }); + + // Backbone.Collection + // ------------------- + + // If models tend to represent a single row of data, a Backbone Collection is + // more analagous to a table full of data ... or a small slice or page of that + // table, or a collection of rows that belong together for a particular reason + // -- all of the messages in this particular folder, all of the documents + // belonging to this particular author, and so on. Collections maintain + // indexes of their models, both in order, and for lookup by `id`. + + // Create a new **Collection**, perhaps to contain a specific type of `model`. + // If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + var Collection = Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.url) this.url = options.url; + if (options.model) this.model = options.model; + if (options.comparator !== void 0) this.comparator = options.comparator; + this._reset(); + this.initialize.apply(this, arguments); + if (models) this.reset(models, _.extend({silent: true}, options)); + }; + + // Default options for `Collection#set`. + var setOptions = {add: true, remove: true, merge: true}; + var addOptions = {add: true, merge: false, remove: false}; + + // Define the Collection's inheritable methods. + _.extend(Collection.prototype, Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model: Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON: function(options) { + return this.map(function(model){ return model.toJSON(options); }); + }, + + // Proxy `Backbone.sync` by default. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Add a model, or list of models to the set. + add: function(models, options) { + return this.set(models, _.defaults(options || {}, addOptions)); + }, + + // Remove a model, or a list of models from the set. + remove: function(models, options) { + models = _.isArray(models) ? models.slice() : [models]; + options || (options = {}); + var i, l, index, model; + for (i = 0, l = models.length; i < l; i++) { + model = this.get(models[i]); + if (!model) continue; + delete this._byId[model.id]; + delete this._byId[model.cid]; + index = this.indexOf(model); + this.models.splice(index, 1); + this.length--; + if (!options.silent) { + options.index = index; + model.trigger('remove', model, this, options); + } + this._removeReference(model); + } + return this; + }, + + // Update a collection by `set`-ing a new list of models, adding new ones, + // removing models that are no longer present, and merging models that + // already exist in the collection, as necessary. Similar to **Model#set**, + // the core operation for updating the data contained by the collection. + set: function(models, options) { + options = _.defaults(options || {}, setOptions); + if (options.parse) models = this.parse(models, options); + if (!_.isArray(models)) models = models ? [models] : []; + var i, l, model, attrs, existing, sort; + var at = options.at; + var sortable = this.comparator && (at == null) && options.sort !== false; + var sortAttr = _.isString(this.comparator) ? this.comparator : null; + var toAdd = [], toRemove = [], modelMap = {}; + + // Turn bare objects into model references, and prevent invalid models + // from being added. + for (i = 0, l = models.length; i < l; i++) { + if (!(model = this._prepareModel(models[i], options))) continue; + + // If a duplicate is found, prevent it from being added and + // optionally merge it into the existing model. + if (existing = this.get(model)) { + if (options.remove) modelMap[existing.cid] = true; + if (options.merge) { + existing.set(model.attributes, options); + if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true; + } + + // This is a new model, push it to the `toAdd` list. + } else if (options.add) { + toAdd.push(model); + + // Listen to added models' events, and index models for lookup by + // `id` and by `cid`. + model.on('all', this._onModelEvent, this); + this._byId[model.cid] = model; + if (model.id != null) this._byId[model.id] = model; + } + } + + // Remove nonexistent models if appropriate. + if (options.remove) { + for (i = 0, l = this.length; i < l; ++i) { + if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model); + } + if (toRemove.length) this.remove(toRemove, options); + } + + // See if sorting is needed, update `length` and splice in new models. + if (toAdd.length) { + if (sortable) sort = true; + this.length += toAdd.length; + if (at != null) { + splice.apply(this.models, [at, 0].concat(toAdd)); + } else { + push.apply(this.models, toAdd); + } + } + + // Silently sort the collection if appropriate. + if (sort) this.sort({silent: true}); + + if (options.silent) return this; + + // Trigger `add` events. + for (i = 0, l = toAdd.length; i < l; i++) { + (model = toAdd[i]).trigger('add', model, this, options); + } + + // Trigger `sort` if the collection was sorted. + if (sort) this.trigger('sort', this, options); + return this; + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any granular `add` or `remove` events. Fires `reset` when finished. + // Useful for bulk operations and optimizations. + reset: function(models, options) { + options || (options = {}); + for (var i = 0, l = this.models.length; i < l; i++) { + this._removeReference(this.models[i]); + } + options.previousModels = this.models; + this._reset(); + this.add(models, _.extend({silent: true}, options)); + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Add a model to the end of the collection. + push: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, _.extend({at: this.length}, options)); + return model; + }, + + // Remove a model from the end of the collection. + pop: function(options) { + var model = this.at(this.length - 1); + this.remove(model, options); + return model; + }, + + // Add a model to the beginning of the collection. + unshift: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, _.extend({at: 0}, options)); + return model; + }, + + // Remove a model from the beginning of the collection. + shift: function(options) { + var model = this.at(0); + this.remove(model, options); + return model; + }, + + // Slice out a sub-array of models from the collection. + slice: function(begin, end) { + return this.models.slice(begin, end); + }, + + // Get a model from the set by id. + get: function(obj) { + if (obj == null) return void 0; + return this._byId[obj.id != null ? obj.id : obj.cid || obj]; + }, + + // Get the model at the given index. + at: function(index) { + return this.models[index]; + }, + + // Return models with matching attributes. Useful for simple cases of + // `filter`. + where: function(attrs, first) { + if (_.isEmpty(attrs)) return first ? void 0 : []; + return this[first ? 'find' : 'filter'](function(model) { + for (var key in attrs) { + if (attrs[key] !== model.get(key)) return false; + } + return true; + }); + }, + + // Return the first model with matching attributes. Useful for simple cases + // of `find`. + findWhere: function(attrs) { + return this.where(attrs, true); + }, + + // Force the collection to re-sort itself. You don't need to call this under + // normal circumstances, as the set will maintain sort order as each item + // is added. + sort: function(options) { + if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); + options || (options = {}); + + // Run sort based on type of `comparator`. + if (_.isString(this.comparator) || this.comparator.length === 1) { + this.models = this.sortBy(this.comparator, this); + } else { + this.models.sort(_.bind(this.comparator, this)); + } + + if (!options.silent) this.trigger('sort', this, options); + return this; + }, + + // Figure out the smallest index at which a model should be inserted so as + // to maintain order. + sortedIndex: function(model, value, context) { + value || (value = this.comparator); + var iterator = _.isFunction(value) ? value : function(model) { + return model.get(value); + }; + return _.sortedIndex(this.models, model, iterator, context); + }, + + // Pluck an attribute from each model in the collection. + pluck: function(attr) { + return _.invoke(this.models, 'get', attr); + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `reset: true` is passed, the response + // data will be passed through the `reset` method instead of `set`. + fetch: function(options) { + options = options ? _.clone(options) : {}; + if (options.parse === void 0) options.parse = true; + var success = options.success; + var collection = this; + options.success = function(resp) { + var method = options.reset ? 'reset' : 'set'; + collection[method](resp, options); + if (success) success(collection, resp, options); + collection.trigger('sync', collection, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Create a new instance of a model in this collection. Add the model to the + // collection immediately, unless `wait: true` is passed, in which case we + // wait for the server to agree. + create: function(model, options) { + options = options ? _.clone(options) : {}; + if (!(model = this._prepareModel(model, options))) return false; + if (!options.wait) this.add(model, options); + var collection = this; + var success = options.success; + options.success = function(resp) { + if (options.wait) collection.add(model, options); + if (success) success(model, resp, options); + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse: function(resp, options) { + return resp; + }, + + // Create a new collection with an identical list of models as this one. + clone: function() { + return new this.constructor(this.models); + }, + + // Private method to reset all internal state. Called when the collection + // is first initialized or reset. + _reset: function() { + this.length = 0; + this.models = []; + this._byId = {}; + }, + + // Prepare a hash of attributes (or other model) to be added to this + // collection. + _prepareModel: function(attrs, options) { + if (attrs instanceof Model) { + if (!attrs.collection) attrs.collection = this; + return attrs; + } + options || (options = {}); + options.collection = this; + var model = new this.model(attrs, options); + if (!model._validate(attrs, options)) { + this.trigger('invalid', this, attrs, options); + return false; + } + return model; + }, + + // Internal method to sever a model's ties to a collection. + _removeReference: function(model) { + if (this === model.collection) delete model.collection; + model.off('all', this._onModelEvent, this); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent: function(event, model, collection, options) { + if ((event === 'add' || event === 'remove') && collection !== this) return; + if (event === 'destroy') this.remove(model, options); + if (model && event === 'change:' + model.idAttribute) { + delete this._byId[model.previous(model.idAttribute)]; + if (model.id != null) this._byId[model.id] = model; + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + // 90% of the core usefulness of Backbone Collections is actually implemented + // right here: + var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', + 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', + 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', + 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', + 'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf', + 'isEmpty', 'chain']; + + // Mix in each Underscore method as a proxy to `Collection#models`. + _.each(methods, function(method) { + Collection.prototype[method] = function() { + var args = slice.call(arguments); + args.unshift(this.models); + return _[method].apply(_, args); + }; + }); + + // Underscore methods that take a property name as an argument. + var attributeMethods = ['groupBy', 'countBy', 'sortBy']; + + // Use attributes instead of properties. + _.each(attributeMethods, function(method) { + Collection.prototype[method] = function(value, context) { + var iterator = _.isFunction(value) ? value : function(model) { + return model.get(value); + }; + return _[method](this.models, iterator, context); + }; + }); + + // Backbone.View + // ------------- + + // Backbone Views are almost more convention than they are actual code. A View + // is simply a JavaScript object that represents a logical chunk of UI in the + // DOM. This might be a single item, an entire list, a sidebar or panel, or + // even the surrounding frame which wraps your whole app. Defining a chunk of + // UI as a **View** allows you to define your DOM events declaratively, without + // having to worry about render order ... and makes it easy for the view to + // react to specific changes in the state of your models. + + // Creating a Backbone.View creates its initial element outside of the DOM, + // if an existing element is not provided... + var View = Backbone.View = function(options) { + this.cid = _.uniqueId('view'); + this._configure(options || {}); + this._ensureElement(); + this.initialize.apply(this, arguments); + this.delegateEvents(); + }; + + // Cached regex to split keys for `delegate`. + var delegateEventSplitter = /^(\S+)\s*(.*)$/; + + // List of view options to be merged as properties. + var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; + + // Set up all inheritable **Backbone.View** properties and methods. + _.extend(View.prototype, Events, { + + // The default `tagName` of a View's element is `"div"`. + tagName: 'div', + + // jQuery delegate for element lookup, scoped to DOM elements within the + // current view. This should be prefered to global lookups where possible. + $: function(selector) { + return this.$el.find(selector); + }, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // **render** is the core function that your view should override, in order + // to populate its element (`this.el`), with the appropriate HTML. The + // convention is for **render** to always return `this`. + render: function() { + return this; + }, + + // Remove this view by taking the element out of the DOM, and removing any + // applicable Backbone.Events listeners. + remove: function() { + this.$el.remove(); + this.stopListening(); + return this; + }, + + // Change the view's element (`this.el` property), including event + // re-delegation. + setElement: function(element, delegate) { + if (this.$el) this.undelegateEvents(); + this.$el = element instanceof Backbone.$ ? element : Backbone.$(element); + this.el = this.$el[0]; + if (delegate !== false) this.delegateEvents(); + return this; + }, + + // Set callbacks, where `this.events` is a hash of + // + // *{"event selector": "callback"}* + // + // { + // 'mousedown .title': 'edit', + // 'click .button': 'save' + // 'click .open': function(e) { ... } + // } + // + // pairs. Callbacks will be bound to the view, with `this` set properly. + // Uses event delegation for efficiency. + // Omitting the selector binds the event to `this.el`. + // This only works for delegate-able events: not `focus`, `blur`, and + // not `change`, `submit`, and `reset` in Internet Explorer. + delegateEvents: function(events) { + if (!(events || (events = _.result(this, 'events')))) return this; + this.undelegateEvents(); + for (var key in events) { + var method = events[key]; + if (!_.isFunction(method)) method = this[events[key]]; + if (!method) continue; + + var match = key.match(delegateEventSplitter); + var eventName = match[1], selector = match[2]; + method = _.bind(method, this); + eventName += '.delegateEvents' + this.cid; + if (selector === '') { + this.$el.on(eventName, method); + } else { + this.$el.on(eventName, selector, method); + } + } + return this; + }, + + // Clears all callbacks previously bound to the view with `delegateEvents`. + // You usually don't need to use this, but may wish to if you have multiple + // Backbone views attached to the same DOM element. + undelegateEvents: function() { + this.$el.off('.delegateEvents' + this.cid); + return this; + }, + + // Performs the initial configuration of a View with a set of options. + // Keys with special meaning *(e.g. model, collection, id, className)* are + // attached directly to the view. See `viewOptions` for an exhaustive + // list. + _configure: function(options) { + if (this.options) options = _.extend({}, _.result(this, 'options'), options); + _.extend(this, _.pick(options, viewOptions)); + this.options = options; + }, + + // Ensure that the View has a DOM element to render into. + // If `this.el` is a string, pass it through `$()`, take the first + // matching element, and re-assign it to `el`. Otherwise, create + // an element from the `id`, `className` and `tagName` properties. + _ensureElement: function() { + if (!this.el) { + var attrs = _.extend({}, _.result(this, 'attributes')); + if (this.id) attrs.id = _.result(this, 'id'); + if (this.className) attrs['class'] = _.result(this, 'className'); + var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs); + this.setElement($el, false); + } else { + this.setElement(_.result(this, 'el'), false); + } + } + + }); + + // Backbone.sync + // ------------- + + // Override this function to change the manner in which Backbone persists + // models to the server. You will be passed the type of request, and the + // model in question. By default, makes a RESTful Ajax request + // to the model's `url()`. Some possible customizations could be: + // + // * Use `setTimeout` to batch rapid-fire updates into a single request. + // * Send up the models as XML instead of JSON. + // * Persist models via WebSockets instead of Ajax. + // + // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests + // as `POST`, with a `_method` parameter containing the true HTTP method, + // as well as all requests with the body as `application/x-www-form-urlencoded` + // instead of `application/json` with the model in a param named `model`. + // Useful when interfacing with server-side languages like **PHP** that make + // it difficult to read the body of `PUT` requests. + Backbone.sync = function(method, model, options) { + var type = methodMap[method]; + + // Default options, unless specified. + _.defaults(options || (options = {}), { + emulateHTTP: Backbone.emulateHTTP, + emulateJSON: Backbone.emulateJSON + }); + + // Default JSON-request options. + var params = {type: type, dataType: 'json'}; + + // Ensure that we have a URL. + if (!options.url) { + params.url = _.result(model, 'url') || urlError(); + } + + // Ensure that we have the appropriate request data. + if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { + params.contentType = 'application/json'; + params.data = JSON.stringify(options.attrs || model.toJSON(options)); + } + + // For older servers, emulate JSON by encoding the request into an HTML-form. + if (options.emulateJSON) { + params.contentType = 'application/x-www-form-urlencoded'; + params.data = params.data ? {model: params.data} : {}; + } + + // For older servers, emulate HTTP by mimicking the HTTP method with `_method` + // And an `X-HTTP-Method-Override` header. + if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { + params.type = 'POST'; + if (options.emulateJSON) params.data._method = type; + var beforeSend = options.beforeSend; + options.beforeSend = function(xhr) { + xhr.setRequestHeader('X-HTTP-Method-Override', type); + if (beforeSend) return beforeSend.apply(this, arguments); + }; + } + + // Don't process data on a non-GET request. + if (params.type !== 'GET' && !options.emulateJSON) { + params.processData = false; + } + + // If we're sending a `PATCH` request, and we're in an old Internet Explorer + // that still has ActiveX enabled by default, override jQuery to use that + // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8. + if (params.type === 'PATCH' && window.ActiveXObject && + !(window.external && window.external.msActiveXFilteringEnabled)) { + params.xhr = function() { + return new ActiveXObject("Microsoft.XMLHTTP"); + }; + } + + // Make the request, allowing the user to override any Ajax options. + var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); + model.trigger('request', model, xhr, options); + return xhr; + }; + + // Map from CRUD to HTTP for our default `Backbone.sync` implementation. + var methodMap = { + 'create': 'POST', + 'update': 'PUT', + 'patch': 'PATCH', + 'delete': 'DELETE', + 'read': 'GET' + }; + + // Set the default implementation of `Backbone.ajax` to proxy through to `$`. + // Override this if you'd like to use a different library. + Backbone.ajax = function() { + return Backbone.$.ajax.apply(Backbone.$, arguments); + }; + + // Backbone.Router + // --------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var optionalParam = /\((.*?)\)/g; + var namedParam = /(\(\?)?:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function(route, name, callback) { + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (_.isFunction(name)) { + callback = name; + name = ''; + } + if (!callback) callback = this[name]; + var router = this; + Backbone.history.route(route, function(fragment) { + var args = router._extractParameters(route, fragment); + callback && callback.apply(router, args); + router.trigger.apply(router, ['route:' + name].concat(args)); + router.trigger('route', name, args); + Backbone.history.trigger('route', router, name, args); + }); + return this; + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate: function(fragment, options) { + Backbone.history.navigate(fragment, options); + return this; + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function() { + if (!this.routes) return; + this.routes = _.result(this, 'routes'); + var route, routes = _.keys(this.routes); + while ((route = routes.pop()) != null) { + this.route(route, this.routes[route]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function(route) { + route = route.replace(escapeRegExp, '\\$&') + .replace(optionalParam, '(?:$1)?') + .replace(namedParam, function(match, optional){ + return optional ? match : '([^\/]+)'; + }) + .replace(splatParam, '(.*?)'); + return new RegExp('^' + route + '$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted decoded parameters. Empty or unmatched parameters will be + // treated as `null` to normalize cross-browser behavior. + _extractParameters: function(route, fragment) { + var params = route.exec(fragment).slice(1); + return _.map(params, function(param) { + return param ? decodeURIComponent(param) : null; + }); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on either + // [pushState](http://diveintohtml5.info/history.html) and real URLs, or + // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) + // and URL fragments. If the browser supports neither (old IE, natch), + // falls back to polling. + var History = Backbone.History = function() { + this.handlers = []; + _.bindAll(this, 'checkUrl'); + + // Ensure that `History` can be used outside of the browser. + if (typeof window !== 'undefined') { + this.location = window.location; + this.history = window.history; + } + }; + + // Cached regex for stripping a leading hash/slash and trailing space. + var routeStripper = /^[#\/]|\s+$/g; + + // Cached regex for stripping leading and trailing slashes. + var rootStripper = /^\/+|\/+$/g; + + // Cached regex for detecting MSIE. + var isExplorer = /msie [\w.]+/; + + // Cached regex for removing a trailing slash. + var trailingSlash = /\/$/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function(window) { + var match = (window || this).location.href.match(/#(.*)$/); + return match ? match[1] : ''; + }, + + // Get the cross-browser normalized URL fragment, either from the URL, + // the hash, or the override. + getFragment: function(fragment, forcePushState) { + if (fragment == null) { + if (this._hasPushState || !this._wantsHashChange || forcePushState) { + fragment = this.location.pathname; + var root = this.root.replace(trailingSlash, ''); + if (!fragment.indexOf(root)) fragment = fragment.substr(root.length); + } else { + fragment = this.getHash(); + } + } + return fragment.replace(routeStripper, ''); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function(options) { + if (History.started) throw new Error("Backbone.history has already been started"); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({}, {root: '/'}, this.options, options); + this.root = this.options.root; + this._wantsHashChange = this.options.hashChange !== false; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); + var fragment = this.getFragment(); + var docMode = document.documentMode; + var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); + + // Normalize root to always include a leading and trailing slash. + this.root = ('/' + this.root + '/').replace(rootStripper, '/'); + + if (oldIE && this._wantsHashChange) { + this.iframe = Backbone.$('