wpa_cli_web 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. data/.bowerrc +3 -0
  2. data/lib/wpa_cli_web.rb +19 -31
  3. data/lib/wpa_cli_web/public/bower_components/house-style/.bower.json +14 -0
  4. data/lib/wpa_cli_web/public/bower_components/house-style/.bowerrc +3 -0
  5. data/lib/wpa_cli_web/public/bower_components/house-style/.gitignore +2 -0
  6. data/lib/wpa_cli_web/public/bower_components/house-style/Gemfile +6 -0
  7. data/lib/wpa_cli_web/public/bower_components/house-style/Gruntfile.js +99 -0
  8. data/lib/wpa_cli_web/public/bower_components/house-style/Guardfile +19 -0
  9. data/lib/wpa_cli_web/public/bower_components/house-style/bower.json +7 -0
  10. data/lib/wpa_cli_web/public/bower_components/house-style/bower_components/normalize-css/LICENSE.md +19 -0
  11. data/lib/wpa_cli_web/public/bower_components/house-style/bower_components/normalize-css/README.md +49 -0
  12. data/lib/wpa_cli_web/public/bower_components/house-style/bower_components/normalize-css/bower.json +23 -0
  13. data/lib/wpa_cli_web/public/bower_components/house-style/bower_components/normalize-css/normalize.css +396 -0
  14. data/lib/wpa_cli_web/public/bower_components/house-style/house-style.css +860 -0
  15. data/lib/wpa_cli_web/public/bower_components/house-style/house-style.min.css +1 -0
  16. data/lib/wpa_cli_web/public/bower_components/house-style/modules/base/base.css +37 -0
  17. data/lib/wpa_cli_web/public/bower_components/house-style/modules/button/button.css +26 -0
  18. data/lib/wpa_cli_web/public/bower_components/house-style/modules/grid/grid.css +151 -0
  19. data/lib/wpa_cli_web/public/bower_components/house-style/modules/grid/grid.png +0 -0
  20. data/lib/wpa_cli_web/public/bower_components/house-style/modules/grid/images.html +208 -0
  21. data/lib/wpa_cli_web/public/bower_components/house-style/modules/grid/index.html +141 -0
  22. data/lib/wpa_cli_web/public/bower_components/house-style/modules/loading/index.html +22 -0
  23. data/lib/wpa_cli_web/public/bower_components/house-style/modules/loading/loading.css +41 -0
  24. data/lib/wpa_cli_web/public/bower_components/house-style/modules/loading/spinner.svg +11 -0
  25. data/lib/wpa_cli_web/public/bower_components/house-style/modules/masthead/bbc-blocks-white.png +0 -0
  26. data/lib/wpa_cli_web/public/bower_components/house-style/modules/masthead/index.html +20 -0
  27. data/lib/wpa_cli_web/public/bower_components/house-style/modules/masthead/masthead.css +23 -0
  28. data/lib/wpa_cli_web/public/bower_components/house-style/modules/panel/panel.css +71 -0
  29. data/lib/wpa_cli_web/public/bower_components/house-style/modules/project-header/index.html +22 -0
  30. data/lib/wpa_cli_web/public/bower_components/house-style/modules/project-header/project-header.css +37 -0
  31. data/lib/wpa_cli_web/public/bower_components/house-style/modules/table/index.html +26 -0
  32. data/lib/wpa_cli_web/public/bower_components/house-style/modules/table/table.css +6 -0
  33. data/lib/wpa_cli_web/public/bower_components/house-style/modules/transitions/transitions.css +11 -0
  34. data/lib/wpa_cli_web/public/bower_components/house-style/package.json +21 -0
  35. data/lib/wpa_cli_web/public/bower_components/house-style/vendor/prefixfree.min.js +5 -0
  36. data/lib/wpa_cli_web/public/bower_components/normalize-css/.bower.json +21 -0
  37. data/lib/wpa_cli_web/public/bower_components/normalize-css/LICENSE.md +19 -0
  38. data/lib/wpa_cli_web/public/bower_components/normalize-css/README.md +49 -0
  39. data/lib/wpa_cli_web/public/bower_components/normalize-css/bower.json +12 -0
  40. data/lib/wpa_cli_web/public/bower_components/normalize-css/normalize.css +396 -0
  41. data/lib/wpa_cli_web/public/bower_components/qwery/.bower.json +14 -0
  42. data/lib/wpa_cli_web/public/bower_components/qwery/.gitignore +3 -0
  43. data/lib/wpa_cli_web/public/bower_components/qwery/.travis.yml +10 -0
  44. data/lib/wpa_cli_web/public/bower_components/qwery/LICENSE +7 -0
  45. data/lib/wpa_cli_web/public/bower_components/qwery/Makefile +6 -0
  46. data/lib/wpa_cli_web/public/bower_components/qwery/README.md +167 -0
  47. data/lib/wpa_cli_web/public/bower_components/qwery/config/smoosh.json +35 -0
  48. data/lib/wpa_cli_web/public/bower_components/qwery/integration/ender.js +1033 -0
  49. data/lib/wpa_cli_web/public/bower_components/qwery/integration/integration.html +26 -0
  50. data/lib/wpa_cli_web/public/bower_components/qwery/mobile/ender.js +62 -0
  51. data/lib/wpa_cli_web/public/bower_components/qwery/mobile/package.json +14 -0
  52. data/lib/wpa_cli_web/public/bower_components/qwery/mobile/qwery-mobile.js +79 -0
  53. data/lib/wpa_cli_web/public/bower_components/qwery/mobile/qwery-mobile.min.js +7 -0
  54. data/lib/wpa_cli_web/public/bower_components/qwery/mobile/src/mobile.js +72 -0
  55. data/lib/wpa_cli_web/public/bower_components/qwery/package.json +25 -0
  56. data/lib/wpa_cli_web/public/bower_components/qwery/pseudos/package.json +17 -0
  57. data/lib/wpa_cli_web/public/bower_components/qwery/pseudos/qwery-pseudos.js +106 -0
  58. data/lib/wpa_cli_web/public/bower_components/qwery/pseudos/qwery-pseudos.min.js +7 -0
  59. data/lib/wpa_cli_web/public/bower_components/qwery/pseudos/src/pseudos.js +99 -0
  60. data/lib/wpa_cli_web/public/bower_components/qwery/qwery.js +369 -0
  61. data/lib/wpa_cli_web/public/bower_components/qwery/qwery.min.js +7 -0
  62. data/lib/wpa_cli_web/public/bower_components/qwery/src/copyright.js +6 -0
  63. data/lib/wpa_cli_web/public/bower_components/qwery/src/ender.js +62 -0
  64. data/lib/wpa_cli_web/public/bower_components/qwery/src/qwery.js +362 -0
  65. data/lib/wpa_cli_web/public/bower_components/qwery/tests/W3C-Selector-tests.html +1372 -0
  66. data/lib/wpa_cli_web/public/bower_components/qwery/tests/benchmarks.html +220 -0
  67. data/lib/wpa_cli_web/public/bower_components/qwery/tests/index.html +132 -0
  68. data/lib/wpa_cli_web/public/bower_components/qwery/tests/mobile.html +58 -0
  69. data/lib/wpa_cli_web/public/bower_components/qwery/tests/phantom.js +43 -0
  70. data/lib/wpa_cli_web/public/bower_components/qwery/tests/test-env.js +25 -0
  71. data/lib/wpa_cli_web/public/bower_components/qwery/tests/tests.js +533 -0
  72. data/lib/wpa_cli_web/public/bower_components/qwery/vendor/nw.js +1680 -0
  73. data/lib/wpa_cli_web/public/bower_components/qwery/vendor/sink.css +79 -0
  74. data/lib/wpa_cli_web/public/bower_components/qwery/vendor/sink.js +181 -0
  75. data/lib/wpa_cli_web/public/bower_components/qwery/vendor/sizzle.js +1400 -0
  76. data/lib/wpa_cli_web/public/bower_components/reqwest/.bower.json +14 -0
  77. data/lib/wpa_cli_web/public/bower_components/reqwest/.gitignore +1 -0
  78. data/lib/wpa_cli_web/public/bower_components/reqwest/.jshintrc +61 -0
  79. data/lib/wpa_cli_web/public/bower_components/reqwest/Makefile +8 -0
  80. data/lib/wpa_cli_web/public/bower_components/reqwest/README.md +308 -0
  81. data/lib/wpa_cli_web/public/bower_components/reqwest/build.json +74 -0
  82. data/lib/wpa_cli_web/public/bower_components/reqwest/make/tests.js +89 -0
  83. data/lib/wpa_cli_web/public/bower_components/reqwest/package.json +27 -0
  84. data/lib/wpa_cli_web/public/bower_components/reqwest/reqwest.js +565 -0
  85. data/lib/wpa_cli_web/public/bower_components/reqwest/reqwest.min.js +7 -0
  86. data/lib/wpa_cli_web/public/bower_components/reqwest/src/copyright.js +6 -0
  87. data/lib/wpa_cli_web/public/bower_components/reqwest/src/ender.js +26 -0
  88. data/lib/wpa_cli_web/public/bower_components/reqwest/src/reqwest.js +559 -0
  89. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/ender.js +117 -0
  90. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/badfixtures.xml +1 -0
  91. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures.html +1 -0
  92. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures.js +1 -0
  93. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures.json +1 -0
  94. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures.xml +1 -0
  95. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp.jsonp +1 -0
  96. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp2.jsonp +1 -0
  97. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp3.jsonp +1 -0
  98. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp_multi.jsonp +1 -0
  99. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp_multi_b.jsonp +1 -0
  100. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_jsonp_multi_c.jsonp +1 -0
  101. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/fixtures_with_prefix.json +1 -0
  102. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/fixtures/invalidJSON.json +5 -0
  103. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/tests.html +105 -0
  104. data/lib/wpa_cli_web/public/bower_components/reqwest/tests/tests.js +1723 -0
  105. data/lib/wpa_cli_web/views/access_points.erb +5 -0
  106. data/lib/wpa_cli_web/views/access_points_list.erb +19 -0
  107. data/lib/wpa_cli_web/views/layout.erb +141 -0
  108. data/lib/wpa_cli_web/views/networks_edit.erb +15 -0
  109. data/lib/wpa_cli_web/views/restart.erb +7 -0
  110. data/lib/wpa_cli_web/views/restarting.erb +14 -0
  111. data/wpa_cli_web.gemspec +1 -1
  112. metadata +111 -2
