├── .gitignore
├── Gemfile
├── Gemfile.lock
├── README.md
├── assets
├── fonts
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ ├── fontawesome-webfont.woff2
│ ├── material-design-icons
│ │ ├── LICENSE.txt
│ │ ├── Material-Design-Icons.eot
│ │ ├── Material-Design-Icons.svg
│ │ ├── Material-Design-Icons.ttf
│ │ ├── Material-Design-Icons.woff
│ │ └── Material-Design-Icons.woff2
│ └── roboto
│ │ ├── Roboto-Bold.eot
│ │ ├── Roboto-Bold.ttf
│ │ ├── Roboto-Bold.woff
│ │ ├── Roboto-Bold.woff2
│ │ ├── Roboto-Light.eot
│ │ ├── Roboto-Light.ttf
│ │ ├── Roboto-Light.woff
│ │ ├── Roboto-Light.woff2
│ │ ├── Roboto-Medium.eot
│ │ ├── Roboto-Medium.ttf
│ │ ├── Roboto-Medium.woff
│ │ ├── Roboto-Medium.woff2
│ │ ├── Roboto-Regular.eot
│ │ ├── Roboto-Regular.ttf
│ │ ├── Roboto-Regular.woff
│ │ ├── Roboto-Regular.woff2
│ │ ├── Roboto-Thin.eot
│ │ ├── Roboto-Thin.ttf
│ │ ├── Roboto-Thin.woff
│ │ └── Roboto-Thin.woff2
├── images
│ └── logo.png
├── javascripts
│ ├── New Text Document.txt
│ ├── application.coffee
│ ├── d3-3.2.8.js
│ ├── dashing.gridster.coffee
│ ├── gridster
│ │ ├── jquery.gridster.js
│ │ └── jquery.leanModal.min.js
│ ├── jquery.knob.js
│ ├── materialize.js
│ ├── materialize.min.js
│ └── rickshaw-1.4.3.min.js
└── stylesheets
│ ├── application.scss
│ ├── font-awesome.css
│ ├── jquery.gridster.css
│ ├── materialize.css
│ ├── materialize.min.css
│ ├── materialize
│ ├── LICENSE
│ ├── README.md
│ └── js
│ │ ├── materialize.js
│ │ └── materialize.min.js
│ └── theme.css
├── config.ru
├── dashboards
├── layout.erb
├── pimonitor.erb
├── sample.erb
├── sampletv.erb
└── serverload.erb
├── jobs
├── buzzwords.rb
├── convergence2.rb
├── meters.rb
├── sample.rb
├── server_status.rb
├── serverload.rb
├── synergy.rb
├── temperature.rb.graph
├── temperature.sh
├── tvshow_list.rb
├── tvshow_list.rb.backup
└── tvshows.rb
├── public
├── 404.html
├── favicon.ico
└── index.html
├── tempreg.txt
└── widgets
├── clock
├── clock.coffee
├── clock.html
└── clock.scss
├── comments
├── comments.coffee
├── comments.html
└── comments.scss
├── graph
├── graph.coffee
├── graph.html
└── graph.scss
├── iframe
├── iframe.coffee
├── iframe.html
└── iframe.scss
├── image
├── image.coffee
├── image.html
└── image.scss
├── list
├── list.coffee
├── list.html
└── list.scss
├── meter
├── meter.coffee
├── meter.html
└── meter.scss
├── number
├── number.coffee
├── number.html
└── number.scss
└── text
├── text.coffee
├── text.html
└── text.scss
/.gitignore:
--------------------------------------------------------------------------------
1 | *DS_STORE
2 | history.yml
3 | log/thin.log
4 | tmp/*
5 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'dashing'
4 |
5 | ## Remove this if you don't need a twitter widget.
6 | gem 'twitter', '>= 5.9.0'
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | addressable (2.4.0)
5 | backports (3.6.7)
6 | buftok (0.2.0)
7 | coffee-script (2.2.0)
8 | coffee-script-source
9 | execjs
10 | coffee-script-source (1.10.0)
11 | daemons (1.2.3)
12 | dashing (1.3.4)
13 | coffee-script (~> 2.2.0)
14 | execjs (~> 2.0.2)
15 | rack (~> 1.5.2)
16 | rufus-scheduler (~> 2.0.24)
17 | sass (~> 3.2.12)
18 | sinatra (~> 1.4.4)
19 | sinatra-contrib (~> 1.4.2)
20 | sprockets (~> 2.10.1)
21 | thin (~> 1.6.1)
22 | thor (~> 0.18.1)
23 | domain_name (0.5.25)
24 | unf (>= 0.0.5, < 1.0.0)
25 | equalizer (0.0.10)
26 | eventmachine (1.0.8)
27 | execjs (2.0.2)
28 | faraday (0.9.2)
29 | multipart-post (>= 1.2, < 3)
30 | hike (1.2.3)
31 | http (0.9.8)
32 | addressable (~> 2.3)
33 | http-cookie (~> 1.0)
34 | http-form_data (~> 1.0.1)
35 | http_parser.rb (~> 0.6.0)
36 | http-cookie (1.0.2)
37 | domain_name (~> 0.5)
38 | http-form_data (1.0.1)
39 | http_parser.rb (0.6.0)
40 | json (1.8.3)
41 | memoizable (0.4.2)
42 | thread_safe (~> 0.3, >= 0.3.1)
43 | multi_json (1.11.2)
44 | multipart-post (2.0.0)
45 | naught (1.1.0)
46 | rack (1.5.5)
47 | rack-protection (1.5.3)
48 | rack
49 | rack-test (0.6.3)
50 | rack (>= 1.0)
51 | rufus-scheduler (2.0.24)
52 | tzinfo (>= 0.3.22)
53 | sass (3.2.19)
54 | simple_oauth (0.3.1)
55 | sinatra (1.4.6)
56 | rack (~> 1.4)
57 | rack-protection (~> 1.4)
58 | tilt (>= 1.3, < 3)
59 | sinatra-contrib (1.4.6)
60 | backports (>= 2.0)
61 | multi_json
62 | rack-protection
63 | rack-test
64 | sinatra (~> 1.4.0)
65 | tilt (>= 1.3, < 3)
66 | sprockets (2.10.2)
67 | hike (~> 1.2)
68 | multi_json (~> 1.0)
69 | rack (~> 1.0)
70 | tilt (~> 1.1, != 1.3.0)
71 | thin (1.6.4)
72 | daemons (~> 1.0, >= 1.0.9)
73 | eventmachine (~> 1.0, >= 1.0.4)
74 | rack (~> 1.0)
75 | thor (0.18.1)
76 | thread_safe (0.3.5)
77 | tilt (1.4.1)
78 | twitter (5.15.0)
79 | addressable (~> 2.3)
80 | buftok (~> 0.2.0)
81 | equalizer (= 0.0.10)
82 | faraday (~> 0.9.0)
83 | http (>= 0.4, < 0.10)
84 | http_parser.rb (~> 0.6.0)
85 | json (~> 1.8)
86 | memoizable (~> 0.4.0)
87 | naught (~> 1.0)
88 | simple_oauth (~> 0.3.0)
89 | tzinfo (1.2.2)
90 | thread_safe (~> 0.1)
91 | unf (0.1.4)
92 | unf_ext
93 | unf_ext (0.0.7.1)
94 |
95 | PLATFORMS
96 | ruby
97 |
98 | DEPENDENCIES
99 | dashing
100 | twitter (>= 5.9.0)
101 |
102 | BUNDLED WITH
103 | 1.11.2
104 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Check out http://shopify.github.com/dashing for more information.
2 |
3 | # pi_dashboard
4 |
5 | Instructions:
6 |
7 | 1. Visit the link above and install Dashing
8 | 2. Clone this repo to your system.
9 | 3. Start Dashing!
10 |
11 | **Note:**
12 | Files changed from a default Dashing project are
13 | * dashboards/sample.erb
14 | * widgets/meter/meter.html
15 | * assets/javascripts/application.coffee
16 | * All the files in jobs/
17 | * Added material design stylesheets
18 |
--------------------------------------------------------------------------------
/assets/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/assets/fonts/material-design-icons/LICENSE.txt:
--------------------------------------------------------------------------------
1 | https://github.com/google/material-design-icons/blob/master/LICENSE
2 | https://github.com/FezVrasta/bootstrap-material-design/blob/master/fonts/LICENSE.txt
3 |
4 | Attribution-ShareAlike 4.0 International
5 |
6 | =======================================================================
7 |
8 | Creative Commons Corporation ("Creative Commons") is not a law firm and
9 | does not provide legal services or legal advice. Distribution of
10 | Creative Commons public licenses does not create a lawyer-client or
11 | other relationship. Creative Commons makes its licenses and related
12 | information available on an "as-is" basis. Creative Commons gives no
13 | warranties regarding its licenses, any material licensed under their
14 | terms and conditions, or any related information. Creative Commons
15 | disclaims all liability for damages resulting from their use to the
16 | fullest extent possible.
17 |
18 | Using Creative Commons Public Licenses
19 |
20 | Creative Commons public licenses provide a standard set of terms and
21 | conditions that creators and other rights holders may use to share
22 | original works of authorship and other material subject to copyright
23 | and certain other rights specified in the public license below. The
24 | following considerations are for informational purposes only, are not
25 | exhaustive, and do not form part of our licenses.
26 |
27 | Considerations for licensors: Our public licenses are
28 | intended for use by those authorized to give the public
29 | permission to use material in ways otherwise restricted by
30 | copyright and certain other rights. Our licenses are
31 | irrevocable. Licensors should read and understand the terms
32 | and conditions of the license they choose before applying it.
33 | Licensors should also secure all rights necessary before
34 | applying our licenses so that the public can reuse the
35 | material as expected. Licensors should clearly mark any
36 | material not subject to the license. This includes other CC-
37 | licensed material, or material used under an exception or
38 | limitation to copyright. More considerations for licensors:
39 | wiki.creativecommons.org/Considerations_for_licensors
40 |
41 | Considerations for the public: By using one of our public
42 | licenses, a licensor grants the public permission to use the
43 | licensed material under specified terms and conditions. If
44 | the licensor's permission is not necessary for any reason--for
45 | example, because of any applicable exception or limitation to
46 | copyright--then that use is not regulated by the license. Our
47 | licenses grant only permissions under copyright and certain
48 | other rights that a licensor has authority to grant. Use of
49 | the licensed material may still be restricted for other
50 | reasons, including because others have copyright or other
51 | rights in the material. A licensor may make special requests,
52 | such as asking that all changes be marked or described.
53 | Although not required by our licenses, you are encouraged to
54 | respect those requests where reasonable. More_considerations
55 | for the public:
56 | wiki.creativecommons.org/Considerations_for_licensees
57 |
58 | =======================================================================
59 |
60 | Creative Commons Attribution-ShareAlike 4.0 International Public
61 | License
62 |
63 | By exercising the Licensed Rights (defined below), You accept and agree
64 | to be bound by the terms and conditions of this Creative Commons
65 | Attribution-ShareAlike 4.0 International Public License ("Public
66 | License"). To the extent this Public License may be interpreted as a
67 | contract, You are granted the Licensed Rights in consideration of Your
68 | acceptance of these terms and conditions, and the Licensor grants You
69 | such rights in consideration of benefits the Licensor receives from
70 | making the Licensed Material available under these terms and
71 | conditions.
72 |
73 |
74 | Section 1 -- Definitions.
75 |
76 | a. Adapted Material means material subject to Copyright and Similar
77 | Rights that is derived from or based upon the Licensed Material
78 | and in which the Licensed Material is translated, altered,
79 | arranged, transformed, or otherwise modified in a manner requiring
80 | permission under the Copyright and Similar Rights held by the
81 | Licensor. For purposes of this Public License, where the Licensed
82 | Material is a musical work, performance, or sound recording,
83 | Adapted Material is always produced where the Licensed Material is
84 | synched in timed relation with a moving image.
85 |
86 | b. Adapter's License means the license You apply to Your Copyright
87 | and Similar Rights in Your contributions to Adapted Material in
88 | accordance with the terms and conditions of this Public License.
89 |
90 | c. BY-SA Compatible License means a license listed at
91 | creativecommons.org/compatiblelicenses, approved by Creative
92 | Commons as essentially the equivalent of this Public License.
93 |
94 | d. Copyright and Similar Rights means copyright and/or similar rights
95 | closely related to copyright including, without limitation,
96 | performance, broadcast, sound recording, and Sui Generis Database
97 | Rights, without regard to how the rights are labeled or
98 | categorized. For purposes of this Public License, the rights
99 | specified in Section 2(b)(1)-(2) are not Copyright and Similar
100 | Rights.
101 |
102 | e. Effective Technological Measures means those measures that, in the
103 | absence of proper authority, may not be circumvented under laws
104 | fulfilling obligations under Article 11 of the WIPO Copyright
105 | Treaty adopted on December 20, 1996, and/or similar international
106 | agreements.
107 |
108 | f. Exceptions and Limitations means fair use, fair dealing, and/or
109 | any other exception or limitation to Copyright and Similar Rights
110 | that applies to Your use of the Licensed Material.
111 |
112 | g. License Elements means the license attributes listed in the name
113 | of a Creative Commons Public License. The License Elements of this
114 | Public License are Attribution and ShareAlike.
115 |
116 | h. Licensed Material means the artistic or literary work, database,
117 | or other material to which the Licensor applied this Public
118 | License.
119 |
120 | i. Licensed Rights means the rights granted to You subject to the
121 | terms and conditions of this Public License, which are limited to
122 | all Copyright and Similar Rights that apply to Your use of the
123 | Licensed Material and that the Licensor has authority to license.
124 |
125 | j. Licensor means the individual(s) or entity(ies) granting rights
126 | under this Public License.
127 |
128 | k. Share means to provide material to the public by any means or
129 | process that requires permission under the Licensed Rights, such
130 | as reproduction, public display, public performance, distribution,
131 | dissemination, communication, or importation, and to make material
132 | available to the public including in ways that members of the
133 | public may access the material from a place and at a time
134 | individually chosen by them.
135 |
136 | l. Sui Generis Database Rights means rights other than copyright
137 | resulting from Directive 96/9/EC of the European Parliament and of
138 | the Council of 11 March 1996 on the legal protection of databases,
139 | as amended and/or succeeded, as well as other essentially
140 | equivalent rights anywhere in the world.
141 |
142 | m. You means the individual or entity exercising the Licensed Rights
143 | under this Public License. Your has a corresponding meaning.
144 |
145 |
146 | Section 2 -- Scope.
147 |
148 | a. License grant.
149 |
150 | 1. Subject to the terms and conditions of this Public License,
151 | the Licensor hereby grants You a worldwide, royalty-free,
152 | non-sublicensable, non-exclusive, irrevocable license to
153 | exercise the Licensed Rights in the Licensed Material to:
154 |
155 | a. reproduce and Share the Licensed Material, in whole or
156 | in part; and
157 |
158 | b. produce, reproduce, and Share Adapted Material.
159 |
160 | 2. Exceptions and Limitations. For the avoidance of doubt, where
161 | Exceptions and Limitations apply to Your use, this Public
162 | License does not apply, and You do not need to comply with
163 | its terms and conditions.
164 |
165 | 3. Term. The term of this Public License is specified in Section
166 | 6(a).
167 |
168 | 4. Media and formats; technical modifications allowed. The
169 | Licensor authorizes You to exercise the Licensed Rights in
170 | all media and formats whether now known or hereafter created,
171 | and to make technical modifications necessary to do so. The
172 | Licensor waives and/or agrees not to assert any right or
173 | authority to forbid You from making technical modifications
174 | necessary to exercise the Licensed Rights, including
175 | technical modifications necessary to circumvent Effective
176 | Technological Measures. For purposes of this Public License,
177 | simply making modifications authorized by this Section 2(a)
178 | (4) never produces Adapted Material.
179 |
180 | 5. Downstream recipients.
181 |
182 | a. Offer from the Licensor -- Licensed Material. Every
183 | recipient of the Licensed Material automatically
184 | receives an offer from the Licensor to exercise the
185 | Licensed Rights under the terms and conditions of this
186 | Public License.
187 |
188 | b. Additional offer from the Licensor -- Adapted Material.
189 | Every recipient of Adapted Material from You
190 | automatically receives an offer from the Licensor to
191 | exercise the Licensed Rights in the Adapted Material
192 | under the conditions of the Adapter's License You apply.
193 |
194 | c. No downstream restrictions. You may not offer or impose
195 | any additional or different terms or conditions on, or
196 | apply any Effective Technological Measures to, the
197 | Licensed Material if doing so restricts exercise of the
198 | Licensed Rights by any recipient of the Licensed
199 | Material.
200 |
201 | 6. No endorsement. Nothing in this Public License constitutes or
202 | may be construed as permission to assert or imply that You
203 | are, or that Your use of the Licensed Material is, connected
204 | with, or sponsored, endorsed, or granted official status by,
205 | the Licensor or others designated to receive attribution as
206 | provided in Section 3(a)(1)(A)(i).
207 |
208 | b. Other rights.
209 |
210 | 1. Moral rights, such as the right of integrity, are not
211 | licensed under this Public License, nor are publicity,
212 | privacy, and/or other similar personality rights; however, to
213 | the extent possible, the Licensor waives and/or agrees not to
214 | assert any such rights held by the Licensor to the limited
215 | extent necessary to allow You to exercise the Licensed
216 | Rights, but not otherwise.
217 |
218 | 2. Patent and trademark rights are not licensed under this
219 | Public License.
220 |
221 | 3. To the extent possible, the Licensor waives any right to
222 | collect royalties from You for the exercise of the Licensed
223 | Rights, whether directly or through a collecting society
224 | under any voluntary or waivable statutory or compulsory
225 | licensing scheme. In all other cases the Licensor expressly
226 | reserves any right to collect such royalties.
227 |
228 |
229 | Section 3 -- License Conditions.
230 |
231 | Your exercise of the Licensed Rights is expressly made subject to the
232 | following conditions.
233 |
234 | a. Attribution.
235 |
236 | 1. If You Share the Licensed Material (including in modified
237 | form), You must:
238 |
239 | a. retain the following if it is supplied by the Licensor
240 | with the Licensed Material:
241 |
242 | i. identification of the creator(s) of the Licensed
243 | Material and any others designated to receive
244 | attribution, in any reasonable manner requested by
245 | the Licensor (including by pseudonym if
246 | designated);
247 |
248 | ii. a copyright notice;
249 |
250 | iii. a notice that refers to this Public License;
251 |
252 | iv. a notice that refers to the disclaimer of
253 | warranties;
254 |
255 | v. a URI or hyperlink to the Licensed Material to the
256 | extent reasonably practicable;
257 |
258 | b. indicate if You modified the Licensed Material and
259 | retain an indication of any previous modifications; and
260 |
261 | c. indicate the Licensed Material is licensed under this
262 | Public License, and include the text of, or the URI or
263 | hyperlink to, this Public License.
264 |
265 | 2. You may satisfy the conditions in Section 3(a)(1) in any
266 | reasonable manner based on the medium, means, and context in
267 | which You Share the Licensed Material. For example, it may be
268 | reasonable to satisfy the conditions by providing a URI or
269 | hyperlink to a resource that includes the required
270 | information.
271 |
272 | 3. If requested by the Licensor, You must remove any of the
273 | information required by Section 3(a)(1)(A) to the extent
274 | reasonably practicable.
275 |
276 | b. ShareAlike.
277 |
278 | In addition to the conditions in Section 3(a), if You Share
279 | Adapted Material You produce, the following conditions also apply.
280 |
281 | 1. The Adapter's License You apply must be a Creative Commons
282 | license with the same License Elements, this version or
283 | later, or a BY-SA Compatible License.
284 |
285 | 2. You must include the text of, or the URI or hyperlink to, the
286 | Adapter's License You apply. You may satisfy this condition
287 | in any reasonable manner based on the medium, means, and
288 | context in which You Share Adapted Material.
289 |
290 | 3. You may not offer or impose any additional or different terms
291 | or conditions on, or apply any Effective Technological
292 | Measures to, Adapted Material that restrict exercise of the
293 | rights granted under the Adapter's License You apply.
294 |
295 |
296 | Section 4 -- Sui Generis Database Rights.
297 |
298 | Where the Licensed Rights include Sui Generis Database Rights that
299 | apply to Your use of the Licensed Material:
300 |
301 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right
302 | to extract, reuse, reproduce, and Share all or a substantial
303 | portion of the contents of the database;
304 |
305 | b. if You include all or a substantial portion of the database
306 | contents in a database in which You have Sui Generis Database
307 | Rights, then the database in which You have Sui Generis Database
308 | Rights (but not its individual contents) is Adapted Material,
309 |
310 | including for purposes of Section 3(b); and
311 | c. You must comply with the conditions in Section 3(a) if You Share
312 | all or a substantial portion of the contents of the database.
313 |
314 | For the avoidance of doubt, this Section 4 supplements and does not
315 | replace Your obligations under this Public License where the Licensed
316 | Rights include other Copyright and Similar Rights.
317 |
318 |
319 | Section 5 -- Disclaimer of Warranties and Limitation of Liability.
320 |
321 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
322 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
323 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
324 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
325 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
326 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
327 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
328 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
329 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
330 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
331 |
332 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
333 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
334 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
335 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
336 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
337 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
338 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
339 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
340 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
341 |
342 | c. The disclaimer of warranties and limitation of liability provided
343 | above shall be interpreted in a manner that, to the extent
344 | possible, most closely approximates an absolute disclaimer and
345 | waiver of all liability.
346 |
347 |
348 | Section 6 -- Term and Termination.
349 |
350 | a. This Public License applies for the term of the Copyright and
351 | Similar Rights licensed here. However, if You fail to comply with
352 | this Public License, then Your rights under this Public License
353 | terminate automatically.
354 |
355 | b. Where Your right to use the Licensed Material has terminated under
356 | Section 6(a), it reinstates:
357 |
358 | 1. automatically as of the date the violation is cured, provided
359 | it is cured within 30 days of Your discovery of the
360 | violation; or
361 |
362 | 2. upon express reinstatement by the Licensor.
363 |
364 | For the avoidance of doubt, this Section 6(b) does not affect any
365 | right the Licensor may have to seek remedies for Your violations
366 | of this Public License.
367 |
368 | c. For the avoidance of doubt, the Licensor may also offer the
369 | Licensed Material under separate terms or conditions or stop
370 | distributing the Licensed Material at any time; however, doing so
371 | will not terminate this Public License.
372 |
373 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
374 | License.
375 |
376 |
377 | Section 7 -- Other Terms and Conditions.
378 |
379 | a. The Licensor shall not be bound by any additional or different
380 | terms or conditions communicated by You unless expressly agreed.
381 |
382 | b. Any arrangements, understandings, or agreements regarding the
383 | Licensed Material not stated herein are separate from and
384 | independent of the terms and conditions of this Public License.
385 |
386 |
387 | Section 8 -- Interpretation.
388 |
389 | a. For the avoidance of doubt, this Public License does not, and
390 | shall not be interpreted to, reduce, limit, restrict, or impose
391 | conditions on any use of the Licensed Material that could lawfully
392 | be made without permission under this Public License.
393 |
394 | b. To the extent possible, if any provision of this Public License is
395 | deemed unenforceable, it shall be automatically reformed to the
396 | minimum extent necessary to make it enforceable. If the provision
397 | cannot be reformed, it shall be severed from this Public License
398 | without affecting the enforceability of the remaining terms and
399 | conditions.
400 |
401 | c. No term or condition of this Public License will be waived and no
402 | failure to comply consented to unless expressly agreed to by the
403 | Licensor.
404 |
405 | d. Nothing in this Public License constitutes or may be interpreted
406 | as a limitation upon, or waiver of, any privileges and immunities
407 | that apply to the Licensor or You, including from the legal
408 | processes of any jurisdiction or authority.
409 |
410 |
411 | =======================================================================
412 |
413 | Creative Commons is not a party to its public licenses.
414 | Notwithstanding, Creative Commons may elect to apply one of its public
415 | licenses to material it publishes and in those instances will be
416 | considered the "Licensor." Except for the limited purpose of indicating
417 | that material is shared under a Creative Commons public license or as
418 | otherwise permitted by the Creative Commons policies published at
419 | creativecommons.org/policies, Creative Commons does not authorize the
420 | use of the trademark "Creative Commons" or any other trademark or logo
421 | of Creative Commons without its prior written consent including,
422 | without limitation, in connection with any unauthorized modifications
423 | to any of its public licenses or any other arrangements,
424 | understandings, or agreements concerning use of licensed material. For
425 | the avoidance of doubt, this paragraph does not form part of the public
426 | licenses.
427 |
428 | Creative Commons may be contacted at creativecommons.org.
429 |
--------------------------------------------------------------------------------
/assets/fonts/material-design-icons/Material-Design-Icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/material-design-icons/Material-Design-Icons.eot
--------------------------------------------------------------------------------
/assets/fonts/material-design-icons/Material-Design-Icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/material-design-icons/Material-Design-Icons.ttf
--------------------------------------------------------------------------------
/assets/fonts/material-design-icons/Material-Design-Icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/material-design-icons/Material-Design-Icons.woff
--------------------------------------------------------------------------------
/assets/fonts/material-design-icons/Material-Design-Icons.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/material-design-icons/Material-Design-Icons.woff2
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Bold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Bold.eot
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Bold.woff
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Bold.woff2
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Light.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Light.eot
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Light.ttf
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Light.woff
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Light.woff2
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Medium.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Medium.eot
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Medium.woff
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Medium.woff2
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Regular.eot
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Regular.woff
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Regular.woff2
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Thin.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Thin.eot
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Thin.ttf
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Thin.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Thin.woff
--------------------------------------------------------------------------------
/assets/fonts/roboto/Roboto-Thin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/fonts/roboto/Roboto-Thin.woff2
--------------------------------------------------------------------------------
/assets/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/images/logo.png
--------------------------------------------------------------------------------
/assets/javascripts/New Text Document.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/assets/javascripts/New Text Document.txt
--------------------------------------------------------------------------------
/assets/javascripts/application.coffee:
--------------------------------------------------------------------------------
1 | # dashing.js is located in the dashing framework
2 | # It includes jquery & batman for you.
3 | #= require dashing.js
4 |
5 | #= require_directory .
6 | #= require_tree ../../widgets
7 |
8 | console.log("Yeah! The dashboard has started!")
9 |
10 | Dashing.on 'ready', ->
11 | Dashing.widget_margins ||= [5, 10]
12 | Dashing.widget_base_dimensions ||= [100,150]
13 | Dashing.numColumns ||= 10
14 |
15 | contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns
16 |
17 | Batman.setImmediate ->
18 | $('.gridster').width(contentWidth)
19 | $('.gridster ul:first').gridster
20 | widget_margins: Dashing.widget_margins
21 | widget_base_dimensions: Dashing.widget_base_dimensions
22 | avoid_overlapped_widgets: !Dashing.customGridsterLayout
23 | draggable:
24 | stop: Dashing.showGridsterInstructions
25 | start: -> Dashing.currentWidgetPositions = Dashing.getWidgetPositions()
26 |
--------------------------------------------------------------------------------
/assets/javascripts/dashing.gridster.coffee:
--------------------------------------------------------------------------------
1 | #= require_directory ./gridster
2 |
3 | # This file enables gridster integration (http://gridster.net/)
4 | # Delete it if you'd rather handle the layout yourself.
5 | # You'll miss out on a lot if you do, but we won't hold it against you.
6 |
7 | Dashing.gridsterLayout = (positions) ->
8 | Dashing.customGridsterLayout = true
9 | positions = positions.replace(/^"|"$/g, '')
10 | positions = $.parseJSON(positions)
11 | widgets = $("[data-row^=]")
12 | for widget, index in widgets
13 | $(widget).attr('data-row', positions[index].row)
14 | $(widget).attr('data-col', positions[index].col)
15 |
16 | Dashing.getWidgetPositions = ->
17 | $(".gridster ul:first").gridster().data('gridster').serialize()
18 |
19 | Dashing.showGridsterInstructions = ->
20 | newWidgetPositions = Dashing.getWidgetPositions()
21 |
22 | unless JSON.stringify(newWidgetPositions) == JSON.stringify(Dashing.currentWidgetPositions)
23 | Dashing.currentWidgetPositions = newWidgetPositions
24 | $('#save-gridster').slideDown()
25 | $('#gridster-code').text("
26 |
31 | ")
32 |
33 | $ ->
34 | $('#save-gridster').leanModal()
35 |
36 | $('#save-gridster').click ->
37 | $('#save-gridster').slideUp()
38 |
--------------------------------------------------------------------------------
/assets/javascripts/gridster/jquery.leanModal.min.js:
--------------------------------------------------------------------------------
1 | // leanModal v1.1 by Ray Stone - http://finelysliced.com.au
2 | // Dual licensed under the MIT and GPL
3 |
4 | (function($){$.fn.extend({leanModal:function(options){var defaults={top:100,overlay:0.5,closeButton:null};var overlay=$("
");$("body").append(overlay);options=$.extend(defaults,options);return this.each(function(){var o=options;$(this).click(function(e){var modal_id=$(this).attr("href");$("#lean_overlay").click(function(){close_modal(modal_id)});$(o.closeButton).click(function(){close_modal(modal_id)});var modal_height=$(modal_id).outerHeight();var modal_width=$(modal_id).outerWidth();
5 | $("#lean_overlay").css({"display":"block",opacity:0});$("#lean_overlay").fadeTo(200,o.overlay);$(modal_id).css({"display":"block","position":"fixed","opacity":0,"z-index":11000,"left":50+"%","margin-left":-(modal_width/2)+"px","top":o.top+"px"});$(modal_id).fadeTo(200,1);e.preventDefault()})});function close_modal(modal_id){$("#lean_overlay").fadeOut(200);$(modal_id).css({"display":"none"})}}})})(jQuery);
6 |
--------------------------------------------------------------------------------
/assets/javascripts/jquery.knob.js:
--------------------------------------------------------------------------------
1 | /*!jQuery Knob*/
2 | /**
3 | * Downward compatible, touchable dial
4 | *
5 | * Version: 1.2.0 (15/07/2012)
6 | * Requires: jQuery v1.7+
7 | *
8 | * Copyright (c) 2012 Anthony Terrien
9 | * Under MIT and GPL licenses:
10 | * http://www.opensource.org/licenses/mit-license.php
11 | * http://www.gnu.org/licenses/gpl.html
12 | *
13 | * Thanks to vor, eskimoblood, spiffistan, FabrizioC
14 | */
15 | $(function () {
16 |
17 | /**
18 | * Kontrol library
19 | */
20 | "use strict";
21 |
22 | /**
23 | * Definition of globals and core
24 | */
25 | var k = {}, // kontrol
26 | max = Math.max,
27 | min = Math.min;
28 |
29 | k.c = {};
30 | k.c.d = $(document);
31 | k.c.t = function (e) {
32 | return e.originalEvent.touches.length - 1;
33 | };
34 |
35 | /**
36 | * Kontrol Object
37 | *
38 | * Definition of an abstract UI control
39 | *
40 | * Each concrete component must call this one.
41 | *
42 | * k.o.call(this);
43 | *
44 | */
45 | k.o = function () {
46 | var s = this;
47 |
48 | this.o = null; // array of options
49 | this.$ = null; // jQuery wrapped element
50 | this.i = null; // mixed HTMLInputElement or array of HTMLInputElement
51 | this.g = null; // 2D graphics context for 'pre-rendering'
52 | this.v = null; // value ; mixed array or integer
53 | this.cv = null; // change value ; not commited value
54 | this.x = 0; // canvas x position
55 | this.y = 0; // canvas y position
56 | this.$c = null; // jQuery canvas element
57 | this.c = null; // rendered canvas context
58 | this.t = 0; // touches index
59 | this.isInit = false;
60 | this.fgColor = null; // main color
61 | this.pColor = null; // previous color
62 | this.dH = null; // draw hook
63 | this.cH = null; // change hook
64 | this.eH = null; // cancel hook
65 | this.rH = null; // release hook
66 |
67 | this.run = function () {
68 | var cf = function (e, conf) {
69 | var k;
70 | for (k in conf) {
71 | s.o[k] = conf[k];
72 | }
73 | s.init();
74 | s._configure()
75 | ._draw();
76 | };
77 |
78 | if(this.$.data('kontroled')) return;
79 | this.$.data('kontroled', true);
80 |
81 | this.extend();
82 | this.o = $.extend(
83 | {
84 | // Config
85 | min : this.$.data('min') || 0,
86 | max : this.$.data('max') || 100,
87 | stopper : true,
88 | readOnly : this.$.data('readonly'),
89 |
90 | // UI
91 | cursor : (this.$.data('cursor') === true && 30)
92 | || this.$.data('cursor')
93 | || 0,
94 | thickness : this.$.data('thickness') || 0.35,
95 | width : this.$.data('width') || 200,
96 | height : this.$.data('height') || 200,
97 | displayInput : this.$.data('displayinput') == null || this.$.data('displayinput'),
98 | displayPrevious : this.$.data('displayprevious'),
99 | fgColor : this.$.data('fgcolor') || '#87CEEB',
100 | inline : false,
101 |
102 | // Hooks
103 | draw : null, // function () {}
104 | change : null, // function (value) {}
105 | cancel : null, // function () {}
106 | release : null // function (value) {}
107 | }, this.o
108 | );
109 |
110 | // routing value
111 | if(this.$.is('fieldset')) {
112 |
113 | // fieldset = array of integer
114 | this.v = {};
115 | this.i = this.$.find('input')
116 | this.i.each(function(k) {
117 | var $this = $(this);
118 | s.i[k] = $this;
119 | s.v[k] = $this.val();
120 |
121 | $this.bind(
122 | 'change'
123 | , function () {
124 | var val = {};
125 | val[k] = $this.val();
126 | s.val(val);
127 | }
128 | );
129 | });
130 | this.$.find('legend').remove();
131 |
132 | } else {
133 | // input = integer
134 | this.i = this.$;
135 | this.v = this.$.val();
136 | (this.v == '') && (this.v = this.o.min);
137 |
138 | this.$.bind(
139 | 'change'
140 | , function () {
141 | s.val(s.$.val());
142 | }
143 | );
144 | }
145 |
146 | (!this.o.displayInput) && this.$.hide();
147 |
148 | this.$c = $(' ');
151 | this.c = this.$c[0].getContext("2d");
152 |
153 | this.$
154 | .wrap($('
'))
157 | .before(this.$c);
158 |
159 | if (this.v instanceof Object) {
160 | this.cv = {};
161 | this.copy(this.v, this.cv);
162 | } else {
163 | this.cv = this.v;
164 | }
165 |
166 | this.$
167 | .bind("configure", cf)
168 | .parent()
169 | .bind("configure", cf);
170 |
171 | this._listen()
172 | ._configure()
173 | ._xy()
174 | .init();
175 |
176 | this.isInit = true;
177 |
178 | this._draw();
179 |
180 | return this;
181 | };
182 |
183 | this._draw = function () {
184 |
185 | // canvas pre-rendering
186 | var d = true,
187 | c = document.createElement('canvas');
188 |
189 | c.width = s.o.width;
190 | c.height = s.o.height;
191 | s.g = c.getContext('2d');
192 |
193 | s.clear();
194 |
195 | s.dH
196 | && (d = s.dH());
197 |
198 | (d !== false) && s.draw();
199 |
200 | s.c.drawImage(c, 0, 0);
201 | c = null;
202 | };
203 |
204 | this._touch = function (e) {
205 |
206 | var touchMove = function (e) {
207 |
208 | var v = s.xy2val(
209 | e.originalEvent.touches[s.t].pageX,
210 | e.originalEvent.touches[s.t].pageY
211 | );
212 |
213 | if (v == s.cv) return;
214 |
215 | if (
216 | s.cH
217 | && (s.cH(v) === false)
218 | ) return;
219 |
220 |
221 | s.change(v);
222 | s._draw();
223 | };
224 |
225 | // get touches index
226 | this.t = k.c.t(e);
227 |
228 | // First touch
229 | touchMove(e);
230 |
231 | // Touch events listeners
232 | k.c.d
233 | .bind("touchmove.k", touchMove)
234 | .bind(
235 | "touchend.k"
236 | , function () {
237 | k.c.d.unbind('touchmove.k touchend.k');
238 |
239 | if (
240 | s.rH
241 | && (s.rH(s.cv) === false)
242 | ) return;
243 |
244 | s.val(s.cv);
245 | }
246 | );
247 |
248 | return this;
249 | };
250 |
251 | this._mouse = function (e) {
252 |
253 | var mouseMove = function (e) {
254 | var v = s.xy2val(e.pageX, e.pageY);
255 | if (v == s.cv) return;
256 |
257 | if (
258 | s.cH
259 | && (s.cH(v) === false)
260 | ) return;
261 |
262 | s.change(v);
263 | s._draw();
264 | };
265 |
266 | // First click
267 | mouseMove(e);
268 |
269 | // Mouse events listeners
270 | k.c.d
271 | .bind("mousemove.k", mouseMove)
272 | .bind(
273 | // Escape key cancel current change
274 | "keyup.k"
275 | , function (e) {
276 | if (e.keyCode === 27) {
277 | k.c.d.unbind("mouseup.k mousemove.k keyup.k");
278 |
279 | if (
280 | s.eH
281 | && (s.eH() === false)
282 | ) return;
283 |
284 | s.cancel();
285 | }
286 | }
287 | )
288 | .bind(
289 | "mouseup.k"
290 | , function (e) {
291 | k.c.d.unbind('mousemove.k mouseup.k keyup.k');
292 |
293 | if (
294 | s.rH
295 | && (s.rH(s.cv) === false)
296 | ) return;
297 |
298 | s.val(s.cv);
299 | }
300 | );
301 |
302 | return this;
303 | };
304 |
305 | this._xy = function () {
306 | var o = this.$c.offset();
307 | this.x = o.left;
308 | this.y = o.top;
309 | return this;
310 | };
311 |
312 | this._listen = function () {
313 |
314 | if (!this.o.readOnly) {
315 | this.$c
316 | .bind(
317 | "mousedown"
318 | , function (e) {
319 | e.preventDefault();
320 | s._xy()._mouse(e);
321 | }
322 | )
323 | .bind(
324 | "touchstart"
325 | , function (e) {
326 | e.preventDefault();
327 | s._xy()._touch(e);
328 | }
329 | );
330 | this.listen();
331 | } else {
332 | this.$.attr('readonly', 'readonly');
333 | }
334 |
335 | return this;
336 | };
337 |
338 | this._configure = function () {
339 |
340 | // Hooks
341 | if (this.o.draw) this.dH = this.o.draw;
342 | if (this.o.change) this.cH = this.o.change;
343 | if (this.o.cancel) this.eH = this.o.cancel;
344 | if (this.o.release) this.rH = this.o.release;
345 |
346 | if (this.o.displayPrevious) {
347 | this.pColor = this.h2rgba(this.o.fgColor, "0.4");
348 | this.fgColor = this.h2rgba(this.o.fgColor, "0.6");
349 | } else {
350 | this.fgColor = this.o.fgColor;
351 | }
352 |
353 | return this;
354 | };
355 |
356 | this._clear = function () {
357 | this.$c[0].width = this.$c[0].width;
358 | };
359 |
360 | // Abstract methods
361 | this.listen = function () {}; // on start, one time
362 | this.extend = function () {}; // each time configure triggered
363 | this.init = function () {}; // each time configure triggered
364 | this.change = function (v) {}; // on change
365 | this.val = function (v) {}; // on release
366 | this.xy2val = function (x, y) {}; //
367 | this.draw = function () {}; // on change / on release
368 | this.clear = function () { this._clear(); };
369 |
370 | // Utils
371 | this.h2rgba = function (h, a) {
372 | var rgb;
373 | h = h.substring(1,7)
374 | rgb = [parseInt(h.substring(0,2),16)
375 | ,parseInt(h.substring(2,4),16)
376 | ,parseInt(h.substring(4,6),16)];
377 | return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + a + ")";
378 | };
379 |
380 | this.copy = function (f, t) {
381 | for (var i in f) { t[i] = f[i]; }
382 | };
383 | };
384 |
385 |
386 | /**
387 | * k.Dial
388 | */
389 | k.Dial = function () {
390 | k.o.call(this);
391 |
392 | this.startAngle = null;
393 | this.xy = null;
394 | this.radius = null;
395 | this.lineWidth = null;
396 | this.cursorExt = null;
397 | this.w2 = null;
398 | this.PI2 = 2*Math.PI;
399 |
400 | this.extend = function () {
401 | this.o = $.extend(
402 | {
403 | bgColor : this.$.data('bgcolor') || '#EEEEEE',
404 | angleOffset : this.$.data('angleoffset') || 0,
405 | angleArc : this.$.data('anglearc') || 360,
406 | inline : true
407 | }, this.o
408 | );
409 | };
410 |
411 | this.val = function (v) {
412 | if (null != v) {
413 | this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v;
414 | this.v = this.cv;
415 | this.$.val(this.v);
416 | this._draw();
417 | } else {
418 | return this.v;
419 | }
420 | };
421 |
422 | this.xy2val = function (x, y) {
423 | var a, ret;
424 |
425 | a = Math.atan2(
426 | x - (this.x + this.w2)
427 | , - (y - this.y - this.w2)
428 | ) - this.angleOffset;
429 |
430 | if(this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) {
431 | // if isset angleArc option, set to min if .5 under min
432 | a = 0;
433 | } else if (a < 0) {
434 | a += this.PI2;
435 | }
436 |
437 | ret = ~~ (0.5 + (a * (this.o.max - this.o.min) / this.angleArc))
438 | + this.o.min;
439 |
440 | this.o.stopper
441 | && (ret = max(min(ret, this.o.max), this.o.min));
442 |
443 | return ret;
444 | };
445 |
446 | this.listen = function () {
447 | // bind MouseWheel
448 | var s = this,
449 | mw = function (e) {
450 | e.preventDefault();
451 |
452 | var ori = e.originalEvent
453 | ,deltaX = ori.detail || ori.wheelDeltaX
454 | ,deltaY = ori.detail || ori.wheelDeltaY
455 | ,v = parseInt(s.$.val()) + (deltaX>0 || deltaY>0 ? 1 : deltaX<0 || deltaY<0 ? -1 : 0);
456 |
457 | if (
458 | s.cH
459 | && (s.cH(v) === false)
460 | ) return;
461 |
462 | s.val(v);
463 | }
464 | , kval, to, m = 1, kv = {37:-1, 38:1, 39:1, 40:-1};
465 |
466 | this.$
467 | .bind(
468 | "keydown"
469 | ,function (e) {
470 | var kc = e.keyCode;
471 | kval = parseInt(String.fromCharCode(kc));
472 |
473 | if (isNaN(kval)) {
474 |
475 | (kc !== 13) // enter
476 | && (kc !== 8) // bs
477 | && (kc !== 9) // tab
478 | && (kc !== 189) // -
479 | && e.preventDefault();
480 |
481 | // arrows
482 | if ($.inArray(kc,[37,38,39,40]) > -1) {
483 | e.preventDefault();
484 |
485 | var v = parseInt(s.$.val()) + kv[kc] * m;
486 |
487 | s.o.stopper
488 | && (v = max(min(v, s.o.max), s.o.min));
489 |
490 | s.change(v);
491 | s._draw();
492 |
493 | // long time keydown speed-up
494 | to = window.setTimeout(
495 | function () { m*=2; }
496 | ,30
497 | );
498 | }
499 | }
500 | }
501 | )
502 | .bind(
503 | "keyup"
504 | ,function (e) {
505 | if (isNaN(kval)) {
506 | if (to) {
507 | window.clearTimeout(to);
508 | to = null;
509 | m = 1;
510 | s.val(s.$.val());
511 | }
512 | } else {
513 | // kval postcond
514 | (s.$.val() > s.o.max && s.$.val(s.o.max))
515 | || (s.$.val() < s.o.min && s.$.val(s.o.min));
516 | }
517 |
518 | }
519 | );
520 |
521 | this.$c.bind("mousewheel DOMMouseScroll", mw);
522 | this.$.bind("mousewheel DOMMouseScroll", mw)
523 | };
524 |
525 | this.init = function () {
526 |
527 | if (
528 | this.v < this.o.min
529 | || this.v > this.o.max
530 | ) this.v = this.o.min;
531 |
532 | this.$.val(this.v);
533 | this.w2 = this.o.width / 2;
534 | this.cursorExt = this.o.cursor / 100;
535 | this.xy = this.w2;
536 | this.lineWidth = this.xy * this.o.thickness;
537 | this.radius = this.xy - this.lineWidth / 2;
538 |
539 | this.o.angleOffset
540 | && (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset);
541 |
542 | this.o.angleArc
543 | && (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2 : this.o.angleArc);
544 |
545 | // deg to rad
546 | this.angleOffset = this.o.angleOffset * Math.PI / 180;
547 | this.angleArc = this.o.angleArc * Math.PI / 180;
548 |
549 | // compute start and end angles
550 | this.startAngle = 1.5 * Math.PI + this.angleOffset;
551 | this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc;
552 |
553 | var s = max(
554 | String(Math.abs(this.o.max)).length
555 | , String(Math.abs(this.o.min)).length
556 | , 2
557 | ) + 2;
558 |
559 | this.o.displayInput
560 | && this.i.css({
561 | 'width' : ((this.o.width / 2 + 4) >> 0) + 'px'
562 | ,'height' : ((this.o.width / 3) >> 0) + 'px'
563 | ,'position' : 'absolute'
564 | ,'vertical-align' : 'middle'
565 | ,'margin-top' : ((this.o.width / 3) >> 0) + 'px'
566 | ,'margin-left' : '-' + ((this.o.width * 3 / 4 + 2) >> 0) + 'px'
567 | ,'border' : 0
568 | ,'background' : 'none'
569 | ,'font' : 'bold ' + ((this.o.width / s) >> 0) + 'px Arial'
570 | ,'text-align' : 'center'
571 | ,'color' : this.o.fgColor
572 | ,'padding' : '0px'
573 | ,'-webkit-appearance': 'none'
574 | })
575 | || this.i.css({
576 | 'width' : '0px'
577 | ,'visibility' : 'hidden'
578 | });
579 | };
580 |
581 | this.change = function (v) {
582 | this.cv = v;
583 | this.$.val(v);
584 | };
585 |
586 | this.angle = function (v) {
587 | return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min);
588 | };
589 |
590 | this.draw = function () {
591 |
592 | var c = this.g, // context
593 | a = this.angle(this.cv) // Angle
594 | , sat = this.startAngle // Start angle
595 | , eat = sat + a // End angle
596 | , sa, ea // Previous angles
597 | , r = 1;
598 |
599 | c.lineWidth = this.lineWidth;
600 |
601 | this.o.cursor
602 | && (sat = eat - this.cursorExt)
603 | && (eat = eat + this.cursorExt);
604 |
605 | c.beginPath();
606 | c.strokeStyle = this.o.bgColor;
607 | c.arc(this.xy, this.xy, this.radius, this.endAngle, this.startAngle, true);
608 | c.stroke();
609 |
610 | if (this.o.displayPrevious) {
611 | ea = this.startAngle + this.angle(this.v);
612 | sa = this.startAngle;
613 | this.o.cursor
614 | && (sa = ea - this.cursorExt)
615 | && (ea = ea + this.cursorExt);
616 |
617 | c.beginPath();
618 | c.strokeStyle = this.pColor;
619 | c.arc(this.xy, this.xy, this.radius, sa, ea, false);
620 | c.stroke();
621 | r = (this.cv == this.v);
622 | }
623 |
624 | c.beginPath();
625 | c.strokeStyle = r ? this.o.fgColor : this.fgColor ;
626 | c.arc(this.xy, this.xy, this.radius, sat, eat, false);
627 | c.stroke();
628 | };
629 |
630 | this.cancel = function () {
631 | this.val(this.v);
632 | };
633 | };
634 |
635 | $.fn.dial = $.fn.knob = function (o) {
636 | return this.each(
637 | function () {
638 | var d = new k.Dial();
639 | d.o = o;
640 | d.$ = $(this);
641 | d.run();
642 | }
643 | ).parent();
644 | };
645 |
646 | });
--------------------------------------------------------------------------------
/assets/javascripts/rickshaw-1.4.3.min.js:
--------------------------------------------------------------------------------
1 | var Rickshaw={namespace:function(namespace,obj){var parts=namespace.split(".");var parent=Rickshaw;for(var i=1,length=parts.length;i=3){if(s.data[2].xthis.window.xMax)isInRange=false;return isInRange}return true};this.onUpdate=function(callback){this.updateCallbacks.push(callback)};this.registerRenderer=function(renderer){this._renderers=this._renderers||{};this._renderers[renderer.name]=renderer};this.configure=function(args){if(args.width||args.height){this.setSize(args)}Rickshaw.keys(this.defaults).forEach(function(k){this[k]=k in args?args[k]:k in this?this[k]:this.defaults[k]},this);this.setRenderer(args.renderer||this.renderer.name,args)};this.setRenderer=function(r,args){if(typeof r=="function"){this.renderer=new r({graph:self});this.registerRenderer(this.renderer)}else{if(!this._renderers[r]){throw"couldn't find renderer "+r}this.renderer=this._renderers[r]}if(typeof args=="object"){this.renderer.configure(args)}};this.setSize=function(args){args=args||{};if(typeof window!==undefined){var style=window.getComputedStyle(this.element,null);var elementWidth=parseInt(style.getPropertyValue("width"),10);var elementHeight=parseInt(style.getPropertyValue("height"),10)}this.width=args.width||elementWidth||400;this.height=args.height||elementHeight||250;this.vis&&this.vis.attr("width",this.width).attr("height",this.height)};this.initialize(args)};Rickshaw.namespace("Rickshaw.Fixtures.Color");Rickshaw.Fixtures.Color=function(){this.schemes={};this.schemes.spectrum14=["#ecb796","#dc8f70","#b2a470","#92875a","#716c49","#d2ed82","#bbe468","#a1d05d","#e7cbe6","#d8aad6","#a888c2","#9dc2d3","#649eb9","#387aa3"].reverse();this.schemes.spectrum2000=["#57306f","#514c76","#646583","#738394","#6b9c7d","#84b665","#a7ca50","#bfe746","#e2f528","#fff726","#ecdd00","#d4b11d","#de8800","#de4800","#c91515","#9a0000","#7b0429","#580839","#31082b"];this.schemes.spectrum2001=["#2f243f","#3c2c55","#4a3768","#565270","#6b6b7c","#72957f","#86ad6e","#a1bc5e","#b8d954","#d3e04e","#ccad2a","#cc8412","#c1521d","#ad3821","#8a1010","#681717","#531e1e","#3d1818","#320a1b"];this.schemes.classic9=["#423d4f","#4a6860","#848f39","#a2b73c","#ddcb53","#c5a32f","#7d5836","#963b20","#7c2626","#491d37","#2f254a"].reverse();this.schemes.httpStatus={503:"#ea5029",502:"#d23f14",500:"#bf3613",410:"#efacea",409:"#e291dc",403:"#f457e8",408:"#e121d2",401:"#b92dae",405:"#f47ceb",404:"#a82a9f",400:"#b263c6",301:"#6fa024",302:"#87c32b",307:"#a0d84c",304:"#28b55c",200:"#1a4f74",206:"#27839f",201:"#52adc9",202:"#7c979f",203:"#a5b8bd",204:"#c1cdd1"};this.schemes.colorwheel=["#b5b6a9","#858772","#785f43","#96557e","#4682b4","#65b9ac","#73c03a","#cb513a"].reverse();this.schemes.cool=["#5e9d2f","#73c03a","#4682b4","#7bc3b8","#a9884e","#c1b266","#a47493","#c09fb5"];this.schemes.munin=["#00cc00","#0066b3","#ff8000","#ffcc00","#330099","#990099","#ccff00","#ff0000","#808080","#008f00","#00487d","#b35a00","#b38f00","#6b006b","#8fb300","#b30000","#bebebe","#80ff80","#80c9ff","#ffc080","#ffe680","#aa80ff","#ee00cc","#ff8080","#666600","#ffbfff","#00ffcc","#cc6699","#999900"]};Rickshaw.namespace("Rickshaw.Fixtures.RandomData");Rickshaw.Fixtures.RandomData=function(timeInterval){var addData;timeInterval=timeInterval||1;var lastRandomValue=200;var timeBase=Math.floor((new Date).getTime()/1e3);this.addData=function(data){var randomValue=Math.random()*100+15+lastRandomValue;var index=data[0].length;var counter=1;data.forEach(function(series){var randomVariance=Math.random()*20;var v=randomValue/25+counter++ +(Math.cos(index*counter*11/960)+2)*15+(Math.cos(index/7)+2)*7+(Math.cos(index/17)+2)*1;series.push({x:index*timeInterval+timeBase,y:v+randomVariance})});lastRandomValue=randomValue*.85};this.removeData=function(data){data.forEach(function(series){series.shift()});timeBase+=timeInterval}};Rickshaw.namespace("Rickshaw.Fixtures.Time");Rickshaw.Fixtures.Time=function(){var tzOffset=(new Date).getTimezoneOffset()*60;var self=this;this.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];this.units=[{name:"decade",seconds:86400*365.25*10,formatter:function(d){return parseInt(d.getUTCFullYear()/10,10)*10}},{name:"year",seconds:86400*365.25,formatter:function(d){return d.getUTCFullYear()}},{name:"month",seconds:86400*30.5,formatter:function(d){return self.months[d.getUTCMonth()]}},{name:"week",seconds:86400*7,formatter:function(d){return self.formatDate(d)}},{name:"day",seconds:86400,formatter:function(d){return d.getUTCDate()}},{name:"6 hour",seconds:3600*6,formatter:function(d){return self.formatTime(d)}},{name:"hour",seconds:3600,formatter:function(d){return self.formatTime(d)}},{name:"15 minute",seconds:60*15,formatter:function(d){return self.formatTime(d)}},{name:"minute",seconds:60,formatter:function(d){return d.getUTCMinutes()}},{name:"15 second",seconds:15,formatter:function(d){return d.getUTCSeconds()+"s"}},{name:"second",seconds:1,formatter:function(d){return d.getUTCSeconds()+"s"}}];this.unit=function(unitName){return this.units.filter(function(unit){return unitName==unit.name}).shift()};this.formatDate=function(d){return d3.time.format("%b %e")(d)};this.formatTime=function(d){return d.toUTCString().match(/(\d+:\d+):/)[1]};this.ceil=function(time,unit){var nearFuture;var rounded;if(unit.name=="month"){nearFuture=new Date((time+unit.seconds-1)*1e3);rounded=new Date(0);rounded.setUTCFullYear(nearFuture.getUTCFullYear());rounded.setUTCMonth(nearFuture.getUTCMonth());rounded.setUTCDate(1);rounded.setUTCHours(0);rounded.setUTCMinutes(0);rounded.setUTCSeconds(0);rounded.setUTCMilliseconds(0);return rounded.getTime()/1e3}if(unit.name=="year"){nearFuture=new Date((time+unit.seconds-1)*1e3);rounded=new Date(0);rounded.setUTCFullYear(nearFuture.getUTCFullYear());rounded.setUTCMonth(0);rounded.setUTCDate(1);rounded.setUTCHours(0);rounded.setUTCMinutes(0);rounded.setUTCSeconds(0);rounded.setUTCMilliseconds(0);return rounded.getTime()/1e3}return Math.ceil(time/unit.seconds)*unit.seconds}};Rickshaw.namespace("Rickshaw.Fixtures.Time.Local");Rickshaw.Fixtures.Time.Local=function(){var tzOffset=(new Date).getTimezoneOffset()*60;var self=this;this.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];this.units=[{name:"decade",seconds:86400*365.25*10,formatter:function(d){return parseInt(d.getFullYear()/10,10)*10}},{name:"year",seconds:86400*365.25,formatter:function(d){return d.getFullYear()}},{name:"month",seconds:86400*30.5,formatter:function(d){return self.months[d.getMonth()]}},{name:"week",seconds:86400*7,formatter:function(d){return self.formatDate(d)}},{name:"day",seconds:86400,formatter:function(d){return d.getDate()}},{name:"6 hour",seconds:3600*6,formatter:function(d){return self.formatTime(d)}},{name:"hour",seconds:3600,formatter:function(d){return self.formatTime(d)}},{name:"15 minute",seconds:60*15,formatter:function(d){return self.formatTime(d)}},{name:"minute",seconds:60,formatter:function(d){return d.getMinutes()}},{name:"15 second",seconds:15,formatter:function(d){return d.getSeconds()+"s"}},{name:"second",seconds:1,formatter:function(d){return d.getSeconds()+"s"}}];this.unit=function(unitName){return this.units.filter(function(unit){return unitName==unit.name}).shift()};this.formatDate=function(d){return d3.time.format("%b %e")(d)};this.formatTime=function(d){return d.toString().match(/(\d+:\d+):/)[1]};this.ceil=function(time,unit){var nearFuture;var rounded;if(unit.name=="day"){nearFuture=new Date((time+unit.seconds-1)*1e3);rounded=new Date(0);rounded.setMilliseconds(0);rounded.setSeconds(0);rounded.setMinutes(0);rounded.setHours(0);rounded.setDate(nearFuture.getDate());rounded.setMonth(nearFuture.getMonth());rounded.setFullYear(nearFuture.getFullYear());return rounded.getTime()/1e3}if(unit.name=="month"){nearFuture=new Date((time+unit.seconds-1)*1e3);rounded=new Date(0);rounded.setMilliseconds(0);rounded.setSeconds(0);rounded.setMinutes(0);rounded.setHours(0);rounded.setDate(1);rounded.setMonth(nearFuture.getMonth());rounded.setFullYear(nearFuture.getFullYear());return rounded.getTime()/1e3}if(unit.name=="year"){nearFuture=new Date((time+unit.seconds-1)*1e3);rounded=new Date(0);rounded.setFullYear(nearFuture.getFullYear());rounded.setMilliseconds(0);rounded.setSeconds(0);rounded.setMinutes(0);rounded.setHours(0);rounded.setDate(1);rounded.setMonth(0);return rounded.getTime()/1e3}return Math.ceil(time/unit.seconds)*unit.seconds}};Rickshaw.namespace("Rickshaw.Fixtures.Number");Rickshaw.Fixtures.Number.formatKMBT=function(y){var abs_y=Math.abs(y);if(abs_y>=1e12){return y/1e12+"T"}else if(abs_y>=1e9){return y/1e9+"B"}else if(abs_y>=1e6){return y/1e6+"M"}else if(abs_y>=1e3){return y/1e3+"K"}else if(abs_y<1&&y>0){return y.toFixed(2)}else if(abs_y===0){return""}else{return y}};Rickshaw.Fixtures.Number.formatBase1024KMGTP=function(y){var abs_y=Math.abs(y);if(abs_y>=0x4000000000000){return y/0x4000000000000+"P"}else if(abs_y>=1099511627776){return y/1099511627776+"T"}else if(abs_y>=1073741824){return y/1073741824+"G"}else if(abs_y>=1048576){return y/1048576+"M"}else if(abs_y>=1024){return y/1024+"K"}else if(abs_y<1&&y>0){return y.toFixed(2)}else if(abs_y===0){return""}else{return y}};Rickshaw.namespace("Rickshaw.Color.Palette");Rickshaw.Color.Palette=function(args){var color=new Rickshaw.Fixtures.Color;args=args||{};this.schemes={};this.scheme=color.schemes[args.scheme]||args.scheme||color.schemes.colorwheel;this.runningIndex=0;this.generatorIndex=0;if(args.interpolatedStopCount){var schemeCount=this.scheme.length-1;var i,j,scheme=[];for(i=0;iself.graph.x.range()[1]){if(annotation.element){annotation.line.classList.add("offscreen");annotation.element.style.display="none"}annotation.boxes.forEach(function(box){if(box.rangeElement)box.rangeElement.classList.add("offscreen")});return}if(!annotation.element){var element=annotation.element=document.createElement("div");element.classList.add("annotation");this.elements.timeline.appendChild(element);element.addEventListener("click",function(e){element.classList.toggle("active");annotation.line.classList.toggle("active");annotation.boxes.forEach(function(box){if(box.rangeElement)box.rangeElement.classList.toggle("active")})},false)}annotation.element.style.left=left+"px";annotation.element.style.display="block";annotation.boxes.forEach(function(box){var element=box.element;if(!element){element=box.element=document.createElement("div");element.classList.add("content");element.innerHTML=box.content;annotation.element.appendChild(element);annotation.line=document.createElement("div");annotation.line.classList.add("annotation_line");self.graph.element.appendChild(annotation.line);if(box.end){box.rangeElement=document.createElement("div");box.rangeElement.classList.add("annotation_range");self.graph.element.appendChild(box.rangeElement)}}if(box.end){var annotationRangeStart=left;var annotationRangeEnd=Math.min(self.graph.x(box.end),self.graph.x.range()[1]);if(annotationRangeStart>annotationRangeEnd){annotationRangeEnd=left;annotationRangeStart=Math.max(self.graph.x(box.end),self.graph.x.range()[0])}var annotationRangeWidth=annotationRangeEnd-annotationRangeStart;box.rangeElement.style.left=annotationRangeStart+"px";box.rangeElement.style.width=annotationRangeWidth+"px";box.rangeElement.classList.remove("offscreen")}annotation.line.classList.remove("offscreen");annotation.line.style.left=left+"px"})},this)};this.graph.onUpdate(function(){self.update()})};Rickshaw.namespace("Rickshaw.Graph.Axis.Time");Rickshaw.Graph.Axis.Time=function(args){var self=this;this.graph=args.graph;this.elements=[];this.ticksTreatment=args.ticksTreatment||"plain";this.fixedTimeUnit=args.timeUnit;var time=args.timeFixture||new Rickshaw.Fixtures.Time;this.appropriateTimeUnit=function(){var unit;var units=time.units;var domain=this.graph.x.domain();var rangeSeconds=domain[1]-domain[0];units.forEach(function(u){if(Math.floor(rangeSeconds/u.seconds)>=2){unit=unit||u}});return unit||time.units[time.units.length-1]};this.tickOffsets=function(){var domain=this.graph.x.domain();var unit=this.fixedTimeUnit||this.appropriateTimeUnit();var count=Math.ceil((domain[1]-domain[0])/unit.seconds);var runningTick=domain[0];var offsets=[];for(var i=0;iself.graph.x.range()[1])return;var element=document.createElement("div");element.style.left=self.graph.x(o.value)+"px";element.classList.add("x_tick");element.classList.add(self.ticksTreatment);var title=document.createElement("div");title.classList.add("title");title.innerHTML=o.unit.formatter(new Date(o.value*1e3));element.appendChild(title);self.graph.element.appendChild(element);self.elements.push(element)})};this.graph.onUpdate(function(){self.render()})};Rickshaw.namespace("Rickshaw.Graph.Axis.X");Rickshaw.Graph.Axis.X=function(args){var self=this;var berthRate=.1;this.initialize=function(args){this.graph=args.graph;this.orientation=args.orientation||"top";this.pixelsPerTick=args.pixelsPerTick||75;if(args.ticks)this.staticTicks=args.ticks;if(args.tickValues)this.tickValues=args.tickValues;this.tickSize=args.tickSize||4;this.ticksTreatment=args.ticksTreatment||"plain";if(args.element){this.element=args.element;this._discoverSize(args.element,args);this.vis=d3.select(args.element).append("svg:svg").attr("height",this.height).attr("width",this.width).attr("class","rickshaw_graph x_axis_d3");this.element=this.vis[0][0];this.element.style.position="relative";this.setSize({width:args.width,height:args.height})}else{this.vis=this.graph.vis}this.graph.onUpdate(function(){self.render()})};this.setSize=function(args){args=args||{};if(!this.element)return;this._discoverSize(this.element.parentNode,args);this.vis.attr("height",this.height).attr("width",this.width*(1+berthRate));var berth=Math.floor(this.width*berthRate/2);this.element.style.left=-1*berth+"px"};this.render=function(){if(this.graph.width!==this._renderWidth)this.setSize({auto:true});var axis=d3.svg.axis().scale(this.graph.x).orient(this.orientation);axis.tickFormat(args.tickFormat||function(x){return x});if(this.tickValues)axis.tickValues(this.tickValues);this.ticks=this.staticTicks||Math.floor(this.graph.width/this.pixelsPerTick);var berth=Math.floor(this.width*berthRate/2)||0;var transform;if(this.orientation=="top"){var yOffset=this.height||this.graph.height;transform="translate("+berth+","+yOffset+")"}else{transform="translate("+berth+", 0)"}if(this.element){this.vis.selectAll("*").remove()}this.vis.append("svg:g").attr("class",["x_ticks_d3",this.ticksTreatment].join(" ")).attr("transform",transform).call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));var gridSize=(this.orientation=="bottom"?1:-1)*this.graph.height;this.graph.vis.append("svg:g").attr("class","x_grid_d3").call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize));this._renderHeight=this.graph.height};this._discoverSize=function(element,args){if(typeof window!=="undefined"){var style=window.getComputedStyle(element,null);var elementHeight=parseInt(style.getPropertyValue("height"),10);if(!args.auto){var elementWidth=parseInt(style.getPropertyValue("width"),10)}}this.width=(args.width||elementWidth||this.graph.width)*(1+berthRate);this.height=args.height||elementHeight||40};this.initialize(args)};Rickshaw.namespace("Rickshaw.Graph.Axis.Y");Rickshaw.Graph.Axis.Y=Rickshaw.Class.create({initialize:function(args){this.graph=args.graph;this.orientation=args.orientation||"right";this.pixelsPerTick=args.pixelsPerTick||75;if(args.ticks)this.staticTicks=args.ticks;if(args.tickValues)this.tickValues=args.tickValues;this.tickSize=args.tickSize||4;this.ticksTreatment=args.ticksTreatment||"plain";this.tickFormat=args.tickFormat||function(y){return y};this.berthRate=.1;if(args.element){this.element=args.element;this.vis=d3.select(args.element).append("svg:svg").attr("class","rickshaw_graph y_axis");this.element=this.vis[0][0];this.element.style.position="relative";this.setSize({width:args.width,height:args.height})}else{this.vis=this.graph.vis}var self=this;this.graph.onUpdate(function(){self.render()})},setSize:function(args){args=args||{};if(!this.element)return;if(typeof window!=="undefined"){var style=window.getComputedStyle(this.element.parentNode,null);var elementWidth=parseInt(style.getPropertyValue("width"),10);if(!args.auto){var elementHeight=parseInt(style.getPropertyValue("height"),10)}}this.width=args.width||elementWidth||this.graph.width*this.berthRate;this.height=args.height||elementHeight||this.graph.height;this.vis.attr("width",this.width).attr("height",this.height*(1+this.berthRate));var berth=this.height*this.berthRate;if(this.orientation=="left"){this.element.style.top=-1*berth+"px"}},render:function(){if(this.graph.height!==this._renderHeight)this.setSize({auto:true});this.ticks=this.staticTicks||Math.floor(this.graph.height/this.pixelsPerTick);var axis=this._drawAxis(this.graph.y);this._drawGrid(axis);this._renderHeight=this.graph.height},_drawAxis:function(scale){var axis=d3.svg.axis().scale(scale).orient(this.orientation);axis.tickFormat(this.tickFormat);if(this.tickValues)axis.tickValues(this.tickValues);if(this.orientation=="left"){var berth=this.height*this.berthRate;var transform="translate("+this.width+", "+berth+")"}if(this.element){this.vis.selectAll("*").remove()}this.vis.append("svg:g").attr("class",["y_ticks",this.ticksTreatment].join(" ")).attr("transform",transform).call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));return axis},_drawGrid:function(axis){var gridSize=(this.orientation=="right"?1:-1)*this.graph.width;this.graph.vis.append("svg:g").attr("class","y_grid").call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize))}});Rickshaw.namespace("Rickshaw.Graph.Axis.Y.Scaled");Rickshaw.Graph.Axis.Y.Scaled=Rickshaw.Class.create(Rickshaw.Graph.Axis.Y,{initialize:function($super,args){if(typeof args.scale==="undefined"){throw new Error("Scaled requires scale")}this.scale=args.scale;if(typeof args.grid==="undefined"){this.grid=true}else{this.grid=args.grid}$super(args)},_drawAxis:function($super,scale){var adjustedScale=this.scale.copy().range(scale.range());return $super(adjustedScale)},_drawGrid:function($super,axis){if(this.grid){$super(axis)}}});Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Highlight");Rickshaw.Graph.Behavior.Series.Highlight=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;var colorSafe={};var activeLine=null;var disabledColor=args.disabledColor||function(seriesColor){return d3.interpolateRgb(seriesColor,d3.rgb("#d8d8d8"))(.8).toString()};this.addHighlightEvents=function(l){l.element.addEventListener("mouseover",function(e){if(activeLine)return;else activeLine=l;self.legend.lines.forEach(function(line,index){if(l===line){if(index>0&&self.graph.renderer.unstack&&(line.series.renderer?line.series.renderer.unstack:true)){var seriesIndex=self.graph.series.length-index-1;
2 | line.originalIndex=seriesIndex;var series=self.graph.series.splice(seriesIndex,1)[0];self.graph.series.push(series)}return}colorSafe[line.series.name]=colorSafe[line.series.name]||line.series.color;line.series.color=disabledColor(line.series.color)});self.graph.update()},false);l.element.addEventListener("mouseout",function(e){if(!activeLine)return;else activeLine=null;self.legend.lines.forEach(function(line){if(l===line&&line.hasOwnProperty("originalIndex")){var series=self.graph.series.pop();self.graph.series.splice(line.originalIndex,0,series);delete line.originalIndex}if(colorSafe[line.series.name]){line.series.color=colorSafe[line.series.name]}});self.graph.update()},false)};if(this.legend){this.legend.lines.forEach(function(l){self.addHighlightEvents(l)})}};Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Order");Rickshaw.Graph.Behavior.Series.Order=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;if(typeof window.$=="undefined"){throw"couldn't find jQuery at window.$"}if(typeof window.$.ui=="undefined"){throw"couldn't find jQuery UI at window.$.ui"}$(function(){$(self.legend.list).sortable({containment:"parent",tolerance:"pointer",update:function(event,ui){var series=[];$(self.legend.list).find("li").each(function(index,item){if(!item.series)return;series.push(item.series)});for(var i=self.graph.series.length-1;i>=0;i--){self.graph.series[i]=series.shift()}self.graph.update()}});$(self.legend.list).disableSelection()});this.graph.onUpdate(function(){var h=window.getComputedStyle(self.legend.element).height;self.legend.element.style.height=h})};Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Toggle");Rickshaw.Graph.Behavior.Series.Toggle=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;this.addAnchor=function(line){var anchor=document.createElement("a");anchor.innerHTML="✔";anchor.classList.add("action");line.element.insertBefore(anchor,line.element.firstChild);anchor.onclick=function(e){if(line.series.disabled){line.series.enable();line.element.classList.remove("disabled")}else{if(this.graph.series.filter(function(s){return!s.disabled}).length<=1)return;line.series.disable();line.element.classList.add("disabled")}}.bind(this);var label=line.element.getElementsByTagName("span")[0];label.onclick=function(e){var disableAllOtherLines=line.series.disabled;if(!disableAllOtherLines){for(var i=0;idomainX){dataIndex=Math.abs(domainX-data[i].x)yMax)yMax=y});if(series[0].xxMax)xMax=series[series.length-1].x});xMin-=(xMax-xMin)*this.padding.left;xMax+=(xMax-xMin)*this.padding.right;yMin=this.graph.min==="auto"?yMin:this.graph.min||0;yMax=this.graph.max===undefined?yMax:this.graph.max;if(this.graph.min==="auto"||yMin<0){yMin-=(yMax-yMin)*this.padding.bottom}if(this.graph.max===undefined){yMax+=(yMax-yMin)*this.padding.top}return{x:[xMin,xMax],y:[yMin,yMax]}},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;vis.selectAll("*").remove();var data=series.filter(function(s){return!s.disabled}).map(function(s){return s.stack});var nodes=vis.selectAll("path").data(data).enter().append("svg:path").attr("d",this.seriesPathFactory());var i=0;series.forEach(function(series){if(series.disabled)return;series.path=nodes[0][i++];this._styleSeries(series)},this)},_styleSeries:function(series){var fill=this.fill?series.color:"none";var stroke=this.stroke?series.color:"none";series.path.setAttribute("fill",fill);series.path.setAttribute("stroke",stroke);series.path.setAttribute("stroke-width",this.strokeWidth);series.path.setAttribute("class",series.className)},configure:function(args){args=args||{};Rickshaw.keys(this.defaults()).forEach(function(key){if(!args.hasOwnProperty(key)){this[key]=this[key]||this.graph[key]||this.defaults()[key];return}if(typeof this.defaults()[key]=="object"){Rickshaw.keys(this.defaults()[key]).forEach(function(k){this[key][k]=args[key][k]!==undefined?args[key][k]:this[key][k]!==undefined?this[key][k]:this.defaults()[key][k]},this)}else{this[key]=args[key]!==undefined?args[key]:this[key]!==undefined?this[key]:this.graph[key]!==undefined?this.graph[key]:this.defaults()[key]}},this)},setStrokeWidth:function(strokeWidth){if(strokeWidth!==undefined){this.strokeWidth=strokeWidth}},setTension:function(tension){if(tension!==undefined){this.tension=tension}}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Line");Rickshaw.Graph.Renderer.Line=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"line",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:false,stroke:true})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Stack");Rickshaw.Graph.Renderer.Stack=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"stack",defaults:function($super){return Rickshaw.extend($super(),{fill:true,stroke:false,unstack:false})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.area().x(function(d){return graph.x(d.x)}).y0(function(d){return graph.y(d.y0)}).y1(function(d){return graph.y(d.y+d.y0)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Bar");Rickshaw.Graph.Renderer.Bar=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"bar",defaults:function($super){var defaults=Rickshaw.extend($super(),{gapSize:.05,unstack:false});delete defaults.tension;return defaults},initialize:function($super,args){args=args||{};this.gapSize=args.gapSize||this.gapSize;$super(args)},domain:function($super){var domain=$super();var frequentInterval=this._frequentInterval(this.graph.stackedData.slice(-1).shift());domain.x[1]+=Number(frequentInterval.magnitude);return domain},barWidth:function(series){var frequentInterval=this._frequentInterval(series.stack);var barWidth=this.graph.x(series.stack[0].x+frequentInterval.magnitude*(1-this.gapSize));return barWidth},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;vis.selectAll("*").remove();var barWidth=this.barWidth(series.active()[0]);var barXOffset=0;var activeSeriesCount=series.filter(function(s){return!s.disabled}).length;var seriesBarWidth=this.unstack?barWidth/activeSeriesCount:barWidth;var transform=function(d){var matrix=[1,0,0,d.y<0?-1:1,0,d.y<0?graph.y.magnitude(Math.abs(d.y))*2:0];return"matrix("+matrix.join(",")+")"};series.forEach(function(series){if(series.disabled)return;var barWidth=this.barWidth(series);var nodes=vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:rect").attr("x",function(d){return graph.x(d.x)+barXOffset}).attr("y",function(d){return graph.y(d.y0+Math.abs(d.y))*(d.y<0?-1:1)}).attr("width",seriesBarWidth).attr("height",function(d){return graph.y.magnitude(Math.abs(d.y))}).attr("transform",transform);Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)});if(this.unstack)barXOffset+=seriesBarWidth},this)},_frequentInterval:function(data){var intervalCounts={};for(var i=0;i0){this[0].data.forEach(function(plot){item.data.push({x:plot.x,y:0})})}else if(item.data.length===0){item.data.push({x:this.timeBase-(this.timeInterval||0),y:0})}this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},addData:function(data,x){var index=this.getIndex();Rickshaw.keys(data).forEach(function(name){if(!this.itemByName(name)){this.addItem({name:name})}},this);this.forEach(function(item){item.data.push({x:x||(index*this.timeInterval||1)+this.timeBase,y:data[item.name]||0})},this)},getIndex:function(){return this[0]&&this[0].data&&this[0].data.length?this[0].data.length:0},itemByName:function(name){for(var i=0;i1;i--){this.currentSize+=1;this.currentIndex+=1;this.forEach(function(item){item.data.unshift({x:((i-1)*this.timeInterval||1)+this.timeBase,y:0,i:i})},this)}}},addData:function($super,data,x){$super(data,x);this.currentSize+=1;this.currentIndex+=1;if(this.maxDataPoints!==undefined){while(this.currentSize>this.maxDataPoints){this.dropData()}}},dropData:function(){this.forEach(function(item){item.data.splice(0,1)});this.currentSize-=1},getIndex:function(){return this.currentIndex}});
--------------------------------------------------------------------------------
/assets/stylesheets/application.scss:
--------------------------------------------------------------------------------
1 | /*
2 | //=require_directory .
3 | //=require_tree ../../widgets
4 | */
5 | // ----------------------------------------------------------------------------
6 | // Sass declarations
7 | // ----------------------------------------------------------------------------
8 | $background-color: #FFF;
9 | //$background-color: #224;
10 | $text-color: #fff;
11 |
12 | $background-warning-color-1: #e82711;
13 | $background-warning-color-2: #9b2d23;
14 | $text-warning-color: #fff;
15 |
16 | $background-danger-color-1: #eeae32;
17 | $background-danger-color-2: #ff9618;
18 | $text-danger-color: #fff;
19 |
20 | @-webkit-keyframes status-warning-background {
21 | 0% { background-color: $background-warning-color-1; }
22 | 50% { background-color: $background-warning-color-2; }
23 | 100% { background-color: $background-warning-color-1; }
24 | }
25 | @-webkit-keyframes status-danger-background {
26 | 0% { background-color: $background-danger-color-1; }
27 | 50% { background-color: $background-danger-color-2; }
28 | 100% { background-color: $background-danger-color-1; }
29 | }
30 | @mixin animation($animation-name, $duration, $function, $animation-iteration-count:""){
31 | -webkit-animation: $animation-name $duration $function #{$animation-iteration-count};
32 | -moz-animation: $animation-name $duration $function #{$animation-iteration-count};
33 | -ms-animation: $animation-name $duration $function #{$animation-iteration-count};
34 | }
35 |
36 | // ----------------------------------------------------------------------------
37 | // Base styles
38 | // ----------------------------------------------------------------------------
39 | html {
40 | font-size: 100%;
41 | -webkit-text-size-adjust: 100%;
42 | -ms-text-size-adjust: 100%;
43 | }
44 |
45 | body {
46 | margin: 0;
47 | background-color: $background-color;
48 | font-size: 20px;
49 | color: $text-color;
50 | font-family: 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
51 | }
52 |
53 | b, strong {
54 | font-weight: bold;
55 | }
56 |
57 | a {
58 | text-decoration: none;
59 | color: inherit;
60 | }
61 |
62 | img {
63 | border: 0;
64 | -ms-interpolation-mode: bicubic;
65 | vertical-align: middle;
66 | }
67 |
68 | img, object {
69 | max-width: 100%;
70 | }
71 |
72 | iframe {
73 | max-width: 100%;
74 | }
75 |
76 | table {
77 | border-collapse: collapse;
78 | border-spacing: 0;
79 | width: 100%;
80 | }
81 |
82 | td {
83 | vertical-align: middle;
84 | }
85 |
86 | ul, ol {
87 | padding: 0;
88 | margin: 0;
89 | }
90 |
91 | h1, h2, h3, h4, h5, p {
92 | padding: 0;
93 | margin: 0;
94 | }
95 | h1.title {
96 | margin-bottom: 12px;
97 | text-align: center;
98 | font-size: 30px;
99 | font-weight: 400;
100 | }
101 | h2 {
102 | text-transform: uppercase;
103 | font-size: 76px;
104 | font-weight: 700;
105 | color: $text-color;
106 | }
107 | h3 {
108 | font-size: 25px;
109 | font-weight: 600;
110 | color: $text-color;
111 | }
112 |
113 | // ----------------------------------------------------------------------------
114 | // Base widget styles
115 | // ----------------------------------------------------------------------------
116 | .gridster {
117 | margin: 0px auto;
118 | }
119 |
120 | .icon-background {
121 | width: 100%!important;
122 | height: 100%;
123 | position: absolute;
124 | left: 0;
125 | top: 0;
126 | opacity: 0.1;
127 | font-size: 275px;
128 | text-align: center;
129 | margin-top: 82px;
130 | }
131 |
132 | .list-nostyle {
133 | list-style: none;
134 | }
135 |
136 | .gridster ul {
137 | list-style: none;
138 | }
139 |
140 | .gs_w {
141 | width: 100%;
142 | display: table;
143 | cursor: pointer;
144 | }
145 |
146 | .widget {
147 | padding: 25px 12px;
148 | text-align: center;
149 | width: 100%;
150 | display: table-cell;
151 | vertical-align: middle;
152 | }
153 |
154 | .widget.status-warning {
155 | background-color: $background-warning-color-1;
156 | @include animation(status-warning-background, 2s, ease, infinite);
157 |
158 | .icon-warning-sign {
159 | display: inline-block;
160 | }
161 |
162 | .title, .more-info {
163 | color: $text-warning-color;
164 | }
165 | }
166 |
167 | .widget.status-danger {
168 | color: $text-danger-color;
169 | background-color: $background-danger-color-1;
170 | @include animation(status-danger-background, 2s, ease, infinite);
171 |
172 | .icon-warning-sign {
173 | display: inline-block;
174 | }
175 |
176 | .title, .more-info {
177 | color: $text-danger-color;
178 | }
179 | }
180 |
181 | .more-info {
182 | font-size: 15px;
183 | position: absolute;
184 | bottom: 32px;
185 | left: 0;
186 | right: 0;
187 | }
188 |
189 | .updated-at {
190 | font-size: 15px;
191 | position: absolute;
192 | bottom: 12px;
193 | left: 0;
194 | right: 0;
195 | }
196 |
197 | #save-gridster {
198 | display: none;
199 | position: fixed;
200 | top: 0;
201 | margin: 0px auto;
202 | left: 50%;
203 | z-index: 1000;
204 | background: black;
205 | width: 190px;
206 | text-align: center;
207 | border: 1px solid white;
208 | border-top: 0px;
209 | margin-left: -95px;
210 | padding: 15px;
211 | }
212 |
213 | #save-gridster:hover {
214 | padding-top: 25px;
215 | }
216 |
217 | #saving-instructions {
218 | display: none;
219 | padding: 10px;
220 | width: 500px;
221 | height: 122px;
222 | z-index: 1000;
223 | background: white;
224 | top: 100px;
225 | color: black;
226 | font-size: 15px;
227 | padding-bottom: 4px;
228 |
229 | textarea {
230 | white-space: nowrap;
231 | width: 494px;
232 | height: 80px;
233 | }
234 | }
235 |
236 | #lean_overlay {
237 | position: fixed;
238 | z-index:100;
239 | top: 0px;
240 | left: 0px;
241 | height:100%;
242 | width:100%;
243 | background: #000;
244 | display: none;
245 | }
246 |
247 | #container {
248 | //padding-top: 5px;
249 | }
250 |
251 |
252 | // ----------------------------------------------------------------------------
253 | // Clearfix
254 | // ----------------------------------------------------------------------------
255 | .clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
256 | .clearfix:after { clear: both; }
257 | .clearfix { zoom: 1; }
258 |
259 |
--------------------------------------------------------------------------------
/assets/stylesheets/font-awesome.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 | /* FONT PATH
6 | * -------------------------- */
7 | @font-face {
8 | font-family: 'FontAwesome';
9 | src: url('../assets/fontawesome-webfont.eot?v=4.5.0');
10 | src: url('../assets/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../assets/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../assets/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../assets/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../assets/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');
11 | font-weight: normal;
12 | font-style: normal;
13 | }
14 | .fa {
15 | display: inline-block;
16 | font: normal normal normal 14px/1 FontAwesome;
17 | font-size: inherit;
18 | text-rendering: auto;
19 | -webkit-font-smoothing: antialiased;
20 | -moz-osx-font-smoothing: grayscale;
21 | }
22 | /* makes the font 33% larger relative to the icon container */
23 | .fa-lg {
24 | font-size: 1.33333333em;
25 | line-height: 0.75em;
26 | vertical-align: -15%;
27 | }
28 | .fa-2x {
29 | font-size: 2em;
30 | }
31 | .fa-3x {
32 | font-size: 3em;
33 | }
34 | .fa-4x {
35 | font-size: 4em;
36 | }
37 | .fa-5x {
38 | font-size: 5em;
39 | }
40 | .fa-fw {
41 | width: 1.28571429em;
42 | text-align: center;
43 | }
44 | .fa-ul {
45 | padding-left: 0;
46 | margin-left: 2.14285714em;
47 | list-style-type: none;
48 | }
49 | .fa-ul > li {
50 | position: relative;
51 | }
52 | .fa-li {
53 | position: absolute;
54 | left: -2.14285714em;
55 | width: 2.14285714em;
56 | top: 0.14285714em;
57 | text-align: center;
58 | }
59 | .fa-li.fa-lg {
60 | left: -1.85714286em;
61 | }
62 | .fa-border {
63 | padding: .2em .25em .15em;
64 | border: solid 0.08em #eeeeee;
65 | border-radius: .1em;
66 | }
67 | .fa-pull-left {
68 | float: left;
69 | }
70 | .fa-pull-right {
71 | float: right;
72 | }
73 | .fa.fa-pull-left {
74 | margin-right: .3em;
75 | }
76 | .fa.fa-pull-right {
77 | margin-left: .3em;
78 | }
79 | /* Deprecated as of 4.4.0 */
80 | .pull-right {
81 | float: right;
82 | }
83 | .pull-left {
84 | float: left;
85 | }
86 | .fa.pull-left {
87 | margin-right: .3em;
88 | }
89 | .fa.pull-right {
90 | margin-left: .3em;
91 | }
92 | .fa-spin {
93 | -webkit-animation: fa-spin 2s infinite linear;
94 | animation: fa-spin 2s infinite linear;
95 | }
96 | .fa-pulse {
97 | -webkit-animation: fa-spin 1s infinite steps(8);
98 | animation: fa-spin 1s infinite steps(8);
99 | }
100 | @-webkit-keyframes fa-spin {
101 | 0% {
102 | -webkit-transform: rotate(0deg);
103 | transform: rotate(0deg);
104 | }
105 | 100% {
106 | -webkit-transform: rotate(359deg);
107 | transform: rotate(359deg);
108 | }
109 | }
110 | @keyframes fa-spin {
111 | 0% {
112 | -webkit-transform: rotate(0deg);
113 | transform: rotate(0deg);
114 | }
115 | 100% {
116 | -webkit-transform: rotate(359deg);
117 | transform: rotate(359deg);
118 | }
119 | }
120 | .fa-rotate-90 {
121 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
122 | -webkit-transform: rotate(90deg);
123 | -ms-transform: rotate(90deg);
124 | transform: rotate(90deg);
125 | }
126 | .fa-rotate-180 {
127 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
128 | -webkit-transform: rotate(180deg);
129 | -ms-transform: rotate(180deg);
130 | transform: rotate(180deg);
131 | }
132 | .fa-rotate-270 {
133 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
134 | -webkit-transform: rotate(270deg);
135 | -ms-transform: rotate(270deg);
136 | transform: rotate(270deg);
137 | }
138 | .fa-flip-horizontal {
139 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
140 | -webkit-transform: scale(-1, 1);
141 | -ms-transform: scale(-1, 1);
142 | transform: scale(-1, 1);
143 | }
144 | .fa-flip-vertical {
145 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
146 | -webkit-transform: scale(1, -1);
147 | -ms-transform: scale(1, -1);
148 | transform: scale(1, -1);
149 | }
150 | :root .fa-rotate-90,
151 | :root .fa-rotate-180,
152 | :root .fa-rotate-270,
153 | :root .fa-flip-horizontal,
154 | :root .fa-flip-vertical {
155 | filter: none;
156 | }
157 | .fa-stack {
158 | position: relative;
159 | display: inline-block;
160 | width: 2em;
161 | height: 2em;
162 | line-height: 2em;
163 | vertical-align: middle;
164 | }
165 | .fa-stack-1x,
166 | .fa-stack-2x {
167 | position: absolute;
168 | left: 0;
169 | width: 100%;
170 | text-align: center;
171 | }
172 | .fa-stack-1x {
173 | line-height: inherit;
174 | }
175 | .fa-stack-2x {
176 | font-size: 2em;
177 | }
178 | .fa-inverse {
179 | color: #ffffff;
180 | }
181 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
182 | readers do not read off random characters that represent icons */
183 | .fa-glass:before {
184 | content: "\f000";
185 | }
186 | .fa-music:before {
187 | content: "\f001";
188 | }
189 | .fa-search:before {
190 | content: "\f002";
191 | }
192 | .fa-envelope-o:before {
193 | content: "\f003";
194 | }
195 | .fa-heart:before {
196 | content: "\f004";
197 | }
198 | .fa-star:before {
199 | content: "\f005";
200 | }
201 | .fa-star-o:before {
202 | content: "\f006";
203 | }
204 | .fa-user:before {
205 | content: "\f007";
206 | }
207 | .fa-film:before {
208 | content: "\f008";
209 | }
210 | .fa-th-large:before {
211 | content: "\f009";
212 | }
213 | .fa-th:before {
214 | content: "\f00a";
215 | }
216 | .fa-th-list:before {
217 | content: "\f00b";
218 | }
219 | .fa-check:before {
220 | content: "\f00c";
221 | }
222 | .fa-remove:before,
223 | .fa-close:before,
224 | .fa-times:before {
225 | content: "\f00d";
226 | }
227 | .fa-search-plus:before {
228 | content: "\f00e";
229 | }
230 | .fa-search-minus:before {
231 | content: "\f010";
232 | }
233 | .fa-power-off:before {
234 | content: "\f011";
235 | }
236 | .fa-signal:before {
237 | content: "\f012";
238 | }
239 | .fa-gear:before,
240 | .fa-cog:before {
241 | content: "\f013";
242 | }
243 | .fa-trash-o:before {
244 | content: "\f014";
245 | }
246 | .fa-home:before {
247 | content: "\f015";
248 | }
249 | .fa-file-o:before {
250 | content: "\f016";
251 | }
252 | .fa-clock-o:before {
253 | content: "\f017";
254 | }
255 | .fa-road:before {
256 | content: "\f018";
257 | }
258 | .fa-download:before {
259 | content: "\f019";
260 | }
261 | .fa-arrow-circle-o-down:before {
262 | content: "\f01a";
263 | }
264 | .fa-arrow-circle-o-up:before {
265 | content: "\f01b";
266 | }
267 | .fa-inbox:before {
268 | content: "\f01c";
269 | }
270 | .fa-play-circle-o:before {
271 | content: "\f01d";
272 | }
273 | .fa-rotate-right:before,
274 | .fa-repeat:before {
275 | content: "\f01e";
276 | }
277 | .fa-refresh:before {
278 | content: "\f021";
279 | }
280 | .fa-list-alt:before {
281 | content: "\f022";
282 | }
283 | .fa-lock:before {
284 | content: "\f023";
285 | }
286 | .fa-flag:before {
287 | content: "\f024";
288 | }
289 | .fa-headphones:before {
290 | content: "\f025";
291 | }
292 | .fa-volume-off:before {
293 | content: "\f026";
294 | }
295 | .fa-volume-down:before {
296 | content: "\f027";
297 | }
298 | .fa-volume-up:before {
299 | content: "\f028";
300 | }
301 | .fa-qrcode:before {
302 | content: "\f029";
303 | }
304 | .fa-barcode:before {
305 | content: "\f02a";
306 | }
307 | .fa-tag:before {
308 | content: "\f02b";
309 | }
310 | .fa-tags:before {
311 | content: "\f02c";
312 | }
313 | .fa-book:before {
314 | content: "\f02d";
315 | }
316 | .fa-bookmark:before {
317 | content: "\f02e";
318 | }
319 | .fa-print:before {
320 | content: "\f02f";
321 | }
322 | .fa-camera:before {
323 | content: "\f030";
324 | }
325 | .fa-font:before {
326 | content: "\f031";
327 | }
328 | .fa-bold:before {
329 | content: "\f032";
330 | }
331 | .fa-italic:before {
332 | content: "\f033";
333 | }
334 | .fa-text-height:before {
335 | content: "\f034";
336 | }
337 | .fa-text-width:before {
338 | content: "\f035";
339 | }
340 | .fa-align-left:before {
341 | content: "\f036";
342 | }
343 | .fa-align-center:before {
344 | content: "\f037";
345 | }
346 | .fa-align-right:before {
347 | content: "\f038";
348 | }
349 | .fa-align-justify:before {
350 | content: "\f039";
351 | }
352 | .fa-list:before {
353 | content: "\f03a";
354 | }
355 | .fa-dedent:before,
356 | .fa-outdent:before {
357 | content: "\f03b";
358 | }
359 | .fa-indent:before {
360 | content: "\f03c";
361 | }
362 | .fa-video-camera:before {
363 | content: "\f03d";
364 | }
365 | .fa-photo:before,
366 | .fa-image:before,
367 | .fa-picture-o:before {
368 | content: "\f03e";
369 | }
370 | .fa-pencil:before {
371 | content: "\f040";
372 | }
373 | .fa-map-marker:before {
374 | content: "\f041";
375 | }
376 | .fa-adjust:before {
377 | content: "\f042";
378 | }
379 | .fa-tint:before {
380 | content: "\f043";
381 | }
382 | .fa-edit:before,
383 | .fa-pencil-square-o:before {
384 | content: "\f044";
385 | }
386 | .fa-share-square-o:before {
387 | content: "\f045";
388 | }
389 | .fa-check-square-o:before {
390 | content: "\f046";
391 | }
392 | .fa-arrows:before {
393 | content: "\f047";
394 | }
395 | .fa-step-backward:before {
396 | content: "\f048";
397 | }
398 | .fa-fast-backward:before {
399 | content: "\f049";
400 | }
401 | .fa-backward:before {
402 | content: "\f04a";
403 | }
404 | .fa-play:before {
405 | content: "\f04b";
406 | }
407 | .fa-pause:before {
408 | content: "\f04c";
409 | }
410 | .fa-stop:before {
411 | content: "\f04d";
412 | }
413 | .fa-forward:before {
414 | content: "\f04e";
415 | }
416 | .fa-fast-forward:before {
417 | content: "\f050";
418 | }
419 | .fa-step-forward:before {
420 | content: "\f051";
421 | }
422 | .fa-eject:before {
423 | content: "\f052";
424 | }
425 | .fa-chevron-left:before {
426 | content: "\f053";
427 | }
428 | .fa-chevron-right:before {
429 | content: "\f054";
430 | }
431 | .fa-plus-circle:before {
432 | content: "\f055";
433 | }
434 | .fa-minus-circle:before {
435 | content: "\f056";
436 | }
437 | .fa-times-circle:before {
438 | content: "\f057";
439 | }
440 | .fa-check-circle:before {
441 | content: "\f058";
442 | }
443 | .fa-question-circle:before {
444 | content: "\f059";
445 | }
446 | .fa-info-circle:before {
447 | content: "\f05a";
448 | }
449 | .fa-crosshairs:before {
450 | content: "\f05b";
451 | }
452 | .fa-times-circle-o:before {
453 | content: "\f05c";
454 | }
455 | .fa-check-circle-o:before {
456 | content: "\f05d";
457 | }
458 | .fa-ban:before {
459 | content: "\f05e";
460 | }
461 | .fa-arrow-left:before {
462 | content: "\f060";
463 | }
464 | .fa-arrow-right:before {
465 | content: "\f061";
466 | }
467 | .fa-arrow-up:before {
468 | content: "\f062";
469 | }
470 | .fa-arrow-down:before {
471 | content: "\f063";
472 | }
473 | .fa-mail-forward:before,
474 | .fa-share:before {
475 | content: "\f064";
476 | }
477 | .fa-expand:before {
478 | content: "\f065";
479 | }
480 | .fa-compress:before {
481 | content: "\f066";
482 | }
483 | .fa-plus:before {
484 | content: "\f067";
485 | }
486 | .fa-minus:before {
487 | content: "\f068";
488 | }
489 | .fa-asterisk:before {
490 | content: "\f069";
491 | }
492 | .fa-exclamation-circle:before {
493 | content: "\f06a";
494 | }
495 | .fa-gift:before {
496 | content: "\f06b";
497 | }
498 | .fa-leaf:before {
499 | content: "\f06c";
500 | }
501 | .fa-fire:before {
502 | content: "\f06d";
503 | }
504 | .fa-eye:before {
505 | content: "\f06e";
506 | }
507 | .fa-eye-slash:before {
508 | content: "\f070";
509 | }
510 | .fa-warning:before,
511 | .fa-exclamation-triangle:before {
512 | content: "\f071";
513 | }
514 | .fa-plane:before {
515 | content: "\f072";
516 | }
517 | .fa-calendar:before {
518 | content: "\f073";
519 | }
520 | .fa-random:before {
521 | content: "\f074";
522 | }
523 | .fa-comment:before {
524 | content: "\f075";
525 | }
526 | .fa-magnet:before {
527 | content: "\f076";
528 | }
529 | .fa-chevron-up:before {
530 | content: "\f077";
531 | }
532 | .fa-chevron-down:before {
533 | content: "\f078";
534 | }
535 | .fa-retweet:before {
536 | content: "\f079";
537 | }
538 | .fa-shopping-cart:before {
539 | content: "\f07a";
540 | }
541 | .fa-folder:before {
542 | content: "\f07b";
543 | }
544 | .fa-folder-open:before {
545 | content: "\f07c";
546 | }
547 | .fa-arrows-v:before {
548 | content: "\f07d";
549 | }
550 | .fa-arrows-h:before {
551 | content: "\f07e";
552 | }
553 | .fa-bar-chart-o:before,
554 | .fa-bar-chart:before {
555 | content: "\f080";
556 | }
557 | .fa-twitter-square:before {
558 | content: "\f081";
559 | }
560 | .fa-facebook-square:before {
561 | content: "\f082";
562 | }
563 | .fa-camera-retro:before {
564 | content: "\f083";
565 | }
566 | .fa-key:before {
567 | content: "\f084";
568 | }
569 | .fa-gears:before,
570 | .fa-cogs:before {
571 | content: "\f085";
572 | }
573 | .fa-comments:before {
574 | content: "\f086";
575 | }
576 | .fa-thumbs-o-up:before {
577 | content: "\f087";
578 | }
579 | .fa-thumbs-o-down:before {
580 | content: "\f088";
581 | }
582 | .fa-star-half:before {
583 | content: "\f089";
584 | }
585 | .fa-heart-o:before {
586 | content: "\f08a";
587 | }
588 | .fa-sign-out:before {
589 | content: "\f08b";
590 | }
591 | .fa-linkedin-square:before {
592 | content: "\f08c";
593 | }
594 | .fa-thumb-tack:before {
595 | content: "\f08d";
596 | }
597 | .fa-external-link:before {
598 | content: "\f08e";
599 | }
600 | .fa-sign-in:before {
601 | content: "\f090";
602 | }
603 | .fa-trophy:before {
604 | content: "\f091";
605 | }
606 | .fa-github-square:before {
607 | content: "\f092";
608 | }
609 | .fa-upload:before {
610 | content: "\f093";
611 | }
612 | .fa-lemon-o:before {
613 | content: "\f094";
614 | }
615 | .fa-phone:before {
616 | content: "\f095";
617 | }
618 | .fa-square-o:before {
619 | content: "\f096";
620 | }
621 | .fa-bookmark-o:before {
622 | content: "\f097";
623 | }
624 | .fa-phone-square:before {
625 | content: "\f098";
626 | }
627 | .fa-twitter:before {
628 | content: "\f099";
629 | }
630 | .fa-facebook-f:before,
631 | .fa-facebook:before {
632 | content: "\f09a";
633 | }
634 | .fa-github:before {
635 | content: "\f09b";
636 | }
637 | .fa-unlock:before {
638 | content: "\f09c";
639 | }
640 | .fa-credit-card:before {
641 | content: "\f09d";
642 | }
643 | .fa-feed:before,
644 | .fa-rss:before {
645 | content: "\f09e";
646 | }
647 | .fa-hdd-o:before {
648 | content: "\f0a0";
649 | }
650 | .fa-bullhorn:before {
651 | content: "\f0a1";
652 | }
653 | .fa-bell:before {
654 | content: "\f0f3";
655 | }
656 | .fa-certificate:before {
657 | content: "\f0a3";
658 | }
659 | .fa-hand-o-right:before {
660 | content: "\f0a4";
661 | }
662 | .fa-hand-o-left:before {
663 | content: "\f0a5";
664 | }
665 | .fa-hand-o-up:before {
666 | content: "\f0a6";
667 | }
668 | .fa-hand-o-down:before {
669 | content: "\f0a7";
670 | }
671 | .fa-arrow-circle-left:before {
672 | content: "\f0a8";
673 | }
674 | .fa-arrow-circle-right:before {
675 | content: "\f0a9";
676 | }
677 | .fa-arrow-circle-up:before {
678 | content: "\f0aa";
679 | }
680 | .fa-arrow-circle-down:before {
681 | content: "\f0ab";
682 | }
683 | .fa-globe:before {
684 | content: "\f0ac";
685 | }
686 | .fa-wrench:before {
687 | content: "\f0ad";
688 | }
689 | .fa-tasks:before {
690 | content: "\f0ae";
691 | }
692 | .fa-filter:before {
693 | content: "\f0b0";
694 | }
695 | .fa-briefcase:before {
696 | content: "\f0b1";
697 | }
698 | .fa-arrows-alt:before {
699 | content: "\f0b2";
700 | }
701 | .fa-group:before,
702 | .fa-users:before {
703 | content: "\f0c0";
704 | }
705 | .fa-chain:before,
706 | .fa-link:before {
707 | content: "\f0c1";
708 | }
709 | .fa-cloud:before {
710 | content: "\f0c2";
711 | }
712 | .fa-flask:before {
713 | content: "\f0c3";
714 | }
715 | .fa-cut:before,
716 | .fa-scissors:before {
717 | content: "\f0c4";
718 | }
719 | .fa-copy:before,
720 | .fa-files-o:before {
721 | content: "\f0c5";
722 | }
723 | .fa-paperclip:before {
724 | content: "\f0c6";
725 | }
726 | .fa-save:before,
727 | .fa-floppy-o:before {
728 | content: "\f0c7";
729 | }
730 | .fa-square:before {
731 | content: "\f0c8";
732 | }
733 | .fa-navicon:before,
734 | .fa-reorder:before,
735 | .fa-bars:before {
736 | content: "\f0c9";
737 | }
738 | .fa-list-ul:before {
739 | content: "\f0ca";
740 | }
741 | .fa-list-ol:before {
742 | content: "\f0cb";
743 | }
744 | .fa-strikethrough:before {
745 | content: "\f0cc";
746 | }
747 | .fa-underline:before {
748 | content: "\f0cd";
749 | }
750 | .fa-table:before {
751 | content: "\f0ce";
752 | }
753 | .fa-magic:before {
754 | content: "\f0d0";
755 | }
756 | .fa-truck:before {
757 | content: "\f0d1";
758 | }
759 | .fa-pinterest:before {
760 | content: "\f0d2";
761 | }
762 | .fa-pinterest-square:before {
763 | content: "\f0d3";
764 | }
765 | .fa-google-plus-square:before {
766 | content: "\f0d4";
767 | }
768 | .fa-google-plus:before {
769 | content: "\f0d5";
770 | }
771 | .fa-money:before {
772 | content: "\f0d6";
773 | }
774 | .fa-caret-down:before {
775 | content: "\f0d7";
776 | }
777 | .fa-caret-up:before {
778 | content: "\f0d8";
779 | }
780 | .fa-caret-left:before {
781 | content: "\f0d9";
782 | }
783 | .fa-caret-right:before {
784 | content: "\f0da";
785 | }
786 | .fa-columns:before {
787 | content: "\f0db";
788 | }
789 | .fa-unsorted:before,
790 | .fa-sort:before {
791 | content: "\f0dc";
792 | }
793 | .fa-sort-down:before,
794 | .fa-sort-desc:before {
795 | content: "\f0dd";
796 | }
797 | .fa-sort-up:before,
798 | .fa-sort-asc:before {
799 | content: "\f0de";
800 | }
801 | .fa-envelope:before {
802 | content: "\f0e0";
803 | }
804 | .fa-linkedin:before {
805 | content: "\f0e1";
806 | }
807 | .fa-rotate-left:before,
808 | .fa-undo:before {
809 | content: "\f0e2";
810 | }
811 | .fa-legal:before,
812 | .fa-gavel:before {
813 | content: "\f0e3";
814 | }
815 | .fa-dashboard:before,
816 | .fa-tachometer:before {
817 | content: "\f0e4";
818 | }
819 | .fa-comment-o:before {
820 | content: "\f0e5";
821 | }
822 | .fa-comments-o:before {
823 | content: "\f0e6";
824 | }
825 | .fa-flash:before,
826 | .fa-bolt:before {
827 | content: "\f0e7";
828 | }
829 | .fa-sitemap:before {
830 | content: "\f0e8";
831 | }
832 | .fa-umbrella:before {
833 | content: "\f0e9";
834 | }
835 | .fa-paste:before,
836 | .fa-clipboard:before {
837 | content: "\f0ea";
838 | }
839 | .fa-lightbulb-o:before {
840 | content: "\f0eb";
841 | }
842 | .fa-exchange:before {
843 | content: "\f0ec";
844 | }
845 | .fa-cloud-download:before {
846 | content: "\f0ed";
847 | }
848 | .fa-cloud-upload:before {
849 | content: "\f0ee";
850 | }
851 | .fa-user-md:before {
852 | content: "\f0f0";
853 | }
854 | .fa-stethoscope:before {
855 | content: "\f0f1";
856 | }
857 | .fa-suitcase:before {
858 | content: "\f0f2";
859 | }
860 | .fa-bell-o:before {
861 | content: "\f0a2";
862 | }
863 | .fa-coffee:before {
864 | content: "\f0f4";
865 | }
866 | .fa-cutlery:before {
867 | content: "\f0f5";
868 | }
869 | .fa-file-text-o:before {
870 | content: "\f0f6";
871 | }
872 | .fa-building-o:before {
873 | content: "\f0f7";
874 | }
875 | .fa-hospital-o:before {
876 | content: "\f0f8";
877 | }
878 | .fa-ambulance:before {
879 | content: "\f0f9";
880 | }
881 | .fa-medkit:before {
882 | content: "\f0fa";
883 | }
884 | .fa-fighter-jet:before {
885 | content: "\f0fb";
886 | }
887 | .fa-beer:before {
888 | content: "\f0fc";
889 | }
890 | .fa-h-square:before {
891 | content: "\f0fd";
892 | }
893 | .fa-plus-square:before {
894 | content: "\f0fe";
895 | }
896 | .fa-angle-double-left:before {
897 | content: "\f100";
898 | }
899 | .fa-angle-double-right:before {
900 | content: "\f101";
901 | }
902 | .fa-angle-double-up:before {
903 | content: "\f102";
904 | }
905 | .fa-angle-double-down:before {
906 | content: "\f103";
907 | }
908 | .fa-angle-left:before {
909 | content: "\f104";
910 | }
911 | .fa-angle-right:before {
912 | content: "\f105";
913 | }
914 | .fa-angle-up:before {
915 | content: "\f106";
916 | }
917 | .fa-angle-down:before {
918 | content: "\f107";
919 | }
920 | .fa-desktop:before {
921 | content: "\f108";
922 | }
923 | .fa-laptop:before {
924 | content: "\f109";
925 | }
926 | .fa-tablet:before {
927 | content: "\f10a";
928 | }
929 | .fa-mobile-phone:before,
930 | .fa-mobile:before {
931 | content: "\f10b";
932 | }
933 | .fa-circle-o:before {
934 | content: "\f10c";
935 | }
936 | .fa-quote-left:before {
937 | content: "\f10d";
938 | }
939 | .fa-quote-right:before {
940 | content: "\f10e";
941 | }
942 | .fa-spinner:before {
943 | content: "\f110";
944 | }
945 | .fa-circle:before {
946 | content: "\f111";
947 | }
948 | .fa-mail-reply:before,
949 | .fa-reply:before {
950 | content: "\f112";
951 | }
952 | .fa-github-alt:before {
953 | content: "\f113";
954 | }
955 | .fa-folder-o:before {
956 | content: "\f114";
957 | }
958 | .fa-folder-open-o:before {
959 | content: "\f115";
960 | }
961 | .fa-smile-o:before {
962 | content: "\f118";
963 | }
964 | .fa-frown-o:before {
965 | content: "\f119";
966 | }
967 | .fa-meh-o:before {
968 | content: "\f11a";
969 | }
970 | .fa-gamepad:before {
971 | content: "\f11b";
972 | }
973 | .fa-keyboard-o:before {
974 | content: "\f11c";
975 | }
976 | .fa-flag-o:before {
977 | content: "\f11d";
978 | }
979 | .fa-flag-checkered:before {
980 | content: "\f11e";
981 | }
982 | .fa-terminal:before {
983 | content: "\f120";
984 | }
985 | .fa-code:before {
986 | content: "\f121";
987 | }
988 | .fa-mail-reply-all:before,
989 | .fa-reply-all:before {
990 | content: "\f122";
991 | }
992 | .fa-star-half-empty:before,
993 | .fa-star-half-full:before,
994 | .fa-star-half-o:before {
995 | content: "\f123";
996 | }
997 | .fa-location-arrow:before {
998 | content: "\f124";
999 | }
1000 | .fa-crop:before {
1001 | content: "\f125";
1002 | }
1003 | .fa-code-fork:before {
1004 | content: "\f126";
1005 | }
1006 | .fa-unlink:before,
1007 | .fa-chain-broken:before {
1008 | content: "\f127";
1009 | }
1010 | .fa-question:before {
1011 | content: "\f128";
1012 | }
1013 | .fa-info:before {
1014 | content: "\f129";
1015 | }
1016 | .fa-exclamation:before {
1017 | content: "\f12a";
1018 | }
1019 | .fa-superscript:before {
1020 | content: "\f12b";
1021 | }
1022 | .fa-subscript:before {
1023 | content: "\f12c";
1024 | }
1025 | .fa-eraser:before {
1026 | content: "\f12d";
1027 | }
1028 | .fa-puzzle-piece:before {
1029 | content: "\f12e";
1030 | }
1031 | .fa-microphone:before {
1032 | content: "\f130";
1033 | }
1034 | .fa-microphone-slash:before {
1035 | content: "\f131";
1036 | }
1037 | .fa-shield:before {
1038 | content: "\f132";
1039 | }
1040 | .fa-calendar-o:before {
1041 | content: "\f133";
1042 | }
1043 | .fa-fire-extinguisher:before {
1044 | content: "\f134";
1045 | }
1046 | .fa-rocket:before {
1047 | content: "\f135";
1048 | }
1049 | .fa-maxcdn:before {
1050 | content: "\f136";
1051 | }
1052 | .fa-chevron-circle-left:before {
1053 | content: "\f137";
1054 | }
1055 | .fa-chevron-circle-right:before {
1056 | content: "\f138";
1057 | }
1058 | .fa-chevron-circle-up:before {
1059 | content: "\f139";
1060 | }
1061 | .fa-chevron-circle-down:before {
1062 | content: "\f13a";
1063 | }
1064 | .fa-html5:before {
1065 | content: "\f13b";
1066 | }
1067 | .fa-css3:before {
1068 | content: "\f13c";
1069 | }
1070 | .fa-anchor:before {
1071 | content: "\f13d";
1072 | }
1073 | .fa-unlock-alt:before {
1074 | content: "\f13e";
1075 | }
1076 | .fa-bullseye:before {
1077 | content: "\f140";
1078 | }
1079 | .fa-ellipsis-h:before {
1080 | content: "\f141";
1081 | }
1082 | .fa-ellipsis-v:before {
1083 | content: "\f142";
1084 | }
1085 | .fa-rss-square:before {
1086 | content: "\f143";
1087 | }
1088 | .fa-play-circle:before {
1089 | content: "\f144";
1090 | }
1091 | .fa-ticket:before {
1092 | content: "\f145";
1093 | }
1094 | .fa-minus-square:before {
1095 | content: "\f146";
1096 | }
1097 | .fa-minus-square-o:before {
1098 | content: "\f147";
1099 | }
1100 | .fa-level-up:before {
1101 | content: "\f148";
1102 | }
1103 | .fa-level-down:before {
1104 | content: "\f149";
1105 | }
1106 | .fa-check-square:before {
1107 | content: "\f14a";
1108 | }
1109 | .fa-pencil-square:before {
1110 | content: "\f14b";
1111 | }
1112 | .fa-external-link-square:before {
1113 | content: "\f14c";
1114 | }
1115 | .fa-share-square:before {
1116 | content: "\f14d";
1117 | }
1118 | .fa-compass:before {
1119 | content: "\f14e";
1120 | }
1121 | .fa-toggle-down:before,
1122 | .fa-caret-square-o-down:before {
1123 | content: "\f150";
1124 | }
1125 | .fa-toggle-up:before,
1126 | .fa-caret-square-o-up:before {
1127 | content: "\f151";
1128 | }
1129 | .fa-toggle-right:before,
1130 | .fa-caret-square-o-right:before {
1131 | content: "\f152";
1132 | }
1133 | .fa-euro:before,
1134 | .fa-eur:before {
1135 | content: "\f153";
1136 | }
1137 | .fa-gbp:before {
1138 | content: "\f154";
1139 | }
1140 | .fa-dollar:before,
1141 | .fa-usd:before {
1142 | content: "\f155";
1143 | }
1144 | .fa-rupee:before,
1145 | .fa-inr:before {
1146 | content: "\f156";
1147 | }
1148 | .fa-cny:before,
1149 | .fa-rmb:before,
1150 | .fa-yen:before,
1151 | .fa-jpy:before {
1152 | content: "\f157";
1153 | }
1154 | .fa-ruble:before,
1155 | .fa-rouble:before,
1156 | .fa-rub:before {
1157 | content: "\f158";
1158 | }
1159 | .fa-won:before,
1160 | .fa-krw:before {
1161 | content: "\f159";
1162 | }
1163 | .fa-bitcoin:before,
1164 | .fa-btc:before {
1165 | content: "\f15a";
1166 | }
1167 | .fa-file:before {
1168 | content: "\f15b";
1169 | }
1170 | .fa-file-text:before {
1171 | content: "\f15c";
1172 | }
1173 | .fa-sort-alpha-asc:before {
1174 | content: "\f15d";
1175 | }
1176 | .fa-sort-alpha-desc:before {
1177 | content: "\f15e";
1178 | }
1179 | .fa-sort-amount-asc:before {
1180 | content: "\f160";
1181 | }
1182 | .fa-sort-amount-desc:before {
1183 | content: "\f161";
1184 | }
1185 | .fa-sort-numeric-asc:before {
1186 | content: "\f162";
1187 | }
1188 | .fa-sort-numeric-desc:before {
1189 | content: "\f163";
1190 | }
1191 | .fa-thumbs-up:before {
1192 | content: "\f164";
1193 | }
1194 | .fa-thumbs-down:before {
1195 | content: "\f165";
1196 | }
1197 | .fa-youtube-square:before {
1198 | content: "\f166";
1199 | }
1200 | .fa-youtube:before {
1201 | content: "\f167";
1202 | }
1203 | .fa-xing:before {
1204 | content: "\f168";
1205 | }
1206 | .fa-xing-square:before {
1207 | content: "\f169";
1208 | }
1209 | .fa-youtube-play:before {
1210 | content: "\f16a";
1211 | }
1212 | .fa-dropbox:before {
1213 | content: "\f16b";
1214 | }
1215 | .fa-stack-overflow:before {
1216 | content: "\f16c";
1217 | }
1218 | .fa-instagram:before {
1219 | content: "\f16d";
1220 | }
1221 | .fa-flickr:before {
1222 | content: "\f16e";
1223 | }
1224 | .fa-adn:before {
1225 | content: "\f170";
1226 | }
1227 | .fa-bitbucket:before {
1228 | content: "\f171";
1229 | }
1230 | .fa-bitbucket-square:before {
1231 | content: "\f172";
1232 | }
1233 | .fa-tumblr:before {
1234 | content: "\f173";
1235 | }
1236 | .fa-tumblr-square:before {
1237 | content: "\f174";
1238 | }
1239 | .fa-long-arrow-down:before {
1240 | content: "\f175";
1241 | }
1242 | .fa-long-arrow-up:before {
1243 | content: "\f176";
1244 | }
1245 | .fa-long-arrow-left:before {
1246 | content: "\f177";
1247 | }
1248 | .fa-long-arrow-right:before {
1249 | content: "\f178";
1250 | }
1251 | .fa-apple:before {
1252 | content: "\f179";
1253 | }
1254 | .fa-windows:before {
1255 | content: "\f17a";
1256 | }
1257 | .fa-android:before {
1258 | content: "\f17b";
1259 | }
1260 | .fa-linux:before {
1261 | content: "\f17c";
1262 | }
1263 | .fa-dribbble:before {
1264 | content: "\f17d";
1265 | }
1266 | .fa-skype:before {
1267 | content: "\f17e";
1268 | }
1269 | .fa-foursquare:before {
1270 | content: "\f180";
1271 | }
1272 | .fa-trello:before {
1273 | content: "\f181";
1274 | }
1275 | .fa-female:before {
1276 | content: "\f182";
1277 | }
1278 | .fa-male:before {
1279 | content: "\f183";
1280 | }
1281 | .fa-gittip:before,
1282 | .fa-gratipay:before {
1283 | content: "\f184";
1284 | }
1285 | .fa-sun-o:before {
1286 | content: "\f185";
1287 | }
1288 | .fa-moon-o:before {
1289 | content: "\f186";
1290 | }
1291 | .fa-archive:before {
1292 | content: "\f187";
1293 | }
1294 | .fa-bug:before {
1295 | content: "\f188";
1296 | }
1297 | .fa-vk:before {
1298 | content: "\f189";
1299 | }
1300 | .fa-weibo:before {
1301 | content: "\f18a";
1302 | }
1303 | .fa-renren:before {
1304 | content: "\f18b";
1305 | }
1306 | .fa-pagelines:before {
1307 | content: "\f18c";
1308 | }
1309 | .fa-stack-exchange:before {
1310 | content: "\f18d";
1311 | }
1312 | .fa-arrow-circle-o-right:before {
1313 | content: "\f18e";
1314 | }
1315 | .fa-arrow-circle-o-left:before {
1316 | content: "\f190";
1317 | }
1318 | .fa-toggle-left:before,
1319 | .fa-caret-square-o-left:before {
1320 | content: "\f191";
1321 | }
1322 | .fa-dot-circle-o:before {
1323 | content: "\f192";
1324 | }
1325 | .fa-wheelchair:before {
1326 | content: "\f193";
1327 | }
1328 | .fa-vimeo-square:before {
1329 | content: "\f194";
1330 | }
1331 | .fa-turkish-lira:before,
1332 | .fa-try:before {
1333 | content: "\f195";
1334 | }
1335 | .fa-plus-square-o:before {
1336 | content: "\f196";
1337 | }
1338 | .fa-space-shuttle:before {
1339 | content: "\f197";
1340 | }
1341 | .fa-slack:before {
1342 | content: "\f198";
1343 | }
1344 | .fa-envelope-square:before {
1345 | content: "\f199";
1346 | }
1347 | .fa-wordpress:before {
1348 | content: "\f19a";
1349 | }
1350 | .fa-openid:before {
1351 | content: "\f19b";
1352 | }
1353 | .fa-institution:before,
1354 | .fa-bank:before,
1355 | .fa-university:before {
1356 | content: "\f19c";
1357 | }
1358 | .fa-mortar-board:before,
1359 | .fa-graduation-cap:before {
1360 | content: "\f19d";
1361 | }
1362 | .fa-yahoo:before {
1363 | content: "\f19e";
1364 | }
1365 | .fa-google:before {
1366 | content: "\f1a0";
1367 | }
1368 | .fa-reddit:before {
1369 | content: "\f1a1";
1370 | }
1371 | .fa-reddit-square:before {
1372 | content: "\f1a2";
1373 | }
1374 | .fa-stumbleupon-circle:before {
1375 | content: "\f1a3";
1376 | }
1377 | .fa-stumbleupon:before {
1378 | content: "\f1a4";
1379 | }
1380 | .fa-delicious:before {
1381 | content: "\f1a5";
1382 | }
1383 | .fa-digg:before {
1384 | content: "\f1a6";
1385 | }
1386 | .fa-pied-piper:before {
1387 | content: "\f1a7";
1388 | }
1389 | .fa-pied-piper-alt:before {
1390 | content: "\f1a8";
1391 | }
1392 | .fa-drupal:before {
1393 | content: "\f1a9";
1394 | }
1395 | .fa-joomla:before {
1396 | content: "\f1aa";
1397 | }
1398 | .fa-language:before {
1399 | content: "\f1ab";
1400 | }
1401 | .fa-fax:before {
1402 | content: "\f1ac";
1403 | }
1404 | .fa-building:before {
1405 | content: "\f1ad";
1406 | }
1407 | .fa-child:before {
1408 | content: "\f1ae";
1409 | }
1410 | .fa-paw:before {
1411 | content: "\f1b0";
1412 | }
1413 | .fa-spoon:before {
1414 | content: "\f1b1";
1415 | }
1416 | .fa-cube:before {
1417 | content: "\f1b2";
1418 | }
1419 | .fa-cubes:before {
1420 | content: "\f1b3";
1421 | }
1422 | .fa-behance:before {
1423 | content: "\f1b4";
1424 | }
1425 | .fa-behance-square:before {
1426 | content: "\f1b5";
1427 | }
1428 | .fa-steam:before {
1429 | content: "\f1b6";
1430 | }
1431 | .fa-steam-square:before {
1432 | content: "\f1b7";
1433 | }
1434 | .fa-recycle:before {
1435 | content: "\f1b8";
1436 | }
1437 | .fa-automobile:before,
1438 | .fa-car:before {
1439 | content: "\f1b9";
1440 | }
1441 | .fa-cab:before,
1442 | .fa-taxi:before {
1443 | content: "\f1ba";
1444 | }
1445 | .fa-tree:before {
1446 | content: "\f1bb";
1447 | }
1448 | .fa-spotify:before {
1449 | content: "\f1bc";
1450 | }
1451 | .fa-deviantart:before {
1452 | content: "\f1bd";
1453 | }
1454 | .fa-soundcloud:before {
1455 | content: "\f1be";
1456 | }
1457 | .fa-database:before {
1458 | content: "\f1c0";
1459 | }
1460 | .fa-file-pdf-o:before {
1461 | content: "\f1c1";
1462 | }
1463 | .fa-file-word-o:before {
1464 | content: "\f1c2";
1465 | }
1466 | .fa-file-excel-o:before {
1467 | content: "\f1c3";
1468 | }
1469 | .fa-file-powerpoint-o:before {
1470 | content: "\f1c4";
1471 | }
1472 | .fa-file-photo-o:before,
1473 | .fa-file-picture-o:before,
1474 | .fa-file-image-o:before {
1475 | content: "\f1c5";
1476 | }
1477 | .fa-file-zip-o:before,
1478 | .fa-file-archive-o:before {
1479 | content: "\f1c6";
1480 | }
1481 | .fa-file-sound-o:before,
1482 | .fa-file-audio-o:before {
1483 | content: "\f1c7";
1484 | }
1485 | .fa-file-movie-o:before,
1486 | .fa-file-video-o:before {
1487 | content: "\f1c8";
1488 | }
1489 | .fa-file-code-o:before {
1490 | content: "\f1c9";
1491 | }
1492 | .fa-vine:before {
1493 | content: "\f1ca";
1494 | }
1495 | .fa-codepen:before {
1496 | content: "\f1cb";
1497 | }
1498 | .fa-jsfiddle:before {
1499 | content: "\f1cc";
1500 | }
1501 | .fa-life-bouy:before,
1502 | .fa-life-buoy:before,
1503 | .fa-life-saver:before,
1504 | .fa-support:before,
1505 | .fa-life-ring:before {
1506 | content: "\f1cd";
1507 | }
1508 | .fa-circle-o-notch:before {
1509 | content: "\f1ce";
1510 | }
1511 | .fa-ra:before,
1512 | .fa-rebel:before {
1513 | content: "\f1d0";
1514 | }
1515 | .fa-ge:before,
1516 | .fa-empire:before {
1517 | content: "\f1d1";
1518 | }
1519 | .fa-git-square:before {
1520 | content: "\f1d2";
1521 | }
1522 | .fa-git:before {
1523 | content: "\f1d3";
1524 | }
1525 | .fa-y-combinator-square:before,
1526 | .fa-yc-square:before,
1527 | .fa-hacker-news:before {
1528 | content: "\f1d4";
1529 | }
1530 | .fa-tencent-weibo:before {
1531 | content: "\f1d5";
1532 | }
1533 | .fa-qq:before {
1534 | content: "\f1d6";
1535 | }
1536 | .fa-wechat:before,
1537 | .fa-weixin:before {
1538 | content: "\f1d7";
1539 | }
1540 | .fa-send:before,
1541 | .fa-paper-plane:before {
1542 | content: "\f1d8";
1543 | }
1544 | .fa-send-o:before,
1545 | .fa-paper-plane-o:before {
1546 | content: "\f1d9";
1547 | }
1548 | .fa-history:before {
1549 | content: "\f1da";
1550 | }
1551 | .fa-circle-thin:before {
1552 | content: "\f1db";
1553 | }
1554 | .fa-header:before {
1555 | content: "\f1dc";
1556 | }
1557 | .fa-paragraph:before {
1558 | content: "\f1dd";
1559 | }
1560 | .fa-sliders:before {
1561 | content: "\f1de";
1562 | }
1563 | .fa-share-alt:before {
1564 | content: "\f1e0";
1565 | }
1566 | .fa-share-alt-square:before {
1567 | content: "\f1e1";
1568 | }
1569 | .fa-bomb:before {
1570 | content: "\f1e2";
1571 | }
1572 | .fa-soccer-ball-o:before,
1573 | .fa-futbol-o:before {
1574 | content: "\f1e3";
1575 | }
1576 | .fa-tty:before {
1577 | content: "\f1e4";
1578 | }
1579 | .fa-binoculars:before {
1580 | content: "\f1e5";
1581 | }
1582 | .fa-plug:before {
1583 | content: "\f1e6";
1584 | }
1585 | .fa-slideshare:before {
1586 | content: "\f1e7";
1587 | }
1588 | .fa-twitch:before {
1589 | content: "\f1e8";
1590 | }
1591 | .fa-yelp:before {
1592 | content: "\f1e9";
1593 | }
1594 | .fa-newspaper-o:before {
1595 | content: "\f1ea";
1596 | }
1597 | .fa-wifi:before {
1598 | content: "\f1eb";
1599 | }
1600 | .fa-calculator:before {
1601 | content: "\f1ec";
1602 | }
1603 | .fa-paypal:before {
1604 | content: "\f1ed";
1605 | }
1606 | .fa-google-wallet:before {
1607 | content: "\f1ee";
1608 | }
1609 | .fa-cc-visa:before {
1610 | content: "\f1f0";
1611 | }
1612 | .fa-cc-mastercard:before {
1613 | content: "\f1f1";
1614 | }
1615 | .fa-cc-discover:before {
1616 | content: "\f1f2";
1617 | }
1618 | .fa-cc-amex:before {
1619 | content: "\f1f3";
1620 | }
1621 | .fa-cc-paypal:before {
1622 | content: "\f1f4";
1623 | }
1624 | .fa-cc-stripe:before {
1625 | content: "\f1f5";
1626 | }
1627 | .fa-bell-slash:before {
1628 | content: "\f1f6";
1629 | }
1630 | .fa-bell-slash-o:before {
1631 | content: "\f1f7";
1632 | }
1633 | .fa-trash:before {
1634 | content: "\f1f8";
1635 | }
1636 | .fa-copyright:before {
1637 | content: "\f1f9";
1638 | }
1639 | .fa-at:before {
1640 | content: "\f1fa";
1641 | }
1642 | .fa-eyedropper:before {
1643 | content: "\f1fb";
1644 | }
1645 | .fa-paint-brush:before {
1646 | content: "\f1fc";
1647 | }
1648 | .fa-birthday-cake:before {
1649 | content: "\f1fd";
1650 | }
1651 | .fa-area-chart:before {
1652 | content: "\f1fe";
1653 | }
1654 | .fa-pie-chart:before {
1655 | content: "\f200";
1656 | }
1657 | .fa-line-chart:before {
1658 | content: "\f201";
1659 | }
1660 | .fa-lastfm:before {
1661 | content: "\f202";
1662 | }
1663 | .fa-lastfm-square:before {
1664 | content: "\f203";
1665 | }
1666 | .fa-toggle-off:before {
1667 | content: "\f204";
1668 | }
1669 | .fa-toggle-on:before {
1670 | content: "\f205";
1671 | }
1672 | .fa-bicycle:before {
1673 | content: "\f206";
1674 | }
1675 | .fa-bus:before {
1676 | content: "\f207";
1677 | }
1678 | .fa-ioxhost:before {
1679 | content: "\f208";
1680 | }
1681 | .fa-angellist:before {
1682 | content: "\f209";
1683 | }
1684 | .fa-cc:before {
1685 | content: "\f20a";
1686 | }
1687 | .fa-shekel:before,
1688 | .fa-sheqel:before,
1689 | .fa-ils:before {
1690 | content: "\f20b";
1691 | }
1692 | .fa-meanpath:before {
1693 | content: "\f20c";
1694 | }
1695 | .fa-buysellads:before {
1696 | content: "\f20d";
1697 | }
1698 | .fa-connectdevelop:before {
1699 | content: "\f20e";
1700 | }
1701 | .fa-dashcube:before {
1702 | content: "\f210";
1703 | }
1704 | .fa-forumbee:before {
1705 | content: "\f211";
1706 | }
1707 | .fa-leanpub:before {
1708 | content: "\f212";
1709 | }
1710 | .fa-sellsy:before {
1711 | content: "\f213";
1712 | }
1713 | .fa-shirtsinbulk:before {
1714 | content: "\f214";
1715 | }
1716 | .fa-simplybuilt:before {
1717 | content: "\f215";
1718 | }
1719 | .fa-skyatlas:before {
1720 | content: "\f216";
1721 | }
1722 | .fa-cart-plus:before {
1723 | content: "\f217";
1724 | }
1725 | .fa-cart-arrow-down:before {
1726 | content: "\f218";
1727 | }
1728 | .fa-diamond:before {
1729 | content: "\f219";
1730 | }
1731 | .fa-ship:before {
1732 | content: "\f21a";
1733 | }
1734 | .fa-user-secret:before {
1735 | content: "\f21b";
1736 | }
1737 | .fa-motorcycle:before {
1738 | content: "\f21c";
1739 | }
1740 | .fa-street-view:before {
1741 | content: "\f21d";
1742 | }
1743 | .fa-heartbeat:before {
1744 | content: "\f21e";
1745 | }
1746 | .fa-venus:before {
1747 | content: "\f221";
1748 | }
1749 | .fa-mars:before {
1750 | content: "\f222";
1751 | }
1752 | .fa-mercury:before {
1753 | content: "\f223";
1754 | }
1755 | .fa-intersex:before,
1756 | .fa-transgender:before {
1757 | content: "\f224";
1758 | }
1759 | .fa-transgender-alt:before {
1760 | content: "\f225";
1761 | }
1762 | .fa-venus-double:before {
1763 | content: "\f226";
1764 | }
1765 | .fa-mars-double:before {
1766 | content: "\f227";
1767 | }
1768 | .fa-venus-mars:before {
1769 | content: "\f228";
1770 | }
1771 | .fa-mars-stroke:before {
1772 | content: "\f229";
1773 | }
1774 | .fa-mars-stroke-v:before {
1775 | content: "\f22a";
1776 | }
1777 | .fa-mars-stroke-h:before {
1778 | content: "\f22b";
1779 | }
1780 | .fa-neuter:before {
1781 | content: "\f22c";
1782 | }
1783 | .fa-genderless:before {
1784 | content: "\f22d";
1785 | }
1786 | .fa-facebook-official:before {
1787 | content: "\f230";
1788 | }
1789 | .fa-pinterest-p:before {
1790 | content: "\f231";
1791 | }
1792 | .fa-whatsapp:before {
1793 | content: "\f232";
1794 | }
1795 | .fa-server:before {
1796 | content: "\f233";
1797 | }
1798 | .fa-user-plus:before {
1799 | content: "\f234";
1800 | }
1801 | .fa-user-times:before {
1802 | content: "\f235";
1803 | }
1804 | .fa-hotel:before,
1805 | .fa-bed:before {
1806 | content: "\f236";
1807 | }
1808 | .fa-viacoin:before {
1809 | content: "\f237";
1810 | }
1811 | .fa-train:before {
1812 | content: "\f238";
1813 | }
1814 | .fa-subway:before {
1815 | content: "\f239";
1816 | }
1817 | .fa-medium:before {
1818 | content: "\f23a";
1819 | }
1820 | .fa-yc:before,
1821 | .fa-y-combinator:before {
1822 | content: "\f23b";
1823 | }
1824 | .fa-optin-monster:before {
1825 | content: "\f23c";
1826 | }
1827 | .fa-opencart:before {
1828 | content: "\f23d";
1829 | }
1830 | .fa-expeditedssl:before {
1831 | content: "\f23e";
1832 | }
1833 | .fa-battery-4:before,
1834 | .fa-battery-full:before {
1835 | content: "\f240";
1836 | }
1837 | .fa-battery-3:before,
1838 | .fa-battery-three-quarters:before {
1839 | content: "\f241";
1840 | }
1841 | .fa-battery-2:before,
1842 | .fa-battery-half:before {
1843 | content: "\f242";
1844 | }
1845 | .fa-battery-1:before,
1846 | .fa-battery-quarter:before {
1847 | content: "\f243";
1848 | }
1849 | .fa-battery-0:before,
1850 | .fa-battery-empty:before {
1851 | content: "\f244";
1852 | }
1853 | .fa-mouse-pointer:before {
1854 | content: "\f245";
1855 | }
1856 | .fa-i-cursor:before {
1857 | content: "\f246";
1858 | }
1859 | .fa-object-group:before {
1860 | content: "\f247";
1861 | }
1862 | .fa-object-ungroup:before {
1863 | content: "\f248";
1864 | }
1865 | .fa-sticky-note:before {
1866 | content: "\f249";
1867 | }
1868 | .fa-sticky-note-o:before {
1869 | content: "\f24a";
1870 | }
1871 | .fa-cc-jcb:before {
1872 | content: "\f24b";
1873 | }
1874 | .fa-cc-diners-club:before {
1875 | content: "\f24c";
1876 | }
1877 | .fa-clone:before {
1878 | content: "\f24d";
1879 | }
1880 | .fa-balance-scale:before {
1881 | content: "\f24e";
1882 | }
1883 | .fa-hourglass-o:before {
1884 | content: "\f250";
1885 | }
1886 | .fa-hourglass-1:before,
1887 | .fa-hourglass-start:before {
1888 | content: "\f251";
1889 | }
1890 | .fa-hourglass-2:before,
1891 | .fa-hourglass-half:before {
1892 | content: "\f252";
1893 | }
1894 | .fa-hourglass-3:before,
1895 | .fa-hourglass-end:before {
1896 | content: "\f253";
1897 | }
1898 | .fa-hourglass:before {
1899 | content: "\f254";
1900 | }
1901 | .fa-hand-grab-o:before,
1902 | .fa-hand-rock-o:before {
1903 | content: "\f255";
1904 | }
1905 | .fa-hand-stop-o:before,
1906 | .fa-hand-paper-o:before {
1907 | content: "\f256";
1908 | }
1909 | .fa-hand-scissors-o:before {
1910 | content: "\f257";
1911 | }
1912 | .fa-hand-lizard-o:before {
1913 | content: "\f258";
1914 | }
1915 | .fa-hand-spock-o:before {
1916 | content: "\f259";
1917 | }
1918 | .fa-hand-pointer-o:before {
1919 | content: "\f25a";
1920 | }
1921 | .fa-hand-peace-o:before {
1922 | content: "\f25b";
1923 | }
1924 | .fa-trademark:before {
1925 | content: "\f25c";
1926 | }
1927 | .fa-registered:before {
1928 | content: "\f25d";
1929 | }
1930 | .fa-creative-commons:before {
1931 | content: "\f25e";
1932 | }
1933 | .fa-gg:before {
1934 | content: "\f260";
1935 | }
1936 | .fa-gg-circle:before {
1937 | content: "\f261";
1938 | }
1939 | .fa-tripadvisor:before {
1940 | content: "\f262";
1941 | }
1942 | .fa-odnoklassniki:before {
1943 | content: "\f263";
1944 | }
1945 | .fa-odnoklassniki-square:before {
1946 | content: "\f264";
1947 | }
1948 | .fa-get-pocket:before {
1949 | content: "\f265";
1950 | }
1951 | .fa-wikipedia-w:before {
1952 | content: "\f266";
1953 | }
1954 | .fa-safari:before {
1955 | content: "\f267";
1956 | }
1957 | .fa-chrome:before {
1958 | content: "\f268";
1959 | }
1960 | .fa-firefox:before {
1961 | content: "\f269";
1962 | }
1963 | .fa-opera:before {
1964 | content: "\f26a";
1965 | }
1966 | .fa-internet-explorer:before {
1967 | content: "\f26b";
1968 | }
1969 | .fa-tv:before,
1970 | .fa-television:before {
1971 | content: "\f26c";
1972 | }
1973 | .fa-contao:before {
1974 | content: "\f26d";
1975 | }
1976 | .fa-500px:before {
1977 | content: "\f26e";
1978 | }
1979 | .fa-amazon:before {
1980 | content: "\f270";
1981 | }
1982 | .fa-calendar-plus-o:before {
1983 | content: "\f271";
1984 | }
1985 | .fa-calendar-minus-o:before {
1986 | content: "\f272";
1987 | }
1988 | .fa-calendar-times-o:before {
1989 | content: "\f273";
1990 | }
1991 | .fa-calendar-check-o:before {
1992 | content: "\f274";
1993 | }
1994 | .fa-industry:before {
1995 | content: "\f275";
1996 | }
1997 | .fa-map-pin:before {
1998 | content: "\f276";
1999 | }
2000 | .fa-map-signs:before {
2001 | content: "\f277";
2002 | }
2003 | .fa-map-o:before {
2004 | content: "\f278";
2005 | }
2006 | .fa-map:before {
2007 | content: "\f279";
2008 | }
2009 | .fa-commenting:before {
2010 | content: "\f27a";
2011 | }
2012 | .fa-commenting-o:before {
2013 | content: "\f27b";
2014 | }
2015 | .fa-houzz:before {
2016 | content: "\f27c";
2017 | }
2018 | .fa-vimeo:before {
2019 | content: "\f27d";
2020 | }
2021 | .fa-black-tie:before {
2022 | content: "\f27e";
2023 | }
2024 | .fa-fonticons:before {
2025 | content: "\f280";
2026 | }
2027 | .fa-reddit-alien:before {
2028 | content: "\f281";
2029 | }
2030 | .fa-edge:before {
2031 | content: "\f282";
2032 | }
2033 | .fa-credit-card-alt:before {
2034 | content: "\f283";
2035 | }
2036 | .fa-codiepie:before {
2037 | content: "\f284";
2038 | }
2039 | .fa-modx:before {
2040 | content: "\f285";
2041 | }
2042 | .fa-fort-awesome:before {
2043 | content: "\f286";
2044 | }
2045 | .fa-usb:before {
2046 | content: "\f287";
2047 | }
2048 | .fa-product-hunt:before {
2049 | content: "\f288";
2050 | }
2051 | .fa-mixcloud:before {
2052 | content: "\f289";
2053 | }
2054 | .fa-scribd:before {
2055 | content: "\f28a";
2056 | }
2057 | .fa-pause-circle:before {
2058 | content: "\f28b";
2059 | }
2060 | .fa-pause-circle-o:before {
2061 | content: "\f28c";
2062 | }
2063 | .fa-stop-circle:before {
2064 | content: "\f28d";
2065 | }
2066 | .fa-stop-circle-o:before {
2067 | content: "\f28e";
2068 | }
2069 | .fa-shopping-bag:before {
2070 | content: "\f290";
2071 | }
2072 | .fa-shopping-basket:before {
2073 | content: "\f291";
2074 | }
2075 | .fa-hashtag:before {
2076 | content: "\f292";
2077 | }
2078 | .fa-bluetooth:before {
2079 | content: "\f293";
2080 | }
2081 | .fa-bluetooth-b:before {
2082 | content: "\f294";
2083 | }
2084 | .fa-percent:before {
2085 | content: "\f295";
2086 | }
2087 |
--------------------------------------------------------------------------------
/assets/stylesheets/jquery.gridster.css:
--------------------------------------------------------------------------------
1 | /*! gridster.js - v0.1.0 - 2012-08-14
2 | * http://gridster.net/
3 | * Copyright (c) 2012 ducksboard; Licensed MIT */
4 |
5 | .gridster {
6 | position:relative;
7 | }
8 |
9 | .gridster > * {
10 | margin: 0 auto;
11 | -webkit-transition: height .4s;
12 | -moz-transition: height .4s;
13 | -o-transition: height .4s;
14 | -ms-transition: height .4s;
15 | transition: height .4s;
16 | }
17 |
18 | .gridster .gs_w{
19 | z-index: 2;
20 | position: absolute;
21 | }
22 |
23 | .ready .gs_w:not(.preview-holder) {
24 | -webkit-transition: opacity .3s, left .3s, top .3s;
25 | -moz-transition: opacity .3s, left .3s, top .3s;
26 | -o-transition: opacity .3s, left .3s, top .3s;
27 | transition: opacity .3s, left .3s, top .3s;
28 | }
29 |
30 | .gridster .preview-holder {
31 | z-index: 1;
32 | position: absolute;
33 | background-color: #fff;
34 | border-color: #fff;
35 | opacity: 0.3;
36 | }
37 |
38 | .gridster .player-revert {
39 | z-index: 10!important;
40 | -webkit-transition: left .3s, top .3s!important;
41 | -moz-transition: left .3s, top .3s!important;
42 | -o-transition: left .3s, top .3s!important;
43 | transition: left .3s, top .3s!important;
44 | }
45 |
46 | .gridster .dragging {
47 | z-index: 10!important;
48 | -webkit-transition: all 0s !important;
49 | -moz-transition: all 0s !important;
50 | -o-transition: all 0s !important;
51 | transition: all 0s !important;
52 | }
53 |
54 | /* Uncomment this if you set helper : "clone" in draggable options */
55 | /*.gridster .player {
56 | opacity:0;
57 | }*/
--------------------------------------------------------------------------------
/assets/stylesheets/materialize/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014-2015 Materialize
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/stylesheets/materialize/README.md:
--------------------------------------------------------------------------------
1 | 
2 | ===========
3 |
4 | [](https://travis-ci.org/Dogfalo/materialize)[](https://david-dm.org/Dogfalo/materialize)[](https://gitter.im/Dogfalo/materialize?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5 |
6 | Materialize, a CSS Framework based on material design
7 |
8 | ### Current Version : v0.97.4
9 |
10 | ## Sass Requirements:
11 | - Ruby Sass 3.3+, LibSass 0.6+
12 |
13 | ## Supported Browsers:
14 | Chrome 35+, Firefox 31+, Safari 7+, IE 10+
15 |
16 | ## Changelog
17 | - v0.97.4 (Dec 20, 2015)
18 | - Added Jasmine testing with Travis CI
19 | - Select bugfixes
20 | - Grid Offset bugfix
21 | - Dropdown overflow bugfix
22 | - Range slider error bugfix
23 | - v0.97.3 (Nov 15, 2015)
24 | - Meteor font issues fixed
25 | - Select rendering issue fixed
26 | - Added Push and Pull to grid
27 | - Dynamic accordion appends fixed
28 | - v0.97.2 (Nov 8, 2015)
29 | - Image support inside select
30 | - Optgroup supported in select
31 | - Multiple select added
32 | - Card styling fixes
33 | - Breadcrumbs added
34 | - Scrollable tabs
35 | - Tooltips and dropdowns position themselves more intelligently inside the window
36 | - FAB menu is click-toggleable
37 | - Horizontal FAB support added
38 | - v0.97.1 (Sep 13, 2015)
39 | - Added new range slider with uses noUiSlider to provide powerful options
40 | - Added CSS for Chips
41 | - Toasts support adding of html elements
42 | - Fixed select destroy/creation bug
43 | - Bugfixes for dropdown, badges, collections, scrollfire
44 | - Added default preloader color variable
45 | - File input now supports multiple files and dynamically loaded elements
46 | - v0.97.0 (June 21, 2015)
47 | - **Documentation changed to use Official Google Icon web font**
48 | - **Input errors added**
49 | - Flicker on Firefox on dropdowns fixed
50 | - Pagination made more responsive
51 | - Modal now prevents scrolling
52 | - Modal animation added
53 | - Support for multiple modals added
54 | - Programmatic control of FAB to open/close added
55 | - Programmatic control of slider to play/pause added
56 | - Plus many more bug fixes
57 |
58 |
59 | ## Contributing
60 | [Please read CONTRIBUTING.md for more information](CONTRIBUTING.md)
61 |
62 | ## Testing
63 | We use Jasmine as our testing framework and we're trying to write a robust test suite for our components. If you want to help, [here's a starting guide on how to write tests in Jasmine](https://docs.google.com/document/d/1dVM6qGt_b_y9RRhr9X7oZfFydaJIEqB9CT7yekv-4XE/edit?usp=sharing)
64 |
--------------------------------------------------------------------------------
/assets/stylesheets/theme.css:
--------------------------------------------------------------------------------
1 | .redtext{
2 | color: blue;
3 | }
4 |
5 |
6 | .page-title {
7 | height: 80px;
8 | width: 100%;
9 | display: inline-block;
10 | line-height: 80px;
11 | font-size: 30px;
12 | padding-left: 40px;
13 | }
14 |
15 |
16 | .server-unknown {
17 | background-color: #FF7043;
18 | }
19 |
20 | .card {
21 | margin: 0;
22 | }
23 |
24 |
25 | .row-margin-top.card {
26 | margin-top: 70px;
27 | }
28 |
29 | .fill-parent {
30 | display: block;
31 | height: inherit;
32 | width: inherit;
33 | }
34 |
35 | .fill-parent > div{
36 | height: inherit;
37 | width: inherit;
38 | }
39 |
--------------------------------------------------------------------------------
/config.ru:
--------------------------------------------------------------------------------
1 | require 'dashing'
2 |
3 | configure do
4 | set :auth_token, 'YOUR_AUTH_TOKEN'
5 |
6 | helpers do
7 | def protected!
8 | # Put any authentication code you want in here.
9 | # This method is run before accessing any resource.
10 | end
11 | end
12 | end
13 |
14 | map Sinatra::Application.assets_prefix do
15 | run Sinatra::Application.sprockets
16 | end
17 |
18 | run Sinatra::Application
--------------------------------------------------------------------------------
/dashboards/layout.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | <%= yield_content(:title) %>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | <%= yield %>
22 |
23 |
24 | <% if development? %>
25 |
26 |
Paste the following at the top of <%= params[:dashboard] %>.erb
27 |
28 |
29 | Save this layout
30 | <% end %>
31 |
32 |
--------------------------------------------------------------------------------
/dashboards/pimonitor.erb:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 |
21 | <%
22 | link_transmission="http://192.168.0.121:9091/transmission/web/"
23 | link_sickrage="http://192.168.0.121:8081/home/"
24 | link_homepage="http://192.168.0.121"
25 |
26 | target_class = " target=\"_blank\" class=\"fill-parent\""
27 |
28 | anchor_transmission = " href=" + link_transmission + target_class
29 | anchor_sickrage = " href=" + link_sickrage + target_class
30 | anchor_homepage = " href=" + link_homepage + target_class
31 | %>
32 |
33 | <% if false %>
34 | Toast!
35 | <% end %>
36 |
37 |
38 |
39 | Pi Monitor
40 |
41 |
42 | <% content_for :title do %>Sid's Pi!<% end %>
43 |
44 |
45 |
46 |
47 |
48 | >
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | >
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | >
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
--------------------------------------------------------------------------------
/dashboards/sample.erb:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 |
21 | <% if false %>
22 | Toast!
23 | <% end %>
24 |
25 |
26 |
27 | Pi Monitor
28 |
29 |
30 | <% content_for :title do %>Sid's Pi!<% end %>
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/dashboards/sampletv.erb:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 | <% content_for :title do %>1080p dashboard<% end %>
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
Try this: curl -d '{ "auth_token": "YOUR_AUTH_TOKEN", "text": "Hey, Look what I can do!" }' \http://<%=request.host%>:<%=request.port%>/widgets/welcome
56 |
--------------------------------------------------------------------------------
/dashboards/serverload.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 | Pi Monitor - Server load
4 |
5 |
6 |
7 |
8 | <% content_for :title do %>ServerLoad<% end %>
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/jobs/buzzwords.rb:
--------------------------------------------------------------------------------
1 | buzzwords = ['Paradigm shift', 'Leverage', 'Pivoting', 'Turn-key', 'Streamlininess', 'Exit strategy', 'Synergy', 'Enterprise', 'Web 2.0']
2 | buzzword_counts = Hash.new({ value: 0 })
3 |
4 | SCHEDULER.every '2s' do
5 | random_buzzword = buzzwords.sample
6 | buzzword_counts[random_buzzword] = { label: random_buzzword, value: (buzzword_counts[random_buzzword][:value] + 1) % 30 }
7 |
8 | send_event('buzzwords', { items: buzzword_counts.values })
9 | end
10 |
--------------------------------------------------------------------------------
/jobs/convergence2.rb:
--------------------------------------------------------------------------------
1 | # Populate the graph with some random points
2 | points = []
3 | (1..10).each do |i|
4 | points << { x: i, y: rand(50) }
5 | end
6 | last_x = points.last[:x]
7 |
8 | SCHEDULER.every '2s' do
9 | points.shift
10 | last_x += 1
11 | points << { x: last_x, y: rand(50) }
12 |
13 | send_event('convergence', points: points)
14 | end
--------------------------------------------------------------------------------
/jobs/meters.rb:
--------------------------------------------------------------------------------
1 |
2 | SCHEDULER.every '5s' do
3 |
4 | temp = `/home/pi/Desktop/dashing/proj2/jobs/temperature.sh`
5 | mem_full = `free -om | grep "Mem:" | awk \'{print $2}'`
6 | mem_used = `free -m | awk 'NR==3' | awk \'{print $3}'`
7 |
8 | #Use free from cached
9 | mem_free = `free -m | awk 'NR==3' | awk \'{print $4}'`
10 |
11 | send_event('temperature', value: temp)
12 | send_event('memory', value: mem_used)
13 | end
14 |
--------------------------------------------------------------------------------
/jobs/sample.rb:
--------------------------------------------------------------------------------
1 | current_valuation = 0
2 | current_karma = 0
3 |
4 | SCHEDULER.every '2s' do
5 | last_valuation = current_valuation
6 | last_karma = current_karma
7 | current_valuation = rand(100)
8 | current_karma = rand(200000)
9 |
10 | send_event('valuation', { current: current_valuation, last: last_valuation })
11 | send_event('karma', { current: current_karma, last: last_karma })
12 | #### send_event('synergy', { value: rand(100) })
13 | end
14 |
--------------------------------------------------------------------------------
/jobs/server_status.rb:
--------------------------------------------------------------------------------
1 | check = 'running.'
2 | online_stat = "Online"
3 | offline_stat = "Offline"
4 |
5 | online_color = "teal darken-1"
6 | offline_color = "red darken-3"
7 |
8 | ssh_online_color = "indigo darken-3"
9 | ssh_offline_color = "red darken-4"
10 |
11 | SCHEDULER.every '5m' do
12 |
13 | nginx = `service nginx status | awk \'{printf $3}\'`
14 | sr = `service sickrage status | awk \'{printf $3}\'`
15 | samba = `service samba status | grep "smbd" | awk \'{printf $3}\'`
16 | txr = `service transmission-daemon status | awk \'{printf $3}\'`
17 | ssh = `service ssh status | awk \'{printf $3}\'`
18 |
19 |
20 |
21 | if nginx == check
22 | nginx_stat = online_stat
23 | nginx_color = online_color
24 | else
25 | nginx_stat = offline_stat
26 | nginx_color = offline_color
27 | end
28 |
29 | if sr == check
30 | sr_stat = online_stat
31 | sr_color = online_color
32 | else
33 | sr_stat = offline_stat
34 | sr_color = offline_color
35 | end
36 |
37 | if samba == check
38 | samba_stat = online_stat
39 | samba_color = online_color
40 | else
41 | samba_stat = offline_stat
42 | samba_color = offline_color
43 | end
44 |
45 | if txr == check
46 | txr_stat = online_stat
47 | txr_color = online_color
48 | else
49 | txr_stat = offline_stat
50 | txr_color = offline_color
51 | end
52 |
53 | if ssh == check
54 | ssh_stat = online_stat
55 | ssh_color = ssh_online_color
56 | else
57 | ssh_stat = offline_stat
58 | ssh_color = ssh_offline_color
59 | end
60 |
61 | send_event('nginxstatus', {text: nginx_stat, status: nginx_color} )
62 | send_event('srstatus', {text: sr_stat, status: sr_color} )
63 | send_event('sambastatus', {text: samba_stat, status: samba_color} )
64 | send_event('txrstatus', {text: txr_stat, status: txr_color} )
65 | send_event('pistatus', {text: ssh_stat, status: ssh_color} )
66 |
67 | end
68 |
--------------------------------------------------------------------------------
/jobs/serverload.rb:
--------------------------------------------------------------------------------
1 | points_1 = []
2 | points_5 = []
3 | points_15 = []
4 |
5 | (1..10).each do |i|
6 | points_1 << {x: i, y: 0}
7 | points_5 << {x: i, y: 0}
8 | points_15 << {x: i, y: 0}
9 | end
10 |
11 | last_x_1 = points_1.last[:x]
12 | last_x_5 = points_5.last[:x]
13 | last_x_15 = points_15.last[:x]
14 |
15 | SCHEDULER.every '30s' do
16 |
17 | serverload_oneMin = `uptime | sed 's|.*load average: ||' | awk -F", " '{print $1}'`
18 | serverload_fiveMin = `uptime | sed 's|.*load average: ||' | awk -F", " '{print $2}'`
19 | serverload_fifteenMin = `uptime | sed 's|.*load average: ||' | awk -F", " '{print $3}'`
20 |
21 | points_1.shift
22 | points_5.shift
23 | points_15.shift
24 |
25 | last_x_1 += 1
26 | last_x_5 += 1
27 | last_x_15 += 1
28 |
29 | points_1 << {x: last_x_1, y: serverload_oneMin.to_f}
30 | points_5 << {x: last_x_5, y: serverload_fiveMin.to_f}
31 | points_15 << {x: last_x_15, y: serverload_fifteenMin.to_f}
32 |
33 | send_event('serverload_oneMin', points: points_1 )
34 | send_event('serverload_fiveMin', points: points_5 )
35 | send_event('serverload_fifteenMin', points: points_15 )
36 | end
37 |
--------------------------------------------------------------------------------
/jobs/synergy.rb:
--------------------------------------------------------------------------------
1 | SCHEDULER.every '2s' do
2 |
3 | temp = `/home/pi/Desktop/dashing/proj2/jobs/temperature.sh`
4 |
5 | send_event('synergy', { value: temp })
6 | end
7 |
8 |
--------------------------------------------------------------------------------
/jobs/temperature.rb.graph:
--------------------------------------------------------------------------------
1 | points = []
2 | (1..10).each do |i|
3 | points << {x: i, y: 100}
4 | end
5 |
6 | last_x = points.last[:x]
7 |
8 | SCHEDULER.every '6s' do
9 |
10 | temp = `/home/pi/Desktop/dashing/proj2/jobs/temperature.sh`
11 | points.shift
12 | last_x += 1
13 | points << {x: last_x, y: temp.to_f}
14 |
15 | send_event('temperature', points: points )
16 | end
17 |
--------------------------------------------------------------------------------
/jobs/temperature.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | /opt/vc/bin/vcgencmd measure_temp | sed -r 's_.*([0-9][0-9].[0-9]).*_\1_'
4 |
--------------------------------------------------------------------------------
/jobs/tvshow_list.rb:
--------------------------------------------------------------------------------
1 |
2 | list1 = ['a', 'aa', 'bb']
3 | list3 = [3,1,2]
4 | list2 = {}
5 |
6 | mydir = '/mnt/usbstorage/TV_Shows'
7 | alu= Dir.entries(mydir).select {|entry| File.directory? File.join(mydir,entry) and !(entry =='.' || entry == '..') }
8 |
9 | SCHEDULER.every '2s' do
10 |
11 | # list3 = Hash.new({ value: 0 })
12 | #r = list1.sample
13 | # list2[r] = { label: r, value: list2[r][:value] }
14 |
15 | alu.each_with_index do |val, index|
16 | list2[val] = { label: val, value: index}
17 | end
18 |
19 | send_event('tvshow_list', { items: list2.values })
20 | end
21 |
22 |
--------------------------------------------------------------------------------
/jobs/tvshow_list.rb.backup:
--------------------------------------------------------------------------------
1 | SCHEDULER.every '2s' do
2 |
3 |
4 | list1 = ['a', 'aa', 'bb']
5 | list3 = ['3','1','2']
6 | list2 = [ label: list1, value: list3 ]
7 |
8 | send_event('tvshow_list', { items: list2 })
9 | end
10 |
11 |
--------------------------------------------------------------------------------
/jobs/tvshows.rb:
--------------------------------------------------------------------------------
1 | SCHEDULER.every '1m' do
2 |
3 | tvshows = Dir["/mnt/usbstorage/TV_Shows/*"].length
4 | movies = Dir["/mnt/usbstorage/Movies/*"].length
5 | downloading = Dir["/mnt/usbstorage/downloading/*"].length
6 | completed = Dir["/mnt/usbstorage/completed/*"].length
7 |
8 | send_event('tvshows', { current: tvshows })
9 | send_event('movies', {current: movies })
10 | send_event('downloading', {current: downloading })
11 | send_event('completed', {current: completed })
12 | end
13 |
--------------------------------------------------------------------------------
/public/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | This Dashboard doesn't exist.
5 |
17 |
18 |
19 |
20 |
21 |
22 |
Drats! That Dashboard doesn't exist.
23 |
You may have mistyped the address or the page may have moved.
24 |
25 |
26 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/siddhantac/pi_dashboard/4da9ed8237f6b62f64ec232298aefd259ee95cba/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 | Hello!
2 |
--------------------------------------------------------------------------------
/tempreg.txt:
--------------------------------------------------------------------------------
1 | 0.04
2 |
--------------------------------------------------------------------------------
/widgets/clock/clock.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Clock extends Dashing.Widget
2 |
3 | ready: ->
4 | setInterval(@startTime, 500)
5 |
6 | startTime: =>
7 | today = new Date()
8 |
9 | h = today.getHours()
10 | m = today.getMinutes()
11 | s = today.getSeconds()
12 | m = @formatTime(m)
13 | s = @formatTime(s)
14 | @set('time', h + ":" + m + ":" + s)
15 | @set('date', today.toDateString())
16 |
17 | formatTime: (i) ->
18 | if i < 10 then "0" + i else i
--------------------------------------------------------------------------------
/widgets/clock/clock.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/widgets/clock/clock.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #dc5945;
5 |
6 | // ----------------------------------------------------------------------------
7 | // Widget-clock styles
8 | // ----------------------------------------------------------------------------
9 | .widget-clock {
10 |
11 | background-color: $background-color;
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/widgets/comments/comments.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Comments extends Dashing.Widget
2 |
3 | @accessor 'quote', ->
4 | "“#{@get('current_comment')?.body}”"
5 |
6 | ready: ->
7 | @currentIndex = 0
8 | @commentElem = $(@node).find('.comment-container')
9 | @nextComment()
10 | @startCarousel()
11 |
12 | onData: (data) ->
13 | @currentIndex = 0
14 |
15 | startCarousel: ->
16 | setInterval(@nextComment, 8000)
17 |
18 | nextComment: =>
19 | comments = @get('comments')
20 | if comments
21 | @commentElem.fadeOut =>
22 | @currentIndex = (@currentIndex + 1) % comments.length
23 | @set 'current_comment', comments[@currentIndex]
24 | @commentElem.fadeIn()
25 |
--------------------------------------------------------------------------------
/widgets/comments/comments.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/widgets/comments/comments.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #eb9c3c;
5 |
6 | $title-color: rgba(255, 255, 255, 0.7);
7 | $moreinfo-color: rgba(255, 255, 255, 0.7);
8 |
9 | // ----------------------------------------------------------------------------
10 | // Widget-comment styles
11 | // ----------------------------------------------------------------------------
12 | .widget-comments {
13 |
14 | background-color: $background-color;
15 |
16 | .title {
17 | color: $title-color;
18 | margin-bottom: 15px;
19 | }
20 |
21 | .name {
22 | padding-left: 5px;
23 | }
24 |
25 | .comment-container {
26 | display: none;
27 | }
28 |
29 | .more-info {
30 | color: $moreinfo-color;
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/widgets/graph/graph.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Graph extends Dashing.Widget
2 |
3 | @accessor 'current', ->
4 | return @get('displayedValue') if @get('displayedValue')
5 | points = @get('points')
6 | if points
7 | points[points.length - 1].y
8 |
9 | ready: ->
10 | container = $(@node).parent()
11 | # Gross hacks. Let's fix this.
12 | width = (Dashing.widget_base_dimensions[0] * container.data("sizex")) + Dashing.widget_margins[0] * 2 * (container.data("sizex") - 1)
13 | height = (Dashing.widget_base_dimensions[1] * container.data("sizey"))
14 | @graph = new Rickshaw.Graph(
15 | element: @node
16 | width: width
17 | height: height
18 | renderer: @get("graphtype")
19 | series: [
20 | {
21 | color: "#fff",
22 | data: [{x:0, y:0}]
23 | }
24 | ]
25 | )
26 |
27 | @graph.series[0].data = @get('points') if @get('points')
28 |
29 | x_axis = new Rickshaw.Graph.Axis.Time(graph: @graph)
30 | y_axis = new Rickshaw.Graph.Axis.Y(graph: @graph, tickFormat: Rickshaw.Fixtures.Number.formatKMBT)
31 | @graph.render()
32 |
33 | onData: (data) ->
34 | if @graph
35 | @graph.series[0].data = data.points
36 | @graph.render()
37 |
--------------------------------------------------------------------------------
/widgets/graph/graph.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/widgets/graph/graph.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #dc5945;
5 |
6 | $title-color: rgba(255, 255, 255, 0.7);
7 | $moreinfo-color: rgba(255, 255, 255, 0.3);
8 | $tick-color: rgba(0, 0, 0, 0.4);
9 |
10 |
11 | // ----------------------------------------------------------------------------
12 | // Widget-graph styles
13 | // ----------------------------------------------------------------------------
14 | .widget-graph {
15 |
16 | background-color: $background-color;
17 | position: relative;
18 |
19 |
20 | svg {
21 | position: absolute;
22 | opacity: 0.4;
23 | fill-opacity: 0.4;
24 | left: 0px;
25 | top: 0px;
26 | }
27 |
28 | .title, .value {
29 | position: relative;
30 | z-index: 99;
31 | }
32 |
33 | .title {
34 | color: $title-color;
35 | }
36 |
37 | .more-info {
38 | color: $moreinfo-color;
39 | font-weight: 600;
40 | font-size: 20px;
41 | margin-top: 0;
42 | }
43 |
44 | .x_tick {
45 | position: absolute;
46 | bottom: 0;
47 | .title {
48 | font-size: 20px;
49 | color: $tick-color;
50 | opacity: 0.5;
51 | padding-bottom: 3px;
52 | }
53 | }
54 |
55 | .y_ticks {
56 | font-size: 20px;
57 | fill: $tick-color;
58 | fill-opacity: 1;
59 | }
60 |
61 | .domain {
62 | display: none;
63 | }
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/widgets/iframe/iframe.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Iframe extends Dashing.Widget
2 |
3 | ready: ->
4 | # This is fired when the widget is done being rendered
5 |
6 | onData: (data) ->
7 | # Handle incoming data
8 | # You can access the html node of this widget with `@node`
9 | # Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in.
10 |
--------------------------------------------------------------------------------
/widgets/iframe/iframe.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/widgets/iframe/iframe.scss:
--------------------------------------------------------------------------------
1 | .widget-iframe {
2 | padding: 3px 0px 0px 0px !important;
3 |
4 | iframe {
5 | width: 100%;
6 | height: 100%;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/widgets/image/image.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Image extends Dashing.Widget
2 |
3 | ready: ->
4 | # This is fired when the widget is done being rendered
5 |
6 | onData: (data) ->
7 | # Handle incoming data
8 | # You can access the html node of this widget with `@node`
9 | # Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in.
10 |
--------------------------------------------------------------------------------
/widgets/image/image.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/widgets/image/image.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #4b4b4b;
5 |
6 | // ----------------------------------------------------------------------------
7 | // Widget-image styles
8 | // ----------------------------------------------------------------------------
9 | .widget-image {
10 |
11 | background-color: $background-color;
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/widgets/list/list.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.List extends Dashing.Widget
2 | ready: ->
3 | if @get('unordered')
4 | $(@node).find('ol').remove()
5 | else
6 | $(@node).find('ul').remove()
7 |
--------------------------------------------------------------------------------
/widgets/list/list.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/widgets/list/list.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #12b0c5;
5 | $value-color: #fff;
6 |
7 | $title-color: rgba(255, 255, 255, 1);
8 | $label-color: rgba(255, 255, 255, 0.7);
9 | $moreinfo-color: rgba(255, 255, 255, 0.7);
10 |
11 | // ----------------------------------------------------------------------------
12 | // Widget-list styles
13 | // ----------------------------------------------------------------------------
14 | .widget-list {
15 |
16 | background-color: $background-color;
17 | vertical-align: top;
18 |
19 | .title {
20 | color: $title-color;
21 | }
22 |
23 | ol, ul {
24 | margin: 0 15px;
25 | text-align: left;
26 | color: $label-color;
27 | }
28 |
29 | ol {
30 | list-style-position: inside;
31 | }
32 |
33 | li {
34 | margin-bottom: 5px;
35 | }
36 |
37 | .list-nostyle {
38 | list-style: none;
39 | }
40 |
41 | .label {
42 | color: $label-color;
43 | }
44 |
45 | .value {
46 | float: right;
47 | margin-left: 12px;
48 | font-weight: 600;
49 | color: $value-color;
50 | }
51 |
52 | .updated-at {
53 | color: rgba(0, 0, 0, 0.3);
54 | }
55 |
56 | .more-info {
57 | color: $moreinfo-color;
58 | }
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/widgets/meter/meter.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Meter extends Dashing.Widget
2 |
3 | @accessor 'value', Dashing.AnimatedValue
4 |
5 | constructor: ->
6 | super
7 | @observe 'value', (value) ->
8 | $(@node).find(".meter").val(value).trigger('change')
9 |
10 | ready: ->
11 | meter = $(@node).find(".meter")
12 | meter.attr("data-bgcolor", meter.css("background-color"))
13 | meter.attr("data-fgcolor", meter.css("color"))
14 | meter.knob()
15 |
--------------------------------------------------------------------------------
/widgets/meter/meter.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/widgets/meter/meter.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #9c4274;
5 |
6 | $title-color: rgba(255, 255, 255, 0.7);
7 | $moreinfo-color: rgba(255, 255, 255, 0.3);
8 |
9 | $meter-background: darken($background-color, 15%);
10 |
11 | // ----------------------------------------------------------------------------
12 | // Widget-meter styles
13 | // ----------------------------------------------------------------------------
14 | .widget-meter {
15 |
16 | background-color: $background-color;
17 |
18 | input.meter {
19 | background-color: $meter-background;
20 | color: #fff;
21 | }
22 |
23 | .title {
24 | color: $title-color;
25 | }
26 |
27 | .more-info {
28 | color: $moreinfo-color;
29 | }
30 |
31 | .updated-at {
32 | color: rgba(0, 0, 0, 0.3);
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/widgets/number/number.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Number extends Dashing.Widget
2 | @accessor 'current', Dashing.AnimatedValue
3 |
4 | @accessor 'difference', ->
5 | if @get('last')
6 | last = parseInt(@get('last'))
7 | current = parseInt(@get('current'))
8 | if last != 0
9 | diff = Math.abs(Math.round((current - last) / last * 100))
10 | "#{diff}%"
11 | else
12 | ""
13 |
14 | @accessor 'arrow', ->
15 | if @get('last')
16 | if parseInt(@get('current')) > parseInt(@get('last')) then 'icon-arrow-up' else 'icon-arrow-down'
17 |
18 | onData: (data) ->
19 | if data.status
20 | # clear existing "status-*" classes
21 | $(@get('node')).attr 'class', (i,c) ->
22 | c.replace /\bstatus-\S+/g, ''
23 | # add new class
24 | $(@get('node')).addClass "status-#{data.status}"
25 |
--------------------------------------------------------------------------------
/widgets/number/number.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/widgets/number/number.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #47bbb3;
5 | $value-color: #fff;
6 |
7 | $title-color: rgba(255, 255, 255, 0.7);
8 | $moreinfo-color: rgba(255, 255, 255, 0.7);
9 |
10 | // ----------------------------------------------------------------------------
11 | // Widget-number styles
12 | // ----------------------------------------------------------------------------
13 | .widget-number {
14 |
15 | background-color: $background-color;
16 |
17 | .title {
18 | color: $title-color;
19 | }
20 |
21 | .value {
22 | color: $value-color;
23 | }
24 |
25 | .change-rate {
26 | font-weight: 500;
27 | font-size: 30px;
28 | color: $value-color;
29 | }
30 |
31 | .more-info {
32 | color: $moreinfo-color;
33 | }
34 |
35 | .updated-at {
36 | color: rgba(0, 0, 0, 0.3);
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/widgets/text/text.coffee:
--------------------------------------------------------------------------------
1 | class Dashing.Text extends Dashing.Widget
2 |
3 |
4 | onData: (data) ->
5 | if data.status
6 | # clear existing color classes
7 | $(@get('node')).attr 'class', (i,c) ->
8 | c.replace /\bgrey|teal darken-1|red darken-3|indigo darken-3|red darken-4/g, ''
9 | # add new class
10 | $(@get('node')).addClass "#{data.status}"
11 |
--------------------------------------------------------------------------------
/widgets/text/text.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/widgets/text/text.scss:
--------------------------------------------------------------------------------
1 | // ----------------------------------------------------------------------------
2 | // Sass declarations
3 | // ----------------------------------------------------------------------------
4 | $background-color: #ec663c;
5 |
6 | $title-color: rgba(255, 255, 255, 0.7);
7 | $moreinfo-color: rgba(255, 255, 255, 0.7);
8 |
9 | // ----------------------------------------------------------------------------
10 | // Widget-text styles
11 | // ----------------------------------------------------------------------------
12 | .widget-text {
13 |
14 | background-color: $background-color;
15 |
16 | .title {
17 | color: $title-color;
18 | }
19 |
20 | .more-info {
21 | color: $moreinfo-color;
22 | }
23 |
24 | .updated-at {
25 | color: rgba(255, 255, 255, 0.7);
26 | }
27 |
28 |
29 | &.large h3 {
30 | font-size: 65px;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
![]()
4 | 5 |