` container.
-
-``` javascript
-$(document).pjax('[data-pjax] a, a[data-pjax]', '#pjax-container')
-```
-
-#### Arguments
-
-The synopsis for the `$.fn.pjax` function is:
-
-``` javascript
-$(document).pjax(selector, [container], options)
-```
-
-1. `selector` is a string to be used for click [event delegation][$.fn.on].
-2. `container` is a string selector that uniquely identifies the pjax container.
-3. `options` is an object with keys described below.
-
-##### pjax options
-
-key | default | description
-----|---------|------------
-`timeout` | 650 | ajax timeout in milliseconds after which a full refresh is forced
-`push` | true | use [pushState][] to add a browser history entry upon navigation
-`replace` | false | replace URL without adding browser history entry
-`maxCacheLength` | 20 | maximum cache size for previous container contents
-`version` | | a string or function returning the current pjax version
-`scrollTo` | 0 | vertical position to scroll to after navigation
-`type` | `"GET"` | see [$.ajax][]
-`dataType` | `"html"` | see [$.ajax][]
-`container` | | CSS selector for the element where content should be replaced
-`url` | link.href | a string or function that returns the URL for the ajax request
-`target` | link | eventually the `relatedTarget` value for [pjax events](#events)
-`fragment` | `"body"` | CSS selector for the fragment to extract from ajax response
-
-You can change the defaults globally by writing to the `$.pjax.defaults` object:
-
-``` javascript
-$.pjax.defaults.timeout = 1200
-```
-
-### `$.pjax.click`
-
-This is a lower level function used by `$.fn.pjax` itself. It allows you to get a little more control over the pjax event handling.
-
-This example uses the current click context to set an ancestor as the container:
-
-``` javascript
-if ($.support.pjax) {
- $(document).on('click', 'a[data-pjax]', function(event) {
- var container = $(this).closest('[data-pjax-container]')
- $.pjax.click(event, {container: container})
- })
-}
-```
-
-**NOTE** Use the explicit `$.support.pjax` guard. We aren't using `$.fn.pjax` so we should avoid binding this event handler unless the browser is actually going to use pjax.
-
-### `$.pjax.submit`
-
-Submits a form via pjax. This function is experimental but GitHub uses it on [Gist][gist] so give it a shot!
-
-``` javascript
-$(document).on('submit', 'form[data-pjax]', function(event) {
- $.pjax.submit(event, '#pjax-container')
-})
-```
-
-### `$.pjax.reload`
-
-Initiates a request for the current URL to the server using pjax mechanism and replaces the container with the response. Does not add a browser history entry.
-
-``` javascript
-$.pjax.reload('#pjax-container', options)
-```
-
-### `$.pjax`
-
-Manual pjax invocation. Used mainly when you want to start a pjax request in a handler that didn't originate from a click. If you can get access to a click `event`, consider `$.pjax.click(event)` instead.
-
-``` javascript
-function applyFilters() {
- var url = urlForFilters()
- $.pjax({url: url, container: '#pjax-container'})
-}
-```
-
-### Events
-
-All pjax events except `pjax:click` & `pjax:clicked` are fired from the pjax
-container, not the link that was clicked.
-
-
-
- event |
- cancel |
- arguments |
- notes |
-
-
- event lifecycle upon following a pjaxed link |
-
-
- pjax:click |
- ✔︎ |
- options |
- fires from a link that got activated; cancel to prevent pjax |
-
-
- pjax:beforeSend |
- ✔︎ |
- xhr, options |
- can set XHR headers |
-
-
- pjax:start |
- |
- xhr, options |
- |
-
-
- pjax:send |
- |
- xhr, options |
- |
-
-
- pjax:clicked |
- |
- options |
- fires after pjax has started from a link that got clicked |
-
-
- pjax:beforeReplace |
- |
- contents, options |
- before replacing HTML with content loaded from the server |
-
-
- pjax:success |
- |
- data, status, xhr, options |
- after replacing HTML content loaded from the server |
-
-
- pjax:timeout |
- ✔︎ |
- xhr, options |
- fires after options.timeout ; will hard refresh unless canceled |
-
-
- pjax:error |
- ✔︎ |
- xhr, textStatus, error, options |
- on ajax error; will hard refresh unless canceled |
-
-
- pjax:complete |
- |
- xhr, textStatus, options |
- always fires after ajax, regardless of result |
-
-
- pjax:end |
- |
- xhr, options |
- |
-
-
- event lifecycle on browser Back/Forward navigation |
-
-
- pjax:popstate |
- |
- |
- event direction property: "back"/"forward" |
-
-
- pjax:start |
- |
- null, options |
- before replacing content |
-
-
- pjax:beforeReplace |
- |
- contents, options |
- right before replacing HTML with content from cache |
-
-
- pjax:end |
- |
- null, options |
- after replacing content |
-
-
-
-`pjax:send` & `pjax:complete` are a good pair of events to use if you are implementing a
-loading indicator. They'll only be triggered if an actual XHR request is made,
-not if the content is loaded from cache:
-
-``` javascript
-$(document).on('pjax:send', function() {
- $('#loading').show()
-})
-$(document).on('pjax:complete', function() {
- $('#loading').hide()
-})
-```
-
-An example of canceling a `pjax:timeout` event would be to disable the fallback
-timeout behavior if a spinner is being shown:
-
-``` javascript
-$(document).on('pjax:timeout', function(event) {
- // Prevent default timeout redirection behavior
- event.preventDefault()
-})
-```
-
-### Server side
-
-Server configuration will vary between languages and frameworks. The following example shows how you might configure Rails.
-
-``` ruby
-def index
- if request.headers['X-PJAX']
- render :layout => false
- end
-end
-```
-
-An `X-PJAX` request header is set to differentiate a pjax request from normal XHR requests. In this case, if the request is pjax, we skip the layout html and just render the inner contents of the container.
-
-Check if your favorite server framework supports pjax here: https://gist.github.com/4283721
-
-#### Layout Reloading
-
-Layouts can be forced to do a hard reload when assets or html changes.
-
-First set the initial layout version in your header with a custom meta tag.
-
-``` html
-
-```
-
-Then from the server side, set the `X-PJAX-Version` header to the same.
-
-``` ruby
-if request.headers['X-PJAX']
- response.headers['X-PJAX-Version'] = "v123"
-end
-```
-
-Deploying a deploy, bumping the version constant to force clients to do a full reload the next request getting the new layout and assets.
-
-### Legacy API
-
-Pre 1.0 versions used an older style syntax that was analogous to the now deprecated `$.fn.live` api. The current api is based off `$.fn.on`.
-
-``` javascript
-$('a[data-pjax]').pjax('#pjax-container')
-```
-
-Expanded to
-
-``` javascript
-$('a[data-pjax]').live('click', function(event) {
- $.pjax.click(event, '#pjax-container')
-})
-```
-
-The new api
-
-``` javascript
-$(document).pjax('a[data-pjax]', '#pjax-container')
-```
-
-Which is roughly the same as
-
-``` javascript
-$(document).on('click', 'a[data-pjax]', function(event) {
- $.pjax.click(event, '#pjax-container')
-})
-```
-
-**NOTE** The new api gives you control over the delegated element container. `$.fn.live` always bound to `document`. This is what you still want to do most of the time.
-
-## Contributing
-
-```
-$ git clone https://github.com/defunkt/jquery-pjax.git
-$ cd jquery-pjax/
-```
-
-To run the test suite locally, start up the Sinatra test application.
-
-```
-$ bundle install
-$ bundle exec ruby test/app.rb
-== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick
-
-# in another tab:
-$ open http://localhost:4567/
-```
-
-[compat]: http://caniuse.com/#search=pushstate
-[gist]: https://gist.github.com/
-[$.fn.on]: http://api.jquery.com/on/
-[$.ajax]: http://api.jquery.com/jQuery.ajax/
-[pushState]: https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries
diff --git a/source/vendors/jquery-pjax/bower.json b/source/vendors/jquery-pjax/bower.json
deleted file mode 100644
index 1d8e32830..000000000
--- a/source/vendors/jquery-pjax/bower.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "name": "jquery-pjax",
- "version": "1.9.4",
- "main": "./jquery.pjax.js",
- "dependencies": {
- "jquery": ">=1.8"
- },
- "ignore": [
- ".travis.yml",
- "Gemfile",
- "Gemfile.lock",
- "vendor/",
- "script/",
- "test/"
- ]
-}
diff --git a/source/vendors/jquery-pjax/jquery.pjax.js b/source/vendors/jquery-pjax/jquery.pjax.js
deleted file mode 100644
index 444891e36..000000000
--- a/source/vendors/jquery-pjax/jquery.pjax.js
+++ /dev/null
@@ -1,897 +0,0 @@
-/*!
- * Copyright 2012, Chris Wanstrath
- * Released under the MIT License
- * https://github.com/defunkt/jquery-pjax
- */
-
-(function($){
-
-// When called on a container with a selector, fetches the href with
-// ajax into the container or with the data-pjax attribute on the link
-// itself.
-//
-// Tries to make sure the back button and ctrl+click work the way
-// you'd expect.
-//
-// Exported as $.fn.pjax
-//
-// Accepts a jQuery ajax options object that may include these
-// pjax specific options:
-//
-//
-// container - Where to stick the response body. Usually a String selector.
-// $(container).html(xhr.responseBody)
-// (default: current jquery context)
-// push - Whether to pushState the URL. Defaults to true (of course).
-// replace - Want to use replaceState instead? That's cool.
-//
-// For convenience the second parameter can be either the container or
-// the options object.
-//
-// Returns the jQuery object
-function fnPjax(selector, container, options) {
- var context = this
- return this.on('click.pjax', selector, function(event) {
- var opts = $.extend({}, optionsFor(container, options))
- if (!opts.container)
- opts.container = $(this).attr('data-pjax') || context
- handleClick(event, opts)
- })
-}
-
-// Public: pjax on click handler
-//
-// Exported as $.pjax.click.
-//
-// event - "click" jQuery.Event
-// options - pjax options
-//
-// Examples
-//
-// $(document).on('click', 'a', $.pjax.click)
-// // is the same as
-// $(document).pjax('a')
-//
-// $(document).on('click', 'a', function(event) {
-// var container = $(this).closest('[data-pjax-container]')
-// $.pjax.click(event, container)
-// })
-//
-// Returns nothing.
-function handleClick(event, container, options) {
- options = optionsFor(container, options)
-
- var link = event.currentTarget
-
- if (link.tagName.toUpperCase() !== 'A')
- throw "$.fn.pjax or $.pjax.click requires an anchor element"
-
- // Middle click, cmd click, and ctrl click should open
- // links in a new tab as normal.
- if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey )
- return
-
- // Ignore cross origin links
- if ( location.protocol !== link.protocol || location.hostname !== link.hostname )
- return
-
- // Ignore case when a hash is being tacked on the current URL
- if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) )
- return
-
- // Ignore event with default prevented
- if (event.isDefaultPrevented())
- return
-
- var defaults = {
- url: link.href,
- container: $(link).attr('data-pjax'),
- target: link
- }
-
- var opts = $.extend({}, defaults, options)
- var clickEvent = $.Event('pjax:click')
- $(link).trigger(clickEvent, [opts])
-
- if (!clickEvent.isDefaultPrevented()) {
- pjax(opts)
- event.preventDefault()
- $(link).trigger('pjax:clicked', [opts])
- }
-}
-
-// Public: pjax on form submit handler
-//
-// Exported as $.pjax.submit
-//
-// event - "click" jQuery.Event
-// options - pjax options
-//
-// Examples
-//
-// $(document).on('submit', 'form', function(event) {
-// var container = $(this).closest('[data-pjax-container]')
-// $.pjax.submit(event, container)
-// })
-//
-// Returns nothing.
-function handleSubmit(event, container, options) {
- options = optionsFor(container, options)
-
- var form = event.currentTarget
-
- if (form.tagName.toUpperCase() !== 'FORM')
- throw "$.pjax.submit requires a form element"
-
- var defaults = {
- type: form.method.toUpperCase(),
- url: form.action,
- container: $(form).attr('data-pjax'),
- target: form
- }
-
- if (defaults.type !== 'GET' && window.FormData !== undefined) {
- defaults.data = new FormData(form);
- defaults.processData = false;
- defaults.contentType = false;
- } else {
- // Can't handle file uploads, exit
- if ($(form).find(':file').length) {
- return;
- }
-
- // Fallback to manually serializing the fields
- defaults.data = $(form).serializeArray();
- }
-
- pjax($.extend({}, defaults, options))
-
- event.preventDefault()
-}
-
-// Loads a URL with ajax, puts the response body inside a container,
-// then pushState()'s the loaded URL.
-//
-// Works just like $.ajax in that it accepts a jQuery ajax
-// settings object (with keys like url, type, data, etc).
-//
-// Accepts these extra keys:
-//
-// container - Where to stick the response body.
-// $(container).html(xhr.responseBody)
-// push - Whether to pushState the URL. Defaults to true (of course).
-// replace - Want to use replaceState instead? That's cool.
-//
-// Use it just like $.ajax:
-//
-// var xhr = $.pjax({ url: this.href, container: '#main' })
-// console.log( xhr.readyState )
-//
-// Returns whatever $.ajax returns.
-function pjax(options) {
- options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options)
-
- if ($.isFunction(options.url)) {
- options.url = options.url()
- }
-
- var target = options.target
-
- var hash = parseURL(options.url).hash
-
- var context = options.context = findContainerFor(options.container)
-
- // We want the browser to maintain two separate internal caches: one
- // for pjax'd partial page loads and one for normal page loads.
- // Without adding this secret parameter, some browsers will often
- // confuse the two.
- if (!options.data) options.data = {}
- if ($.isArray(options.data)) {
- options.data.push({name: '_pjax', value: context.selector})
- } else {
- options.data._pjax = context.selector
- }
-
- function fire(type, args, props) {
- if (!props) props = {}
- props.relatedTarget = target
- var event = $.Event(type, props)
- context.trigger(event, args)
- return !event.isDefaultPrevented()
- }
-
- var timeoutTimer
-
- options.beforeSend = function(xhr, settings) {
- // No timeout for non-GET requests
- // Its not safe to request the resource again with a fallback method.
- if (settings.type !== 'GET') {
- settings.timeout = 0
- }
-
- xhr.setRequestHeader('X-PJAX', 'true')
- xhr.setRequestHeader('X-PJAX-Container', context.selector)
-
- if (!fire('pjax:beforeSend', [xhr, settings]))
- return false
-
- if (settings.timeout > 0) {
- timeoutTimer = setTimeout(function() {
- if (fire('pjax:timeout', [xhr, options]))
- xhr.abort('timeout')
- }, settings.timeout)
-
- // Clear timeout setting so jquerys internal timeout isn't invoked
- settings.timeout = 0
- }
-
- options.requestUrl = parseURL(settings.url).href
- }
-
- options.complete = function(xhr, textStatus) {
- if (timeoutTimer)
- clearTimeout(timeoutTimer)
-
- fire('pjax:complete', [xhr, textStatus, options])
-
- fire('pjax:end', [xhr, options])
- }
-
- options.error = function(xhr, textStatus, errorThrown) {
- var container = extractContainer("", xhr, options)
-
- var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options])
- if (options.type == 'GET' && textStatus !== 'abort' && allowed) {
- locationReplace(container.url)
- }
- }
-
- options.success = function(data, status, xhr) {
- var previousState = pjax.state;
-
- // If $.pjax.defaults.version is a function, invoke it first.
- // Otherwise it can be a static string.
- var currentVersion = (typeof $.pjax.defaults.version === 'function') ?
- $.pjax.defaults.version() :
- $.pjax.defaults.version
-
- var latestVersion = xhr.getResponseHeader('X-PJAX-Version')
-
- var container = extractContainer(data, xhr, options)
-
- // If there is a layout version mismatch, hard load the new url
- if (currentVersion && latestVersion && currentVersion !== latestVersion) {
- locationReplace(container.url)
- return
- }
-
- // If the new response is missing a body, hard load the page
- if (!container.contents) {
- locationReplace(container.url)
- return
- }
-
- pjax.state = {
- id: options.id || uniqueId(),
- url: container.url,
- title: container.title,
- container: context.selector,
- fragment: options.fragment,
- timeout: options.timeout
- }
-
- if (options.push || options.replace) {
- window.history.replaceState(pjax.state, container.title, container.url)
- }
-
- // Clear out any focused controls before inserting new page contents.
- try {
- document.activeElement.blur()
- } catch (e) { }
-
- if (container.title) document.title = container.title
-
- fire('pjax:beforeReplace', [container.contents, options], {
- state: pjax.state,
- previousState: previousState
- })
- context.html(container.contents)
-
- // FF bug: Won't autofocus fields that are inserted via JS.
- // This behavior is incorrect. So if theres no current focus, autofocus
- // the last field.
- //
- // http://www.w3.org/html/wg/drafts/html/master/forms.html
- var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0]
- if (autofocusEl && document.activeElement !== autofocusEl) {
- autofocusEl.focus();
- }
-
- executeScriptTags(container.scripts)
-
- // Scroll to top by default
- if (typeof options.scrollTo === 'number')
- $(window).scrollTop(options.scrollTo)
-
- // If the URL has a hash in it, make sure the browser
- // knows to navigate to the hash.
- if ( hash !== '' ) {
- // Avoid using simple hash set here. Will add another history
- // entry. Replace the url with replaceState and scroll to target
- // by hand.
- //
- // window.location.hash = hash
- var url = parseURL(container.url)
- url.hash = hash
-
- pjax.state.url = url.href
- window.history.replaceState(pjax.state, container.title, url.href)
-
- var target = document.getElementById(url.hash.slice(1))
- if (target) $(window).scrollTop($(target).offset().top)
- }
-
- fire('pjax:success', [data, status, xhr, options])
- }
-
-
- // Initialize pjax.state for the initial page load. Assume we're
- // using the container and options of the link we're loading for the
- // back button to the initial page. This ensures good back button
- // behavior.
- if (!pjax.state) {
- pjax.state = {
- id: uniqueId(),
- url: window.location.href,
- title: document.title,
- container: context.selector,
- fragment: options.fragment,
- timeout: options.timeout
- }
- window.history.replaceState(pjax.state, document.title)
- }
-
- // Cancel the current request if we're already pjaxing
- var xhr = pjax.xhr
- if ( xhr && xhr.readyState < 4) {
- xhr.onreadystatechange = $.noop
- xhr.abort()
- }
-
- pjax.options = options
- var xhr = pjax.xhr = $.ajax(options)
-
- if (xhr.readyState > 0) {
- if (options.push && !options.replace) {
- // Cache current container element before replacing it
- cachePush(pjax.state.id, context.clone().contents())
-
- window.history.pushState(null, "", stripPjaxParam(options.requestUrl))
- }
-
- fire('pjax:start', [xhr, options])
- fire('pjax:send', [xhr, options])
- }
-
- return pjax.xhr
-}
-
-// Public: Reload current page with pjax.
-//
-// Returns whatever $.pjax returns.
-function pjaxReload(container, options) {
- var defaults = {
- url: window.location.href,
- push: false,
- replace: true,
- scrollTo: false
- }
-
- return pjax($.extend(defaults, optionsFor(container, options)))
-}
-
-// Internal: Hard replace current state with url.
-//
-// Work for around WebKit
-// https://bugs.webkit.org/show_bug.cgi?id=93506
-//
-// Returns nothing.
-function locationReplace(url) {
- window.history.replaceState(null, "", pjax.state.url)
- window.location.replace(url)
-}
-
-
-var initialPop = true
-var initialURL = window.location.href
-var initialState = window.history.state
-
-// Initialize $.pjax.state if possible
-// Happens when reloading a page and coming forward from a different
-// session history.
-if (initialState && initialState.container) {
- pjax.state = initialState
-}
-
-// Non-webkit browsers don't fire an initial popstate event
-if ('state' in window.history) {
- initialPop = false
-}
-
-// popstate handler takes care of the back and forward buttons
-//
-// You probably shouldn't use pjax on pages with other pushState
-// stuff yet.
-function onPjaxPopstate(event) {
- var previousState = pjax.state;
- var state = event.state
-
- if (state && state.container) {
- // When coming forward from a separate history session, will get an
- // initial pop with a state we are already at. Skip reloading the current
- // page.
- if (initialPop && initialURL == state.url) return
-
- // If popping back to the same state, just skip.
- // Could be clicking back from hashchange rather than a pushState.
- if (pjax.state && pjax.state.id === state.id) return
-
- var container = $(state.container)
- if (container.length) {
- var direction, contents = cacheMapping[state.id]
-
- if (pjax.state) {
- // Since state ids always increase, we can deduce the history
- // direction from the previous state.
- direction = pjax.state.id < state.id ? 'forward' : 'back'
-
- // Cache current container before replacement and inform the
- // cache which direction the history shifted.
- cachePop(direction, pjax.state.id, container.clone().contents())
- }
-
- var popstateEvent = $.Event('pjax:popstate', {
- state: state,
- direction: direction
- })
- container.trigger(popstateEvent)
-
- var options = {
- id: state.id,
- url: state.url,
- container: container,
- push: false,
- fragment: state.fragment,
- timeout: state.timeout,
- scrollTo: false
- }
-
- if (contents) {
- container.trigger('pjax:start', [null, options])
-
- pjax.state = state
- if (state.title) document.title = state.title
- var beforeReplaceEvent = $.Event('pjax:beforeReplace', {
- state: state,
- previousState: previousState
- })
- container.trigger(beforeReplaceEvent, [contents, options])
- container.html(contents)
-
- container.trigger('pjax:end', [null, options])
- } else {
- pjax(options)
- }
-
- // Force reflow/relayout before the browser tries to restore the
- // scroll position.
- container[0].offsetHeight
- } else {
- locationReplace(location.href)
- }
- }
- initialPop = false
-}
-
-// Fallback version of main pjax function for browsers that don't
-// support pushState.
-//
-// Returns nothing since it retriggers a hard form submission.
-function fallbackPjax(options) {
- var url = $.isFunction(options.url) ? options.url() : options.url,
- method = options.type ? options.type.toUpperCase() : 'GET'
-
- var form = $('