@@ -0,0 +1,89 @@
1
+ var exec = require('child_process').exec
2
+ , fs = require('fs')
3
+ , Connect = require('connect')
4
+ , dispatch = require('dispatch')
5
+ , mime = require('mime')
6
+ , DelayedStream = require('delayed-stream')
7
+
8
+ , getMime = function(ext) {
9
+ return mime.lookup(ext == 'jsonp' ? 'js' : ext)
10
+ }
11
+
12
+ var routes = {
13
+ '/': function (req, res) {
14
+ res.write(fs.readFileSync('./tests/tests.html', 'utf8'))
15
+ res.end()
16
+ },
17
+ '/tests/timeout$': function (req, res) {
18
+ var delayed = DelayedStream.create(req)
19
+ setTimeout(function() {
20
+ res.writeHead(200, {
21
+ 'Expires': 0
22
+ , 'Cache-Control': 'max-age=0, no-cache, no-store'
23
+ })
24
+ req.query.callback && res.write(req.query.callback + '(')
25
+ res.write(JSON.stringify({ method: req.method, query: req.query, headers: req.headers }))
26
+ req.query.callback && res.write(');')
27
+ delayed.pipe(res)
28
+ }, 2000)
29
+ },
30
+ '(([\\w\\-\\/\\.]+)\\.(css|js|json|jsonp|html|xml)$)': function (req, res, next, uri, file, ext) {
31
+ res.writeHead(200, {
32
+ 'Expires': 0
33
+ , 'Cache-Control': 'max-age=0, no-cache, no-store'
34
+ , 'Content-Type': getMime(ext)
35
+ })
36
+ if (req.query.echo !== undefined) {
37
+ ext == 'jsonp' && res.write((req.query.callback || req.query.testCallback || 'echoCallback') + '(')
38
+ res.write(JSON.stringify({ method: req.method, query: req.query, headers: req.headers }))
39
+ ext == 'jsonp' && res.write(');')
40
+ } else {
41
+ res.write(fs.readFileSync('./' + file + '.' + ext))
42
+ }
43
+ res.end()
44
+ }
45
+ }
46
+
47
+ Connect.createServer(Connect.query(), dispatch(routes)).listen(1234)
48
+
49
+ var otherOriginRoutes = {
50
+ '/get-value': function (req, res) {
51
+ res.writeHead(200, {
52
+ 'Access-Control-Allow-Origin': req.headers.origin,
53
+ 'Content-Type': 'text/plain'
54
+ })
55
+ res.end('hello')
56
+ },
57
+ '/set-cookie': function (req, res) {
58
+ res.writeHead(200, {
59
+ 'Access-Control-Allow-Origin': req.headers.origin,
60
+ 'Access-Control-Allow-Credentials': 'true',
61
+ 'Content-Type': 'text/plain',
62
+ 'Set-Cookie': 'cookie=hello'
63
+ })
64
+ res.end('Set a cookie!')
65
+ },
66
+ '/get-cookie-value': function (req, res) {
67
+ var cookies = {}
68
+ , value
69
+
70
+ req.headers.cookie && req.headers.cookie.split(';').forEach(function( cookie ) {
71
+ var parts = cookie.split('=')
72
+ cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim()
73
+ })
74
+ value = cookies.cookie
75
+
76
+ res.writeHead(200, {
77
+ 'Access-Control-Allow-Origin': req.headers.origin,
78
+ 'Access-Control-Allow-Credentials': 'true',
79
+ 'Content-Type': 'text/plain'
80
+ })
81
+ res.end(value)
82
+ }
83
+ }
84
+
85
+ Connect.createServer(Connect.query(), dispatch(otherOriginRoutes)).listen(5678)
86
+
87
+ exec('open http://localhost:1234', function () {
88
+ console.log('opening tests at http://localhost:1234')
89
+ })
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "reqwest"
3
+ , "description": "A wrapper for asynchronous http requests"
4
+ , "keywords": ["ender", "ajax", "xhr", "connection", "web 2.0", "async", "sync"]
5
+ , "version": "0.8.3"
6
+ , "homepage": "https://github.com/ded/reqwest"
7
+ , "author": "Dustin Diaz <dustin@dustindiaz.com> (http://dustindiaz.com)"
8
+ , "repository": {
9
+ "type": "git"
10
+ , "url": "https://github.com/ded/reqwest.git"
11
+ }
12
+ , "main": "./reqwest.js"
13
+ , "ender": "./src/ender.js"
14
+ , "devDependencies": {
15
+ "connect": "1.8.x"
16
+ , "mime": "1.x.x"
17
+ , "sink-test": ">=0.1.2"
18
+ , "dispatch": "0.x.x"
19
+ , "valentine": ">=1.4.7"
20
+ , "smoosh": "0.4.0"
21
+ , "delayed-stream" : "0.0.5"
22
+ }
23
+ , "scripts": {
24
+ "boosh": "smoosh make ./build.json"
25
+ , "test": "node make/tests.js"
26
+ }
27
+ }
@@ -0,0 +1,565 @@
1
+ /*!
2
+ * Reqwest! A general purpose XHR connection manager
3
+ * (c) Dustin Diaz 2013
4
+ * https://github.com/ded/reqwest
5
+ * license MIT
6
+ */
7
+ !function (name, context, definition) {
8
+ if (typeof module != 'undefined' && module.exports) module.exports = definition()
9
+ else if (typeof define == 'function' && define.amd) define(definition)
10
+ else context[name] = definition()
11
+ }('reqwest', this, function () {
12
+
13
+ var win = window
14
+ , doc = document
15
+ , twoHundo = /^20\d$/
16
+ , byTag = 'getElementsByTagName'
17
+ , readyState = 'readyState'
18
+ , contentType = 'Content-Type'
19
+ , requestedWith = 'X-Requested-With'
20
+ , head = doc[byTag]('head')[0]
21
+ , uniqid = 0
22
+ , callbackPrefix = 'reqwest_' + (+new Date())
23
+ , lastValue // data stored by the most recent JSONP callback
24
+ , xmlHttpRequest = 'XMLHttpRequest'
25
+ , noop = function () {}
26
+
27
+ , isArray = typeof Array.isArray == 'function'
28
+ ? Array.isArray
29
+ : function (a) {
30
+ return a instanceof Array
31
+ }
32
+
33
+ , defaultHeaders = {
34
+ contentType: 'application/x-www-form-urlencoded'
35
+ , requestedWith: xmlHttpRequest
36
+ , accept: {
37
+ '*': 'text/javascript, text/html, application/xml, text/xml, */*'
38
+ , xml: 'application/xml, text/xml'
39
+ , html: 'text/html'
40
+ , text: 'text/plain'
41
+ , json: 'application/json, text/javascript'
42
+ , js: 'application/javascript, text/javascript'
43
+ }
44
+ }
45
+
46
+ , xhr = win[xmlHttpRequest]
47
+ ? function () {
48
+ return new XMLHttpRequest()
49
+ }
50
+ : function () {
51
+ return new ActiveXObject('Microsoft.XMLHTTP')
52
+ }
53
+ , globalSetupOptions = {
54
+ dataFilter: function (data) {
55
+ return data
56
+ }
57
+ }
58
+
59
+ function handleReadyState(r, success, error) {
60
+ return function () {
61
+ // use _aborted to mitigate against IE err c00c023f
62
+ // (can't read props on aborted request objects)
63
+ if (r._aborted) return error(r.request)
64
+ if (r.request && r.request[readyState] == 4) {
65
+ r.request.onreadystatechange = noop
66
+ if (twoHundo.test(r.request.status))
67
+ success(r.request)
68
+ else
69
+ error(r.request)
70
+ }
71
+ }
72
+ }
73
+
74
+ function setHeaders(http, o) {
75
+ var headers = o.headers || {}
76
+ , h
77
+
78
+ headers.Accept = headers.Accept
79
+ || defaultHeaders.accept[o.type]
80
+ || defaultHeaders.accept['*']
81
+
82
+ // breaks cross-origin requests with legacy browsers
83
+ if (!o.crossOrigin && !headers[requestedWith]) headers[requestedWith] = defaultHeaders.requestedWith
84
+ if (!headers[contentType]) headers[contentType] = o.contentType || defaultHeaders.contentType
85
+ for (h in headers)
86
+ headers.hasOwnProperty(h) && http.setRequestHeader(h, headers[h])
87
+ }
88
+
89
+ function setCredentials(http, o) {
90
+ if (typeof o.withCredentials !== 'undefined' && typeof http.withCredentials !== 'undefined') {
91
+ http.withCredentials = !!o.withCredentials
92
+ }
93
+ }
94
+
95
+ function generalCallback(data) {
96
+ lastValue = data
97
+ }
98
+
99
+ function urlappend (url, s) {
100
+ return url + (/\?/.test(url) ? '&' : '?') + s
101
+ }
102
+
103
+ function handleJsonp(o, fn, err, url) {
104
+ var reqId = uniqid++
105
+ , cbkey = o.jsonpCallback || 'callback' // the 'callback' key
106
+ , cbval = o.jsonpCallbackName || reqwest.getcallbackPrefix(reqId)
107
+ // , cbval = o.jsonpCallbackName || ('reqwest_' + reqId) // the 'callback' value
108
+ , cbreg = new RegExp('((^|\\?|&)' + cbkey + ')=([^&]+)')
109
+ , match = url.match(cbreg)
110
+ , script = doc.createElement('script')
111
+ , loaded = 0
112
+ , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1
113
+
114
+ if (match) {
115
+ if (match[3] === '?') {
116
+ url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name
117
+ } else {
118
+ cbval = match[3] // provided callback func name
119
+ }
120
+ } else {
121
+ url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em
122
+ }
123
+
124
+ win[cbval] = generalCallback
125
+
126
+ script.type = 'text/javascript'
127
+ script.src = url
128
+ script.async = true
129
+ if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {
130
+ // need this for IE due to out-of-order onreadystatechange(), binding script
131
+ // execution to an event listener gives us control over when the script
132
+ // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html
133
+ //
134
+ // if this hack is used in IE10 jsonp callback are never called
135
+ script.event = 'onclick'
136
+ script.htmlFor = script.id = '_reqwest_' + reqId
137
+ }
138
+
139
+ script.onload = script.onreadystatechange = function () {
140
+ if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {
141
+ return false
142
+ }
143
+ script.onload = script.onreadystatechange = null
144
+ script.onclick && script.onclick()
145
+ // Call the user callback with the last value stored and clean up values and scripts.
146
+ fn(lastValue)
147
+ lastValue = undefined
148
+ head.removeChild(script)
149
+ loaded = 1
150
+ }
151
+
152
+ // Add the script to the DOM head
153
+ head.appendChild(script)
154
+
155
+ // Enable JSONP timeout
156
+ return {
157
+ abort: function () {
158
+ script.onload = script.onreadystatechange = null
159
+ err({}, 'Request is aborted: timeout', {})
160
+ lastValue = undefined
161
+ head.removeChild(script)
162
+ loaded = 1
163
+ }
164
+ }
165
+ }
166
+
167
+ function getRequest(fn, err) {
168
+ var o = this.o
169
+ , method = (o.method || 'GET').toUpperCase()
170
+ , url = typeof o === 'string' ? o : o.url
171
+ // convert non-string objects to query-string form unless o.processData is false
172
+ , data = (o.processData !== false && o.data && typeof o.data !== 'string')
173
+ ? reqwest.toQueryString(o.data)
174
+ : (o.data || null)
175
+ , http
176
+
177
+ // if we're working on a GET request and we have data then we should append
178
+ // query string to end of URL and not post data
179
+ if ((o.type == 'jsonp' || method == 'GET') && data) {
180
+ url = urlappend(url, data)
181
+ data = null
182
+ }
183
+
184
+ if (o.type == 'jsonp') return handleJsonp(o, fn, err, url)
185
+
186
+ http = xhr()
187
+ http.open(method, url, o.async === false ? false : true)
188
+ setHeaders(http, o)
189
+ setCredentials(http, o)
190
+ http.onreadystatechange = handleReadyState(this, fn, err)
191
+ o.before && o.before(http)
192
+ http.send(data)
193
+ return http
194
+ }
195
+
196
+ function Reqwest(o, fn) {
197
+ this.o = o
198
+ this.fn = fn
199
+
200
+ init.apply(this, arguments)
201
+ }
202
+
203
+ function setType(url) {
204
+ var m = url.match(/\.(json|jsonp|html|xml)(\?|$)/)
205
+ return m ? m[1] : 'js'
206
+ }
207
+
208
+ function init(o, fn) {
209
+
210
+ this.url = typeof o == 'string' ? o : o.url
211
+ this.timeout = null
212
+
213
+ // whether request has been fulfilled for purpose
214
+ // of tracking the Promises
215
+ this._fulfilled = false
216
+ // success handlers
217
+ this._fulfillmentHandlers = []
218
+ // error handlers
219
+ this._errorHandlers = []
220
+ // complete (both success and fail) handlers
221
+ this._completeHandlers = []
222
+ this._erred = false
223
+ this._responseArgs = {}
224
+
225
+ var self = this
226
+ , type = o.type || setType(this.url)
227
+
228
+ fn = fn || function () {}
229
+
230
+ if (o.timeout) {
231
+ this.timeout = setTimeout(function () {
232
+ self.abort()
233
+ }, o.timeout)
234
+ }
235
+
236
+ if (o.success) {
237
+ this._fulfillmentHandlers.push(function () {
238
+ o.success.apply(o, arguments)
239
+ })
240
+ }
241
+
242
+ if (o.error) {
243
+ this._errorHandlers.push(function () {
244
+ o.error.apply(o, arguments)
245
+ })
246
+ }
247
+
248
+ if (o.complete) {
249
+ this._completeHandlers.push(function () {
250
+ o.complete.apply(o, arguments)
251
+ })
252
+ }
253
+
254
+ function complete (resp) {
255
+ o.timeout && clearTimeout(self.timeout)
256
+ self.timeout = null
257
+ while (self._completeHandlers.length > 0) {
258
+ self._completeHandlers.shift()(resp)
259
+ }
260
+ }
261
+
262
+ function success (resp) {
263
+ // use global data filter on response text
264
+ var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)
265
+ , r = filteredResponse
266
+ try {
267
+ resp.responseText = r
268
+ } catch (e) {
269
+ // can't assign this in IE<=8, just ignore
270
+ }
271
+ if (r) {
272
+ switch (type) {
273
+ case 'json':
274
+ try {
275
+ resp = win.JSON ? win.JSON.parse(r) : eval('(' + r + ')')
276
+ } catch (err) {
277
+ return error(resp, 'Could not parse JSON in response', err)
278
+ }
279
+ break
280
+ case 'js':
281
+ resp = eval(r)
282
+ break
283
+ case 'html':
284
+ resp = r
285
+ break
286
+ case 'xml':
287
+ resp = resp.responseXML
288
+ && resp.responseXML.parseError // IE trololo
289
+ && resp.responseXML.parseError.errorCode
290
+ && resp.responseXML.parseError.reason
291
+ ? null
292
+ : resp.responseXML
293
+ break
294
+ }
295
+ }
296
+
297
+ self._responseArgs.resp = resp
298
+ self._fulfilled = true
299
+ fn(resp)
300
+ while (self._fulfillmentHandlers.length > 0) {
301
+ self._fulfillmentHandlers.shift()(resp)
302
+ }
303
+
304
+ complete(resp)
305
+ }
306
+
307
+ function error(resp, msg, t) {
308
+ self._responseArgs.resp = resp
309
+ self._responseArgs.msg = msg
310
+ self._responseArgs.t = t
311
+ self._erred = true
312
+ while (self._errorHandlers.length > 0) {
313
+ self._errorHandlers.shift()(resp, msg, t)
314
+ }
315
+ complete(resp)
316
+ }
317
+
318
+ this.request = getRequest.call(this, success, error)
319
+ }
320
+
321
+ Reqwest.prototype = {
322
+ abort: function () {
323
+ this._aborted = true
324
+ this.request.abort()
325
+ }
326
+
327
+ , retry: function () {
328
+ init.call(this, this.o, this.fn)
329
+ }
330
+
331
+ /**
332
+ * Small deviation from the Promises A CommonJs specification
333
+ * http://wiki.commonjs.org/wiki/Promises/A
334
+ */
335
+
336
+ /**
337
+ * `then` will execute upon successful requests
338
+ */
339
+ , then: function (success, fail) {
340
+ success = success || function () {}
341
+ fail = fail || function () {}
342
+ if (this._fulfilled) {
343
+ success(this._responseArgs.resp)
344
+ } else if (this._erred) {
345
+ fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)
346
+ } else {
347
+ this._fulfillmentHandlers.push(success)
348
+ this._errorHandlers.push(fail)
349
+ }
350
+ return this
351
+ }
352
+
353
+ /**
354
+ * `always` will execute whether the request succeeds or fails
355
+ */
356
+ , always: function (fn) {
357
+ if (this._fulfilled || this._erred) {
358
+ fn(this._responseArgs.resp)
359
+ } else {
360
+ this._completeHandlers.push(fn)
361
+ }
362
+ return this
363
+ }
364
+
365
+ /**
366
+ * `fail` will execute when the request fails
367
+ */
368
+ , fail: function (fn) {
369
+ if (this._erred) {
370
+ fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)
371
+ } else {
372
+ this._errorHandlers.push(fn)
373
+ }
374
+ return this
375
+ }
376
+ }
377
+
378
+ function reqwest(o, fn) {
379
+ return new Reqwest(o, fn)
380
+ }
381
+
382
+ // normalize newline variants according to spec -> CRLF
383
+ function normalize(s) {
384
+ return s ? s.replace(/\r?\n/g, '\r\n') : ''
385
+ }
386
+
387
+ function serial(el, cb) {
388
+ var n = el.name
389
+ , t = el.tagName.toLowerCase()
390
+ , optCb = function (o) {
391
+ // IE gives value="" even where there is no value attribute
392
+ // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273
393
+ if (o && !o.disabled)
394
+ cb(n, normalize(o.attributes.value && o.attributes.value.specified ? o.value : o.text))
395
+ }
396
+ , ch, ra, val, i
397
+
398
+ // don't serialize elements that are disabled or without a name
399
+ if (el.disabled || !n) return
400
+
401
+ switch (t) {
402
+ case 'input':
403
+ if (!/reset|button|image|file/i.test(el.type)) {
404
+ ch = /checkbox/i.test(el.type)
405
+ ra = /radio/i.test(el.type)
406
+ val = el.value
407
+ // WebKit gives us "" instead of "on" if a checkbox has no value, so correct it here
408
+ ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))
409
+ }
410
+ break
411
+ case 'textarea':
412
+ cb(n, normalize(el.value))
413
+ break
414
+ case 'select':
415
+ if (el.type.toLowerCase() === 'select-one') {
416
+ optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)
417
+ } else {
418
+ for (i = 0; el.length && i < el.length; i++) {
419
+ el.options[i].selected && optCb(el.options[i])
420
+ }
421
+ }
422
+ break
423
+ }
424
+ }
425
+
426
+ // collect up all form elements found from the passed argument elements all
427
+ // the way down to child elements; pass a '<form>' or form fields.
428
+ // called with 'this'=callback to use for serial() on each element
429
+ function eachFormElement() {
430
+ var cb = this
431
+ , e, i
432
+ , serializeSubtags = function (e, tags) {
433
+ var i, j, fa
434
+ for (i = 0; i < tags.length; i++) {
435
+ fa = e[byTag](tags[i])
436
+ for (j = 0; j < fa.length; j++) serial(fa[j], cb)
437
+ }
438
+ }
439
+
440
+ for (i = 0; i < arguments.length; i++) {
441
+ e = arguments[i]
442
+ if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)
443
+ serializeSubtags(e, [ 'input', 'select', 'textarea' ])
444
+ }
445
+ }
446
+
447
+ // standard query string style serialization
448
+ function serializeQueryString() {
449
+ return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))
450
+ }
451
+
452
+ // { 'name': 'value', ... } style serialization
453
+ function serializeHash() {
454
+ var hash = {}
455
+ eachFormElement.apply(function (name, value) {
456
+ if (name in hash) {
457
+ hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])
458
+ hash[name].push(value)
459
+ } else hash[name] = value
460
+ }, arguments)
461
+ return hash
462
+ }
463
+
464
+ // [ { name: 'name', value: 'value' }, ... ] style serialization
465
+ reqwest.serializeArray = function () {
466
+ var arr = []
467
+ eachFormElement.apply(function (name, value) {
468
+ arr.push({name: name, value: value})
469
+ }, arguments)
470
+ return arr
471
+ }
472
+
473
+ reqwest.serialize = function () {
474
+ if (arguments.length === 0) return ''
475
+ var opt, fn
476
+ , args = Array.prototype.slice.call(arguments, 0)
477
+
478
+ opt = args.pop()
479
+ opt && opt.nodeType && args.push(opt) && (opt = null)
480
+ opt && (opt = opt.type)
481
+
482
+ if (opt == 'map') fn = serializeHash
483
+ else if (opt == 'array') fn = reqwest.serializeArray
484
+ else fn = serializeQueryString
485
+
486
+ return fn.apply(null, args)
487
+ }
488
+
489
+ reqwest.toQueryString = function (o, trad) {
490
+ var prefix, i
491
+ , traditional = trad || false
492
+ , s = []
493
+ , enc = encodeURIComponent
494
+ , add = function (key, value) {
495
+ // If value is a function, invoke it and return its value
496
+ value = ('function' === typeof value) ? value() : (value == null ? '' : value)
497
+ s[s.length] = enc(key) + '=' + enc(value)
498
+ }
499
+ // If an array was passed in, assume that it is an array of form elements.
500
+ if (isArray(o)) {
501
+ for (i = 0; o && i < o.length; i++) add(o[i].name, o[i].value)
502
+ } else {
503
+ // If traditional, encode the "old" way (the way 1.3.2 or older
504
+ // did it), otherwise encode params recursively.
505
+ for (prefix in o) {
506
+ buildParams(prefix, o[prefix], traditional, add)
507
+ }
508
+ }
509
+
510
+ // spaces should be + according to spec
511
+ return s.join('&').replace(/%20/g, '+')
512
+ }
513
+
514
+ function buildParams(prefix, obj, traditional, add) {
515
+ var name, i, v
516
+ , rbracket = /\[\]$/
517
+
518
+ if (isArray(obj)) {
519
+ // Serialize array item.
520
+ for (i = 0; obj && i < obj.length; i++) {
521
+ v = obj[i]
522
+ if (traditional || rbracket.test(prefix)) {
523
+ // Treat each array item as a scalar.
524
+ add(prefix, v)
525
+ } else {
526
+ buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)
527
+ }
528
+ }
529
+ } else if (obj && obj.toString() === '[object Object]') {
530
+ // Serialize object item.
531
+ for (name in obj) {
532
+ buildParams(prefix + '[' + name + ']', obj[name], traditional, add)
533
+ }
534
+
535
+ } else {
536
+ // Serialize scalar item.
537
+ add(prefix, obj)
538
+ }
539
+ }
540
+
541
+ reqwest.getcallbackPrefix = function () {
542
+ return callbackPrefix
543
+ }
544
+
545
+ // jQuery and Zepto compatibility, differences can be remapped here so you can call
546
+ // .ajax.compat(options, callback)
547
+ reqwest.compat = function (o, fn) {
548
+ if (o) {
549
+ o.type && (o.method = o.type) && delete o.type
550
+ o.dataType && (o.type = o.dataType)
551
+ o.jsonpCallback && (o.jsonpCallbackName = o.jsonpCallback) && delete o.jsonpCallback
552
+ o.jsonp && (o.jsonpCallback = o.jsonp)
553
+ }
554
+ return new Reqwest(o, fn)
555
+ }
556
+
557
+ reqwest.ajaxSetup = function (options) {
558
+ options = options || {}
559
+ for (var k in options) {
560
+ globalSetupOptions[k] = options[k]
561
+ }
562
+ }
563
+
564
+ return reqwest
565
+ });