bulutfon_dashboard 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +66 -0
- data/Rakefile +36 -0
- data/app/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.eot +0 -0
- data/app/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.svg +164 -0
- data/app/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.ttf +0 -0
- data/app/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.woff +0 -0
- data/app/assets/images/bulutfon_dashboard/screenshot-step-1.png +0 -0
- data/app/assets/images/bulutfon_dashboard/screenshot-step-2.png +0 -0
- data/app/assets/images/bulutfon_dashboard/screenshot-step-3.png +0 -0
- data/app/assets/javascripts/bulutfon_dashboard/application.js +13 -0
- data/app/assets/javascripts/bulutfon_dashboard/audiojs/audiojs-player-graphics.gif +0 -0
- data/app/assets/javascripts/bulutfon_dashboard/audiojs/audiojs.js.erb +695 -0
- data/app/assets/javascripts/bulutfon_dashboard/audiojs/audiojs.swf +0 -0
- data/app/assets/javascripts/bulutfon_dashboard/cdrs.js +19 -0
- data/app/assets/stylesheets/bulutfon_dashboard/application.css +15 -0
- data/app/assets/stylesheets/bulutfon_dashboard/bulutfon-fonts.css.sass +114 -0
- data/app/controllers/bulutfon_dashboard/application_controller.rb +28 -0
- data/app/controllers/bulutfon_dashboard/base_controller.rb +4 -0
- data/app/controllers/bulutfon_dashboard/bulutfon_users_controller.rb +59 -0
- data/app/controllers/bulutfon_dashboard/cdrs_controller.rb +27 -0
- data/app/controllers/bulutfon_dashboard/dashboards_controller.rb +15 -0
- data/app/helpers/bulutfon_dashboard/application_helper.rb +4 -0
- data/app/helpers/bulutfon_dashboard/cdrs_helper.rb +145 -0
- data/app/models/bulutfon_dashboard/api_user.rb +19 -0
- data/app/models/bulutfon_dashboard/bulutfon_user.rb +21 -0
- data/app/models/bulutfon_dashboard/cdr.rb +54 -0
- data/app/views/bulutfon_dashboard/bulutfon_users/_form.html.haml +24 -0
- data/app/views/bulutfon_dashboard/bulutfon_users/edit.html.haml +3 -0
- data/app/views/bulutfon_dashboard/bulutfon_users/new.html.haml +3 -0
- data/app/views/bulutfon_dashboard/bulutfon_users/show.html.haml +93 -0
- data/app/views/bulutfon_dashboard/cdrs/_blank.html.haml +14 -0
- data/app/views/bulutfon_dashboard/cdrs/_cdr.html.haml +12 -0
- data/app/views/bulutfon_dashboard/cdrs/_list.html.haml +24 -0
- data/app/views/bulutfon_dashboard/cdrs/index.html.haml +5 -0
- data/app/views/bulutfon_dashboard/cdrs/show.html.haml +82 -0
- data/app/views/bulutfon_dashboard/dashboards/index.html.haml +53 -0
- data/app/views/layouts/bulutfon_dashboard/application.html.erb +14 -0
- data/config/initializers/simple_form.rb +165 -0
- data/config/initializers/simple_form_bootstrap.rb +149 -0
- data/config/locales/models.tr.yml +201 -0
- data/config/locales/simple_form.en.yml +31 -0
- data/config/routes.rb +5 -0
- data/lib/bulutfon_dashboard.rb +5 -0
- data/lib/bulutfon_dashboard/engine.rb +6 -0
- data/lib/bulutfon_dashboard/version.rb +3 -0
- data/lib/generators/bulutfon_dashboard/assets_generator.rb +57 -0
- data/lib/generators/bulutfon_dashboard/controllers_generator.rb +24 -0
- data/lib/generators/bulutfon_dashboard/helpers_generator.rb +24 -0
- data/lib/generators/bulutfon_dashboard/initializers_generator.rb +14 -0
- data/lib/generators/bulutfon_dashboard/install/install_generator.rb +17 -0
- data/lib/generators/bulutfon_dashboard/migrations_generator.rb +24 -0
- data/lib/generators/bulutfon_dashboard/views_generator.rb +55 -0
- data/lib/generators/templates/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.eot +0 -0
- data/lib/generators/templates/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.svg +164 -0
- data/lib/generators/templates/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.ttf +0 -0
- data/lib/generators/templates/assets/fonts/fontcustom_d9192ef5338659432e550700796cc26b.woff +0 -0
- data/lib/generators/templates/assets/stylesheets/bulutfon-fonts.css.sass +114 -0
- data/lib/generators/templates/controllers/base_controller.rb +9 -0
- data/lib/generators/templates/helpers/application_helper.rb +5 -0
- data/lib/generators/templates/initializers/bulutfon_dashboard.rb +2 -0
- data/lib/generators/templates/migrations/create_bulutfon_dashboard_bulutfon_users.rb +14 -0
- data/lib/tasks/bulutfon_dashboard_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/test/bulutfon_dashboard_test.rb +7 -0
- data/test/controllers/bulutfon_dashboard/bulutfon_users_controller_test.rb +13 -0
- data/test/controllers/bulutfon_dashboard/cdrs_controller_test.rb +13 -0
- data/test/controllers/bulutfon_dashboard/dashboards_controller_test.rb +13 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/bulutfon_dashboard/bulutfon_users.yml +11 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/models/bulutfon_dashboard/bulutfon_user_test.rb +9 -0
- data/test/test_helper.rb +21 -0
- metadata +221 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 59559562451ce827fa9c6cff6bf84c62147d1363
|
|
4
|
+
data.tar.gz: ea6860e14a166df4f505e5acdb5a17972e94e4bf
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: e04988f02da897940c314cf5f34a28a45adb3685f0e8f8d8fcdc4755b02086e1e749424dc124975cafee46d89c7009057089633bf72155557bc18309d890a1cf
|
|
7
|
+
data.tar.gz: 738bed76a283885251adc75738846f6d657f5af67fb5c3f72c1fbc7c77a70011b7075806cad1884c90c6196089e705e089304e014e8e2422f5bb0b287d938c24
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2016
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# BulutfonDashboardRails
|
|
2
|
+
|
|
3
|
+
Bulutfon rails dashboard mountable engine.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'bulutfon_dashboard', git: 'https://github.com/lab2023/bulutfon-dashboard-rails.git', branch: 'master'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
```ruby
|
|
16
|
+
$ bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Run required commands in terminal:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
rails generate bulutfon_dashboard:assets
|
|
25
|
+
rails generate bulutfon_dashboard:initializers
|
|
26
|
+
rails generate bulutfon_dashboard:helpers
|
|
27
|
+
rails generate bulutfon_dashboard:migrations
|
|
28
|
+
rails generate bulutfon_dashboard:controllers
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
If you want to change views run this command:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
rails generate bulutfon_dashboard:views
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Add this line to your application's config/routes.rb:
|
|
38
|
+
|
|
39
|
+
```ruby
|
|
40
|
+
mount BulutfonDashboard::Engine => '/bulutfon', as: 'bulutfon_dashboard'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Access root path like this:
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
bulutfon_dashboard.root_path
|
|
47
|
+
```
|
|
48
|
+
## Contributing
|
|
49
|
+
|
|
50
|
+
1. Fork it
|
|
51
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
52
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
53
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
54
|
+
5. Create new Pull Request
|
|
55
|
+
|
|
56
|
+
## Credits
|
|
57
|
+
|
|
58
|
+

|
|
59
|
+
|
|
60
|
+
- BulutfonDashboardRails is maintained and funded by [lab2023 - information technologies](http://lab2023.com/)
|
|
61
|
+
- Thank you to all the [contributors!](../../graphs/contributors)
|
|
62
|
+
- The names and logos for lab2023 are trademarks of lab2023, inc.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
Copyright © 2013-2015 [lab2023 - information technologies](http://lab2023.com)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
require 'rdoc/task'
|
|
8
|
+
|
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
+
rdoc.title = 'BulutfonDashboard'
|
|
12
|
+
rdoc.options << '--line-numbers'
|
|
13
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
|
17
|
+
load 'rails/tasks/engine.rake'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
load 'rails/tasks/statistics.rake'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
Bundler::GemHelper.install_tasks
|
|
25
|
+
|
|
26
|
+
require 'rake/testtask'
|
|
27
|
+
|
|
28
|
+
Rake::TestTask.new(:test) do |t|
|
|
29
|
+
t.libs << 'lib'
|
|
30
|
+
t.libs << 'test'
|
|
31
|
+
t.pattern = 'test/**/*_test.rb'
|
|
32
|
+
t.verbose = false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
task default: :test
|
|
Binary file
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
|
3
|
+
<!--
|
|
4
|
+
2015-2-10: Created.
|
|
5
|
+
-->
|
|
6
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
7
|
+
<metadata>
|
|
8
|
+
Created by FontForge 20120731 at Tue Feb 10 10:48:58 2015
|
|
9
|
+
By turku,,,
|
|
10
|
+
Created by turku,,, with FontForge 2.0 (http://fontforge.sf.net)
|
|
11
|
+
</metadata>
|
|
12
|
+
<defs>
|
|
13
|
+
<font id="fontcustom" horiz-adv-x="512" >
|
|
14
|
+
<font-face
|
|
15
|
+
font-family="fontcustom"
|
|
16
|
+
font-weight="500"
|
|
17
|
+
font-stretch="normal"
|
|
18
|
+
units-per-em="512"
|
|
19
|
+
panose-1="2 0 6 3 0 0 0 0 0 0"
|
|
20
|
+
ascent="448"
|
|
21
|
+
descent="-64"
|
|
22
|
+
bbox="-0.137665 -64.166 1056.43 451.583"
|
|
23
|
+
underline-thickness="25.6"
|
|
24
|
+
underline-position="-51.2"
|
|
25
|
+
unicode-range="U+0020-F149"
|
|
26
|
+
/>
|
|
27
|
+
<missing-glyph />
|
|
28
|
+
<glyph glyph-name="space" unicode=" " horiz-adv-x="200"
|
|
29
|
+
/>
|
|
30
|
+
<glyph glyph-name="uniF13D" unicode=""
|
|
31
|
+
d="M173.419 256.413v-9.91016v9.91016zM431.071 49.9609c1.65137 0 1.65137 0 0 0c1.65137 0 1.65137 0 0 0zM439.329 43.3545v0v0zM442.632 36.748c1.65234 -1.65137 1.65234 -1.65137 0 0c1.65234 -1.65137 1.65234 -1.65137 0 0zM160.206 165.574
|
|
32
|
+
c4.95508 -4.95508 9.91016 -9.91016 13.2129 -14.8643c-3.30273 4.9541 -8.25781 9.90918 -13.2129 14.8643zM391.433 78.0391l-34.6846 23.1221c-3.30273 1.65137 -4.9541 3.30371 -8.25781 4.95508c3.30371 -1.65137 4.95508 -3.30371 8.25781 -4.95508zM308.852 109.419
|
|
33
|
+
c-11.5615 -1.65137 -23.123 -8.25781 -31.3809 -18.167l-16.5156 -18.168l16.5156 18.168c8.25879 9.90918 19.8193 14.8643 31.3809 18.167zM110.658 352.206c-1.65137 3.30371 -4.95508 4.95508 -6.60645 8.25879v0c6.60645 -1.65234 16.5156 -1.65234 21.4707 -4.95508
|
|
34
|
+
c-4.95508 -3.30371 -9.90918 -4.95508 -13.2129 -6.60645zM257.651 353.858c3.30371 0 18.168 -8.25879 19.8193 -8.25879c-6.60645 -3.30273 -16.5156 -3.30273 -24.7744 -3.30273c-8.25781 0 -28.0771 -3.30371 -21.4707 -9.91016
|
|
35
|
+
c1.65137 -1.65137 9.91016 -14.8643 -14.8643 -9.90918c-6.60645 1.65137 -37.9873 19.8193 -47.8965 21.4707c-3.30371 1.65137 -8.25879 1.65137 -11.5615 0c-1.65137 3.30371 -1.65137 4.95508 1.65137 4.95508c1.65137 1.65137 18.168 9.90918 21.4707 11.5615
|
|
36
|
+
c9.91016 3.30273 19.8193 4.9541 29.7295 4.9541c16.5156 1.65234 33.0322 -8.25781 47.8965 -11.5605zM320.413 111.071v0h9.90918h-9.90918zM1053.73 122.632c4.95508 -6.60645 3.30371 -18.167 -6.60645 -28.0771c-8.25781 -9.90918 -19.8193 -11.5615 -29.7285 -4.95508
|
|
37
|
+
c-16.5166 11.5615 -33.0322 19.8193 -54.5029 16.5166c-13.2129 -1.65137 -23.123 -6.60645 -34.6846 -13.2129c-6.60645 -3.30371 -13.2129 -4.95508 -21.4707 -4.95508c-9.90918 1.65137 -18.168 3.30371 -28.0771 3.30371
|
|
38
|
+
c-9.91016 0 -19.8193 -1.65234 -29.7295 -4.95508c-33.0322 -9.91016 -67.7158 -28.0771 -104.052 -23.123c-14.8643 1.65234 -28.0771 4.95508 -42.9414 0c-8.25781 -3.30273 -18.168 -6.60645 -28.0771 -8.25781c-16.5166 -1.65137 -31.3809 -1.65137 -46.2451 3.30371
|
|
39
|
+
c0 -11.5615 -1.65234 -23.123 -9.91016 -33.0322c-3.30273 -3.30371 -3.30273 -9.91016 -6.60645 -14.8652c-1.65137 -4.9541 -6.60645 -8.25781 -11.5615 -9.90918c-19.8193 -8.25781 -41.29 13.2129 -33.0322 33.0322c4.95508 11.5615 14.8652 14.8643 24.7744 21.4707
|
|
40
|
+
c1.65137 9.91016 -1.65137 13.2129 -8.25781 9.91016c-1.65137 -1.65234 -3.30371 -1.65234 -4.95508 -3.30371c-3.30273 -1.65137 -6.60645 -4.95508 -9.90918 -6.60645c-4.95508 -3.30273 -11.5615 -3.30273 -18.168 -3.30273
|
|
41
|
+
c-19.8193 1.65137 -34.6836 1.65137 -52.8516 -6.60645c-16.5166 -6.60645 -31.3809 -14.8652 -47.8975 -18.168h-3.30273c0 3.30273 -1.65137 6.60645 -3.30371 8.25781v1.65137c-1.65137 1.65234 -3.30273 4.95508 -4.9541 6.60645v0
|
|
42
|
+
c-1.65234 3.30371 -3.30371 4.95508 -4.95508 6.60645l-1.65137 1.65234c-1.65234 1.65137 -4.95508 3.30273 -6.60645 4.9541l-34.6846 23.123l-34.6836 23.1221c-3.30273 1.65234 -4.95508 3.30371 -8.25781 4.95508c-4.95508 1.65137 -11.5615 4.95508 -18.168 4.95508
|
|
43
|
+
h-9.90918v0v0c-3.30371 0 -8.25879 0 -11.5615 -1.65137c-11.5615 -3.30371 -23.123 -9.91016 -31.3809 -18.168l-16.5166 -18.168c-16.5156 13.2129 -31.3799 26.4258 -47.8965 39.6387c-4.95508 4.95508 -9.90918 9.91016 -14.8643 14.8643
|
|
44
|
+
c-8.25781 8.25879 -16.5166 14.8652 -23.123 23.123c-3.30273 4.95508 -8.25781 9.90918 -13.2129 14.8643c-8.25781 6.60645 -14.8643 14.8643 -21.4707 23.123l16.5166 18.167c6.60645 8.25879 13.2129 18.168 14.8643 28.0781
|
|
45
|
+
c1.65137 3.30273 1.65137 6.60645 1.65137 9.90918v9.91016c0 3.30273 0 6.60645 -1.65137 9.90918c-1.65137 6.60645 -4.95508 13.2129 -9.91016 19.8193l-47.8965 62.7617c4.95508 3.30273 8.25781 4.95508 13.2129 6.60645
|
|
46
|
+
c-4.95508 3.30273 -14.8643 3.30273 -21.4707 4.95508v0c-3.30371 1.65137 -6.60645 4.9541 -9.91016 6.60645v0c-1.65137 0 -1.65137 1.65137 -1.65137 1.65137c-6.60645 26.4258 34.6836 16.5156 37.9873 34.6836c1.65137 18.168 0 39.6387 21.4707 44.5938
|
|
47
|
+
c23.123 3.30273 39.6387 -9.91016 56.1553 -23.123c49.5479 -39.6387 113.961 -74.3223 173.419 -33.0322c11.5615 8.25879 23.123 16.5166 37.9873 18.168c13.2129 1.65137 26.4258 3.30371 39.6387 3.30371c33.0322 1.65137 67.7158 3.30273 100.748 4.9541
|
|
48
|
+
c4.95508 0 6.60645 -4.9541 3.30371 -8.25781c-14.8643 -14.8643 28.0771 -23.1221 34.6836 -29.7285c8.25781 -6.60645 13.2129 -11.5615 24.7744 -13.2129c4.95508 0 9.90918 -1.65234 13.2129 -3.30371c6.60645 -6.60645 11.5605 -11.5615 19.8193 -14.8643
|
|
49
|
+
c1.65137 -1.65137 3.30273 -1.65137 4.9541 -1.65137c1.65234 0 4.95508 -1.65234 6.60742 -1.65234c6.60547 -1.65137 13.2129 -1.65137 21.4707 -1.65137c19.8193 -1.65137 37.9873 -1.65137 56.1543 -1.65137c21.4717 1.65137 42.9424 3.30273 64.4131 9.90918
|
|
50
|
+
c16.5166 4.95508 31.3809 11.5615 47.8975 18.168c31.3799 11.5615 64.4121 21.4707 97.4443 9.91016c14.8652 -4.95508 28.0781 -16.5166 34.6846 -29.7295c1.65137 -4.95508 4.9541 -11.5615 4.9541 -18.168c0 -9.90918 -3.30273 -18.167 -1.65137 -26.4258
|
|
51
|
+
c3.30371 -23.1221 33.0322 1.65234 44.5938 -9.90918c8.25781 -8.25781 8.25781 -18.168 3.30273 -28.0771c-3.30273 -8.25879 -19.8193 -9.91016 -21.4707 -18.168s1.65234 -16.5166 6.60645 -23.123c1.65137 -1.65137 3.30371 -3.30273 4.95508 -6.60645v-1.65137
|
|
52
|
+
c8.25781 -14.8643 6.60645 -28.0771 4.95508 -44.5938c-1.65137 -8.25781 -3.30371 -21.4707 0 -29.7285c3.30273 -9.91016 11.5615 -13.2129 18.167 -21.4717zM254.349 343.948c8.25781 0 18.167 0 26.4258 3.30371c-3.30371 0 -18.168 6.60645 -23.123 8.25781
|
|
53
|
+
c-16.5156 3.30273 -31.3809 13.2129 -47.8965 11.5615c-9.91016 0 -19.8193 -1.65234 -29.7295 -4.95508c-1.65137 -1.65137 -19.8193 -11.5615 -21.4707 -11.5615c-3.30273 -1.65137 -3.30273 -3.30273 0 -4.95508c3.30371 0 8.25781 1.65234 11.5615 0
|
|
54
|
+
c9.90918 -1.65137 41.29 -19.8193 47.8965 -21.4707c24.7744 -6.60645 16.5166 8.25781 14.8643 9.91016c-6.60645 6.60645 13.2129 9.90918 21.4717 9.90918zM320.413 111.071v0c-3.30371 0 -8.25781 0 -11.5615 -1.65234c3.30371 1.65234 6.60645 1.65234 11.5615 1.65234
|
|
55
|
+
zM173.419 246.503c0 -4.9541 0 -8.25781 -1.65137 -9.90918c1.65137 3.30273 1.65137 6.60645 1.65137 9.90918zM94.1416 367.071c3.30371 -1.65234 6.60645 -4.95508 9.91016 -6.60645c-3.30371 1.65137 -6.60645 4.9541 -9.91016 6.60645zM161.858 286.142
|
|
56
|
+
c4.9541 -6.60645 8.25781 -13.2129 9.90918 -19.8193c-3.30273 6.60645 -6.60645 13.2129 -9.90918 19.8193l-49.5488 62.7617v0zM138.735 188.697l16.5166 18.167c6.60645 8.25879 13.2129 18.168 14.8643 28.0781c-1.65137 -9.91016 -6.60645 -19.8193 -14.8643 -28.0781
|
|
57
|
+
l-16.5166 -18.167c8.25781 -8.25879 14.8643 -16.5166 21.4707 -23.123c-8.25781 6.60645 -14.8643 14.8643 -21.4707 23.123zM447.587 26.8389v0c-1.65137 3.30273 -1.65137 4.95508 -3.30273 8.25781c1.65137 -3.30273 1.65137 -4.95508 3.30273 -8.25781z
|
|
58
|
+
M196.542 127.587l-23.123 23.123c8.25879 -8.25879 14.8652 -16.5166 23.123 -23.123l14.8643 -14.8643zM431.071 49.9609c-1.65234 1.65234 -4.95508 3.30371 -6.60645 4.95508l-34.6846 23.123l34.6846 -23.123c3.30273 0 4.9541 -3.30273 6.60645 -4.95508z
|
|
59
|
+
M439.329 43.3545c1.65137 -1.65137 3.30273 -4.9541 4.95508 -6.60645c-1.65234 1.65234 -3.30371 4.95508 -4.95508 6.60645zM432.723 49.9609c1.65137 -3.30273 4.95508 -4.9541 4.95508 -6.60645c-1.65234 3.30371 -3.30371 4.95508 -4.95508 6.60645zM0 281.188
|
|
60
|
+
l56.1553 56.1543c8.25781 8.25781 19.8193 6.60645 26.4258 -3.30273l49.5479 -66.0645c6.60645 -8.25879 4.95508 -21.4717 -3.30273 -29.7295l-41.291 -41.29c19.8193 -28.0781 46.2451 -59.458 79.2773 -92.4902s64.4131 -57.8066 92.4902 -79.2773l41.291 41.29
|
|
61
|
+
c8.25781 8.25781 21.4707 8.25781 29.7285 3.30273l66.0645 -47.8965c8.25879 -6.60645 11.5615 -19.8193 3.30371 -26.4258l-54.5029 -59.458s-97.4453 -8.25781 -226.271 118.916c-127.174 128.826 -118.916 226.271 -118.916 226.271z" />
|
|
62
|
+
<glyph glyph-name="uniF13F" unicode=""
|
|
63
|
+
d="M1.59961 374.4l71.2002 71.1992c9.60059 9.60059 25.6006 7.2002 33.6006 -4l61.5996 -84.7998c8 -11.2002 5.59961 -28 -4 -37.5996l-52 -52c25.5996 -36 57.5996 -75.2002 100 -117.601c42.4004 -42.3994 81.5996 -73.5996 117.6 -100l52 52
|
|
64
|
+
c9.60059 9.60059 27.2002 11.2002 38.4004 3.2002l84 -60c11.2002 -8 14.4004 -24 4 -34.3994l-71.2002 -71.2002s-123.2 -11.2002 -284.8 150.399c-160.8 160.801 -150.4 284.801 -150.4 284.801zM445.6 384c0 -1.59961 -0.799805 -2.40039 -1.59961 -3.2002
|
|
65
|
+
l-66.4004 -5.59961c-1.59961 0 -1.59961 0.799805 -1.59961 0.799805l12.7998 20c-9.59961 6.40039 -20 9.59961 -31.2002 9.59961c-20 0 -38.3994 -10.3994 -49.5996 -28c-12 -17.5996 -15.2002 -42.3994 -8 -64l1.59961 -4
|
|
66
|
+
c0 -1.59961 -0.799805 -2.39941 -1.59961 -2.39941h-30.4004c-0.799805 0 -1.59961 0.799805 -1.59961 1.59961l-0.799805 2.40039c-7.2002 30.3994 -2.40039 62.3994 13.5996 87.2002c17.6006 26.3994 45.6006 42.3994 76 42.3994
|
|
67
|
+
c17.6006 0 35.2002 -4.7998 50.4004 -15.2002l13.5996 20.8008c0.799805 1.59961 1.60059 1.59961 2.40039 0zM283.2 276.8c0 0.799805 0.799805 2.40039 2.39941 4l66.4004 5.60059c0.799805 0.799805 1.59961 -0.800781 0.799805 -1.60059l-12.7998 -20
|
|
68
|
+
c9.59961 -6.39941 20 -9.59961 31.2002 -9.59961c20 0 38.3994 10.3994 49.5996 28c12 17.5996 15.2002 42.3994 8 64l-1.59961 4c0 1.59961 0.799805 2.39941 1.59961 2.39941h30.4004c0.799805 0 1.59961 -0.799805 1.59961 -1.59961l0.799805 -2.40039
|
|
69
|
+
c7.2002 -30.3994 2.40039 -62.3994 -13.5996 -87.1992c-17.5996 -26.4004 -45.5996 -42.4004 -76 -42.4004c-17.5996 0 -35.2002 4.7998 -50.4004 15.2002l-13.5996 -20.7998c-0.799805 -1.60059 -1.59961 -1.60059 -2.40039 0z" />
|
|
70
|
+
<glyph glyph-name="uniF13C" unicode=""
|
|
71
|
+
d="M213.6 113.6c3.2002 2.40039 2.40039 8 -1.59961 10.4004l-25.5996 18.4004c-4 2.39941 -8.80078 2.39941 -12 -0.800781l-16 -16c-11.2002 8 -23.2002 17.6006 -36 30.4004c-12.8008 12.7998 -22.4004 24.7998 -30.4004 36l16 16c3.2002 2.40039 4 8 1.59961 11.2002
|
|
72
|
+
l-18.3994 25.5996c-2.40039 3.2002 -7.2002 4 -10.4004 0.799805l-21.5996 -21.5996s-4 -37.5996 45.5996 -87.2002c49.6006 -48.7998 87.2002 -45.5996 87.2002 -45.5996zM464.8 153.6c1.60059 2.40039 2.40039 6.40039 2.40039 10.4004
|
|
73
|
+
c-2.40039 3.2002 -5.60059 4 -7.2002 8s-0.799805 8.7998 0 12c0.799805 5.59961 1.59961 11.2002 -1.59961 16.7998v0c-0.800781 1.60059 -0.800781 2.40039 -1.60059 3.2002c-1.59961 2.40039 -3.2002 5.59961 -2.39941 8.7998c0.799805 3.2002 7.19922 4 8.7998 7.2002
|
|
74
|
+
c1.59961 4 1.59961 8 -1.60059 11.2002c-4 4.7998 -16 -4.7998 -16.7998 4c0 3.2002 0.799805 6.39941 0.799805 9.59961c-0.799805 2.40039 -1.59961 4.7998 -2.39941 7.2002c-2.40039 5.59961 -7.2002 10.4004 -12.7998 12c-12.8008 4.7998 -25.6006 0.799805 -37.6006 -4
|
|
75
|
+
c-6.39941 -2.40039 -12 -5.59961 -18.3994 -7.2002c-8 -3.2002 -16.8008 -4 -24.8008 -4c-7.19922 -0.799805 -14.3994 0 -21.5996 0c-3.2002 0 -5.59961 0.799805 -8.7998 0.799805c-0.799805 0.800781 -1.60059 0.800781 -2.40039 0.800781
|
|
76
|
+
c0 0.799805 -0.799805 0.799805 -1.59961 0.799805c-3.2002 1.59961 -5.60059 3.2002 -8 5.59961c-1.60059 1.60059 -4 2.40039 -5.60059 2.40039c-4 0.799805 -6.39941 2.39941 -9.59961 4.7998c-2.40039 2.40039 -19.2002 5.59961 -13.5996 11.2002
|
|
77
|
+
c0.799805 0.799805 0 3.2002 -1.60059 3.2002c-12.7998 0 -25.5996 -0.800781 -38.3994 -1.60059c-5.60059 -0.799805 -10.4004 -0.799805 -15.2002 -1.59961c-5.60059 -1.60059 -9.60059 -4 -14.4004 -7.2002c-23.2002 -15.2002 -48 -2.40039 -67.2002 12.7998
|
|
78
|
+
c-6.39941 4.7998 -12.7998 10.4004 -21.5996 8.7998c-9.59961 -1.59961 -8.7998 -9.59961 -9.59961 -16.7998c-1.60059 -7.2002 -17.6006 -4 -14.4004 -13.5996v-0.799805v0c0.799805 -0.800781 2.40039 -1.60059 3.2002 -2.40039
|
|
79
|
+
c1.59961 -0.799805 2.39941 -2.40039 3.2002 -3.2002l0.799805 -0.799805l18.3994 -24.7998c1.60059 -2.40039 3.2002 -4.7998 4 -7.2002c0 -1.59961 0.800781 -2.40039 0.800781 -4v-4s-0.800781 -2.40039 -0.800781 -4c-0.799805 -4 -2.39941 -8 -5.59961 -11.2002
|
|
80
|
+
l-6.40039 -7.2002c2.40039 -3.19922 5.60059 -5.59961 8 -8.7998c1.60059 -1.59961 4 -4 5.60059 -5.59961c3.2002 -3.2002 5.59961 -5.60059 8.7998 -8.7998c2.40039 -1.60059 4 -4 6.40039 -5.60059c5.59961 -5.59961 12 -10.3994 18.3994 -15.2002l6.40039 7.2002
|
|
81
|
+
c3.2002 3.2002 7.2002 5.60059 12 6.40039c1.59961 0.799805 3.2002 0.799805 4.7998 0.799805h4c2.40039 0 4.7998 -0.799805 7.2002 -1.59961c0.799805 0 2.39941 -0.800781 3.2002 -1.60059l12.7998 -8.7998l12.7998 -8.7998
|
|
82
|
+
c0.799805 -0.799805 1.59961 -1.60059 2.40039 -2.40039l0.799805 -0.799805c0.799805 -0.799805 1.59961 -1.59961 2.39941 -2.40039v0c0.800781 -0.799805 0.800781 -1.59961 1.60059 -2.39941v-0.799805c0.799805 -1.60059 1.59961 -2.40039 1.59961 -3.2002v0h1.60059
|
|
83
|
+
c6.39941 1.59961 12 4.7998 18.3994 7.2002c7.2002 3.19922 12.7998 3.19922 20 2.39941c2.40039 0 4.7998 0 7.2002 1.60059c1.59961 0 2.40039 1.59961 4 2.39941c0.799805 0 1.59961 0.799805 2.40039 0.799805c3.19922 1.60059 4 0 3.19922 -4
|
|
84
|
+
c-4 -3.19922 -8 -4 -9.59961 -8.7998c-3.2002 -8 4.7998 -16.7998 12.7998 -12.7998c1.60059 0.799805 4 2.40039 4.7998 4c0.800781 1.59961 0.800781 4 2.40039 5.59961c2.40039 3.2002 4 8 3.2002 12.8008c5.59961 -2.40039 11.2002 -2.40039 17.5996 -1.60059
|
|
85
|
+
c4 0 8 1.60059 11.2002 3.2002c5.59961 2.40039 11.2002 0.799805 16.7998 0c13.6006 -2.40039 27.2002 4.7998 40 8.7998c3.2002 1.60059 7.2002 2.40039 11.2002 2.40039c4 0.799805 7.2002 -0.799805 11.2002 -0.799805c3.2002 0 5.59961 0.799805 8 2.39941
|
|
86
|
+
c4.7998 3.2002 8.7998 4.7998 13.5996 5.60059c8 0.799805 14.4004 -1.60059 20.7998 -6.40039c4 -3.2002 8 -1.59961 11.2002 1.59961zM416.8 448c52.7998 0 95.2002 -42.4004 95.2002 -95.2002v-321.6c0 -52.7998 -42.4004 -95.2002 -95.2002 -95.2002h-321.6
|
|
87
|
+
c-52.7998 0 -95.2002 42.4004 -95.2002 95.2002v321.6c0 52.7998 42.4004 95.2002 95.2002 95.2002h321.6zM159.2 249.6c-4 0 -12.7998 -1.59961 -10.4004 -4.7998c0.799805 -0.799805 4.7998 -7.2002 -7.2002 -4.7998c-3.19922 0.799805 -17.5996 8.7998 -22.3994 9.59961
|
|
88
|
+
h-5.60059c-0.799805 0.800781 -0.799805 1.60059 0.800781 2.40039c0.799805 0 8.7998 4.7998 9.59961 4.7998c4 1.60059 8.7998 2.40039 13.5996 2.40039c7.2002 0 14.4004 -4 21.6006 -5.60059c2.39941 -0.799805 8.7998 -4 10.3994 -3.19922
|
|
89
|
+
c-2.39941 -0.800781 -6.39941 0 -10.3994 -0.800781z" />
|
|
90
|
+
<glyph glyph-name="uniF143" unicode=""
|
|
91
|
+
d="M0 208.853l44.9404 44.9404c6.41992 6.41992 16.0498 4.81543 20.8652 -2.40723l38.5205 -52.9658c4.81445 -7.22266 4.0127 -17.6553 -2.40723 -23.2725l-32.9033 -32.9033c16.0498 -22.4697 36.1133 -47.3477 62.5957 -73.8301
|
|
92
|
+
c26.4824 -26.4834 50.5576 -46.5459 73.8311 -62.5957l32.9023 32.9023c6.41992 6.41992 16.8525 7.22266 24.0752 1.60547l52.9658 -37.7178c7.22266 -4.81543 8.82715 -15.248 2.40723 -21.668l-44.9404 -44.9404s-77.8428 -6.41992 -178.156 93.8936
|
|
93
|
+
c-101.116 101.116 -94.6963 178.959 -94.6963 178.959zM302.546 379.787c0 -14.4453 12.0371 -27.2852 12.8398 -41.7305c-14.4453 3.20996 -35.3105 3.20996 -48.1504 12.0371c2.40723 8.02539 12.8398 12.8408 12.0371 20.8652
|
|
94
|
+
c2.4082 -3.20996 6.41992 -4.81445 10.4326 -4.0127c4.0127 4.0127 7.22266 10.4326 12.8408 12.8408zM513.605 232.125c0 -101.918 -70.6211 -187.786 -165.317 -209.454c-3.20996 7.22266 -8.82715 13.6426 -15.2471 18.458l-52.9658 37.7178
|
|
95
|
+
c-8.02539 5.61719 -17.6553 8.82715 -28.0879 8.82715c-13.6426 0 -26.4824 -5.61719 -35.3105 -14.4453l-13.6426 -13.6426c-16.8525 13.6426 -32.9023 28.0879 -48.9531 44.1387c-16.0498 16.0498 -30.4951 32.0996 -44.1377 48.9521l13.6426 13.6426
|
|
96
|
+
c16.8525 16.8535 19.2607 43.3359 5.61816 62.5957l-38.5205 52.9658c-0.802734 0.802734 -1.60547 2.40723 -2.4082 3.20996c23.2734 93.8936 108.339 162.909 209.455 162.909c119.573 0 215.875 -97.1035 215.875 -215.875zM415.699 86.0693
|
|
97
|
+
c16.8525 16.8525 35.3105 34.5078 39.3232 58.583c-7.22266 6.41992 -13.6436 2.40723 -20.8652 0.801758c-11.2354 13.6436 -32.1006 8.02539 -44.9404 18.458c-16.8535 -0.802734 -35.3105 0.802734 -52.1631 -4.81445
|
|
98
|
+
c-5.61816 -1.60547 -27.2852 -20.0635 -34.5078 -8.82812c-2.4082 4.0127 0 14.4453 -0.802734 19.2598c-4.0127 7.22266 -12.8398 4.81543 -19.2607 8.82812c0.802734 8.02539 6.4209 19.2598 -3.20996 24.0752c-12.0371 2.40723 -12.8398 -4.81543 -21.667 -8.02539
|
|
99
|
+
c-20.0635 -6.41992 -21.668 29.6934 -7.22266 35.3105c10.4326 -1.60449 21.667 0.802734 32.0996 -2.40723c11.2354 -4.0127 12.0381 -16.0508 27.2861 -16.0508c9.62988 8.02539 4.01172 16.8535 4.81445 27.2861c3.20996 8.02441 11.2354 12.8398 14.4453 20.0625
|
|
100
|
+
c1.60449 4.81445 0.802734 13.6426 2.40723 19.2598c3.20996 11.2354 12.0381 16.8525 22.4707 21.668c-1.60547 5.61719 0 9.62988 4.0127 13.6426c12.8398 0 24.0752 -4.81543 33.7051 6.41992c-10.4326 24.0752 -38.5205 33.7051 -60.1885 45.7432
|
|
101
|
+
c1.60547 5.61719 0.802734 11.2354 0.802734 16.8525c12.8398 -4.81543 26.4824 -6.41992 40.125 -5.61719l0.802734 2.40723c5.61719 31.2979 -34.5078 25.6807 -51.3604 39.3232l-0.802734 -0.802734h-12.0371l-0.802734 0.802734
|
|
102
|
+
c-12.0381 -9.63086 -26.4824 -12.0381 -41.7305 -14.4453c-7.22266 -0.802734 -14.4453 -2.4082 -21.668 -4.0127c-7.22266 -1.60547 -12.0371 2.40723 -19.2598 2.40723c-14.4453 0 -27.2852 -10.4326 -37.7178 -20.0625
|
|
103
|
+
c-9.62988 -8.82715 3.20996 -11.2354 1.60449 -19.2598c-1.60449 -18.458 -11.2354 -34.5078 -17.6553 -51.3613c-3.20996 -8.82715 -5.61719 -18.457 -6.41992 -28.0869c-0.802734 -9.63086 4.0127 -17.6553 7.22266 -26.4834
|
|
104
|
+
c4.0127 -12.8398 -0.802734 -20.8652 9.62988 -31.2979c9.63086 -9.62988 18.458 -17.6553 16.8525 -32.9023c15.248 -16.0508 36.916 -23.2734 56.9785 -31.2979c5.61719 -2.40723 12.0381 -4.81543 18.458 -8.02539c3.20996 -4.81445 6.41992 -8.82715 10.4326 -12.0371
|
|
105
|
+
c8.02441 -7.22266 18.457 -9.63086 28.8896 -8.02539c6.41992 -12.8398 -15.2471 -25.6807 -12.8398 -41.7305c8.02539 -12.0381 17.6553 -26.4824 32.9033 -29.6924c0 -6.4209 -6.4209 -9.63086 -0.802734 -16.8535c28.8896 -0.801758 63.3975 20.0635 82.6582 40.9287z
|
|
106
|
+
" />
|
|
107
|
+
<glyph glyph-name="uniF148" unicode=""
|
|
108
|
+
d="M236.8 71.2002c0 14.9329 7.4668 22.3994 22.4004 22.3994c14.933 0 22.3994 -7.46647 22.3994 -22.3994c0 -14.9336 -7.46646 -22.4004 -22.3994 -22.4004c-14.9336 0 -22.4004 7.4668 -22.4004 22.4004zM196 103.2v189.6h126.4v-189.6h-126.4zM416.8 448
|
|
109
|
+
c26.3999 0 48.8666 -9.26672 67.4 -27.8002s27.8002 -41.0001 27.8002 -67.4v-321.6c0 -26.3999 -9.26672 -48.8666 -27.8002 -67.4s-41.0001 -27.8002 -67.4 -27.8002h-321.6c-26.3999 0 -48.8666 9.26672 -67.4 27.8002s-27.8002 41.0001 -27.8002 67.4v321.6
|
|
110
|
+
c0 26.3999 9.26672 48.8666 27.8002 67.4s41.0001 27.8002 67.4 27.8002h321.6zM348 71.2002v240c0 8.7998 -3.13339 16.3331 -9.40015 22.5999s-13.8 9.40015 -22.5999 9.40015h-113.6c-8.80019 0 -16.3336 -3.13336 -22.6001 -9.40005
|
|
111
|
+
c-6.26659 -6.26669 -9.39987 -13.8 -9.39987 -22.5999v-240c0 -8.80029 3.13326 -16.3337 9.39978 -22.6002s13.7999 -9.39978 22.6002 -9.39978h113.6c8.79993 0 16.3333 3.13329 22.5999 9.39986s9.40005 13.8 9.40005 22.6001zM196 103.2v189.6h126.4v-189.6h-126.4z" />
|
|
112
|
+
<glyph glyph-name="uniF145" unicode=""
|
|
113
|
+
d="M0 370.4l71.2002 71.1992c9.59961 9.60059 25.5996 7.2002 33.5996 -4l60.7998 -84.7998c8 -11.2002 5.60059 -28 -4 -37.5996l-52 -52c25.6006 -36 57.6006 -75.2002 100 -117.601c42.4004 -41.5996 81.6006 -73.5996 117.601 -99.1992l52 52
|
|
114
|
+
c9.59961 9.59961 27.2002 11.1992 38.3994 3.19922l84 -60c11.2002 -8 14.4004 -24 4 -34.3994l-71.1992 -71.2002s-123.2 -11.2002 -284.801 150.4c-160 160.8 -149.6 284 -149.6 284zM418.4 248.8l-32.8008 32.7998l-53.5996 -53.5996
|
|
115
|
+
c-1.59961 -1.59961 -4.7998 -1.59961 -6.40039 0l-31.1992 31.2002c-1.60059 1.59961 -1.60059 4.7998 0 6.39941l53.5996 53.6006l-32.7998 32.7998c-1.60059 1.59961 -0.799805 3.2002 1.59961 4l116.8 15.2002c2.40039 0 4 -1.60059 4 -4l-15.1992 -116.8
|
|
116
|
+
c-0.800781 -3.2002 -2.40039 -4 -4 -1.60059z" />
|
|
117
|
+
<glyph glyph-name="uniF142" unicode=""
|
|
118
|
+
d="M371.2 162.4c4.7998 0.799805 8.7998 3.19922 7.2002 -1.60059c-1.60059 -16.7998 -13.6006 -28.7998 -24.8008 -39.2002c-12 -13.5996 -35.1992 -27.1992 -53.5996 -26.3994c-3.2002 4.7998 0.799805 7.2002 0.799805 11.2002
|
|
119
|
+
c-9.59961 1.59961 -16 11.1992 -20.7998 19.1992c-1.59961 10.4004 12.7998 18.4004 8.7998 27.2002c-6.39941 -0.799805 -12.7998 0.799805 -18.3994 4.7998c-2.40039 2.40039 -4.80078 4.80078 -6.40039 8c-4 2.40039 -8 4 -12 5.60059
|
|
120
|
+
c-12.7998 4.7998 -27.2002 9.59961 -36.7998 20c0.799805 9.59961 -4.7998 15.2002 -11.2002 21.5996c-6.40039 7.2002 -3.2002 12 -6.40039 20.7998c-2.39941 5.60059 -5.59961 10.4004 -4.7998 16.8008c0 6.39941 1.60059 12.7998 4 18.3994
|
|
121
|
+
c4 11.2002 10.4004 21.6006 11.2002 33.6006c0.799805 5.59961 -7.2002 7.19922 -0.799805 12.7998c7.2002 6.39941 15.2002 13.5996 24.7998 13.5996c5.59961 0 8 -2.39941 12.7998 -1.59961s9.60059 1.59961 14.4004 2.39941
|
|
122
|
+
c9.59961 1.60059 19.2002 3.2002 27.2002 9.60059l0.799805 -0.799805h8l0.799805 0.799805c11.2002 -8.7998 36.7998 -5.60059 33.5996 -25.6006v-1.59961c-9.59961 -0.799805 -17.5996 0 -26.3994 3.2002c0 -3.2002 0.799805 -7.2002 0 -10.4004
|
|
123
|
+
c13.5996 -8 32 -13.5996 39.2002 -29.5996c-5.60059 -7.2002 -13.6006 -4 -21.6006 -4c-2.39941 -2.40039 -3.2002 -4.7998 -2.39941 -8.7998c-6.40039 -3.2002 -12 -7.2002 -14.4004 -14.4004c-0.799805 -4 0 -9.59961 -1.59961 -12.7998
|
|
124
|
+
c-2.40039 -4.7998 -7.2002 -8 -9.60059 -12.7998c-0.799805 -6.40039 3.2002 -12 -3.2002 -17.6006c-9.59961 0 -10.3994 8 -17.5996 10.4004c-6.40039 2.39941 -13.5996 0 -20.7998 1.59961c-8.7998 -3.2002 -8 -27.2002 4.7998 -22.3994
|
|
125
|
+
c6.40039 1.59961 6.40039 6.39941 14.4004 4.7998c6.39941 -3.2002 3.19922 -10.4004 2.39941 -15.2002c4 -2.40039 10.4004 -0.799805 12.7998 -5.59961c0.800781 -4 -1.59961 -10.4004 0.800781 -12.8008c4.7998 -7.19922 18.3994 4 22.3994 5.60059
|
|
126
|
+
c10.4004 4 22.4004 2.39941 33.6006 3.2002c8 -7.2002 21.5996 -3.2002 28.7998 -12zM270.4 308.8c0 -5.59961 -6.40039 -8.7998 -7.2002 -13.5996c8 -5.60059 21.5996 -5.60059 31.2002 -8c-0.800781 9.59961 -8.80078 17.5996 -8.80078 27.2002
|
|
127
|
+
c-3.19922 -1.60059 -5.59961 -5.60059 -8 -8c-3.19922 -0.800781 -5.59961 0 -7.19922 2.39941zM416.8 448c52.7998 0 95.2002 -42.4004 95.2002 -95.2002v-321.6c0 -52.7998 -42.4004 -95.2002 -95.2002 -95.2002h-321.6c-52.7998 0 -95.2002 42.4004 -95.2002 95.2002
|
|
128
|
+
v321.6c0 52.7998 42.4004 95.2002 95.2002 95.2002h321.6zM295.2 54.4004c4 4 3.2002 10.3994 -1.60059 14.3994l-34.3994 24.7998c-4.7998 3.2002 -12 2.40039 -16 -1.59961l-21.6006 -21.5996c-15.1992 10.3994 -30.3994 23.1992 -48 40.7998
|
|
129
|
+
c-17.5996 17.5996 -30.3994 33.5996 -40.7998 48l21.6006 21.5996c4 4 4.7998 10.4004 1.59961 15.2002l-24.7998 34.4004c-3.2002 4.7998 -9.60059 5.59961 -13.6006 1.59961l-28.7998 -28.7998s-4 -50.4004 61.6006 -116c65.5996 -66.4004 116 -61.6006 116 -61.6006z
|
|
130
|
+
M315.2 80.7998c61.5996 15.2002 108 70.4004 108.8 136.8c0 77.6006 -63.2002 140.801 -140.8 140.801c-65.6006 0 -120.8 -45.6006 -136 -106.4c0.799805 -0.799805 0.799805 -1.59961 1.59961 -2.40039l24.7998 -34.3994c8.80078 -12 7.2002 -29.6006 -4 -40.7998
|
|
131
|
+
l-8.7998 -8.80078c8.7998 -11.1992 18.4004 -21.5996 28.7998 -32c10.4004 -10.3994 20.8008 -20 32 -28.7998l8.80078 8.7998c5.59961 6.40039 13.5996 9.60059 22.3994 9.60059c6.40039 0 12.7998 -1.60059 18.4004 -5.60059l34.3994 -24.7998
|
|
132
|
+
c4 -3.2002 7.2002 -7.2002 9.60059 -12z" />
|
|
133
|
+
<glyph glyph-name="uniF140" unicode=""
|
|
134
|
+
d="M416.8 448c52.7998 0 95.2002 -42.4004 95.2002 -95.2002v-321.6c0 -52.7998 -42.4004 -95.2002 -95.2002 -95.2002h-321.6c-52.7998 0 -95.2002 42.4004 -95.2002 95.2002v321.6c0 52.7998 42.4004 95.2002 95.2002 95.2002h321.6zM314.4 320.8l-12 -85.5996
|
|
135
|
+
c0 -2.40039 1.59961 -3.2002 3.19922 -3.2002l86.4004 11.2002c1.59961 0 2.40039 0.799805 0.799805 2.39941l-24 24l40 40c1.60059 1.60059 1.60059 3.2002 0 4.80078l-23.2002 23.1992c-1.59961 1.60059 -3.19922 1.60059 -4.7998 0l-40 -40l-24 24
|
|
136
|
+
c-0.799805 1.60059 -2.39941 0.800781 -2.39941 -0.799805zM449.6 55.2002c7.2002 7.2002 4.80078 19.2002 -3.19922 24.7998l-62.4004 44c-8.7998 5.59961 -21.5996 4.7998 -28.7998 -2.40039l-38.4004 -38.3994c-27.2002 19.2002 -56 42.3994 -87.2002 73.5996
|
|
137
|
+
c-31.1992 31.2002 -54.3994 60.7998 -73.5996 87.2002l38.4004 38.4004c7.19922 7.19922 8.7998 20 3.19922 28l-44.7998 63.1992c-5.59961 8.80078 -17.5996 10.4004 -24.7998 3.2002l-52.7998 -52.7998s-8 -91.2002 111.2 -210.4
|
|
138
|
+
c119.199 -119.199 210.399 -111.199 210.399 -111.199z" />
|
|
139
|
+
<glyph glyph-name="uniF149" unicode=""
|
|
140
|
+
d="M42.4727 42.4141v320.175h213.294v-320.175h-213.294zM245.499 448c29.4033 0 53.2061 -23.8027 52.7402 -53.207v-405.586c0 -29.4043 -23.8037 -53.207 -53.207 -53.207h-191.825c-29.4043 0 -53.207 23.8027 -53.207 53.207v405.586
|
|
141
|
+
c0 29.4043 23.8027 53.207 53.207 53.207h192.292zM149.353 -48.5977c21.0029 0 37.8047 16.8018 37.8047 37.8047s-16.8018 37.8047 -37.8047 37.8047s-37.8047 -16.8018 -37.8047 -37.8047s16.8018 -37.8047 37.8047 -37.8047zM42.4727 42.4141h213.294v320.175h-213.294
|
|
142
|
+
v-320.175z" />
|
|
143
|
+
<glyph glyph-name="uniF144" unicode=""
|
|
144
|
+
d="M416.8 448c52.7998 0 95.2002 -42.4004 95.2002 -95.2002v-321.6c0 -52.7998 -42.4004 -95.2002 -95.2002 -95.2002h-321.6c-52.7998 0 -95.2002 42.4004 -95.2002 95.2002v321.6c0 52.7998 42.4004 95.2002 95.2002 95.2002h321.6zM292.8 248.8
|
|
145
|
+
c-1.59961 -1.59961 -1.59961 -4 0.799805 -5.59961l23.2002 -23.2002c1.60059 -1.59961 3.2002 -1.59961 4.7998 0l40 40l24 -24c0.800781 -1.59961 2.40039 -0.799805 2.40039 0.799805l11.2002 86.4004c0 2.39941 -1.60059 3.2002 -3.2002 3.2002l-86.4004 -11.2002
|
|
146
|
+
c-1.59961 0 -2.39941 -0.799805 -0.799805 -2.40039l24 -24zM449.6 55.2002c7.2002 7.2002 4.80078 19.2002 -3.19922 24.7998l-62.4004 44c-8.7998 5.59961 -21.5996 4.7998 -28.7998 -2.40039l-38.4004 -38.3994c-27.2002 19.2002 -56 42.3994 -87.2002 73.5996
|
|
147
|
+
c-31.1992 31.2002 -54.3994 60.7998 -73.5996 87.2002l38.4004 38.4004c7.19922 7.19922 8.7998 20 3.19922 28l-44.7998 63.1992c-5.59961 8.80078 -17.5996 10.4004 -24.7998 3.2002l-52.7998 -52.7998s-8 -91.2002 111.2 -210.4
|
|
148
|
+
c119.199 -119.199 210.399 -111.199 210.399 -111.199z" />
|
|
149
|
+
<glyph glyph-name="uniF141" unicode=""
|
|
150
|
+
d="M0 370.4l71.2002 71.1992c9.59961 9.60059 25.5996 7.2002 33.5996 -4l60.7998 -84.7998c8 -11.2002 5.60059 -28 -4 -37.5996l-52 -52c25.6006 -36 57.6006 -75.2002 100 -117.601c42.4004 -41.5996 81.6006 -73.5996 117.601 -99.1992l52 52
|
|
151
|
+
c9.59961 9.59961 27.2002 11.1992 38.3994 3.19922l84 -60c11.2002 -8 14.4004 -24 4 -34.3994l-71.1992 -71.2002s-123.2 -11.2002 -284.801 150.4c-160 160.8 -149.6 284 -149.6 284zM327.2 368.8l32.7998 -32.7998l53.5996 53.5996
|
|
152
|
+
c1.60059 1.60059 4.80078 1.60059 6.40039 0l31.2002 -31.1992c1.59961 -1.60059 1.59961 -4.80078 0 -6.40039l-53.6006 -53.5996l32.8008 -32.8008c1.59961 -1.59961 0.799805 -3.19922 -1.60059 -4l-116.8 -15.1992c-2.40039 0 -4 1.59961 -4 4l15.2002 116.8
|
|
153
|
+
c0.799805 2.39941 2.39941 3.2002 4 1.59961z" />
|
|
154
|
+
<glyph glyph-name="uniF13E" unicode=""
|
|
155
|
+
d="M416.8 448c52.7998 0 95.2002 -42.4004 95.2002 -95.2002v-321.6c0 -52.7998 -42.4004 -95.2002 -95.2002 -95.2002h-321.6c-52.7998 0 -95.2002 42.4004 -95.2002 95.2002v321.6c0 52.7998 42.4004 95.2002 95.2002 95.2002h321.6zM416 311.2l-1.59961 1.59961h-22.4004
|
|
156
|
+
c-0.799805 0 -0.799805 -0.799805 -0.799805 -1.59961l0.799805 -3.2002c5.59961 -16.7998 3.2002 -34.4004 -5.59961 -48c-8.80078 -13.5996 -21.6006 -20.7998 -36.8008 -20.7998c-8 0 -16 2.39941 -23.1992 7.2002l9.59961 14.3994
|
|
157
|
+
c0.799805 0.799805 0 1.60059 -0.799805 1.60059l-48.7998 -4.80078c-1.60059 0 -1.60059 -0.799805 -1.60059 -1.59961l16.7998 -46.4004c0 -0.799805 0.800781 -0.799805 1.60059 0l9.59961 15.2002c12 -7.2002 24.7998 -11.2002 37.6006 -11.2002
|
|
158
|
+
c22.3994 0 43.1992 11.2002 56 31.2002c12 18.4004 16 42.4004 10.3994 64.7998zM283.2 345.6c-12 -19.1992 -16 -42.3994 -10.4004 -65.5996l0.799805 -1.59961c0.800781 -0.800781 0.800781 -0.800781 1.60059 -0.800781h22.3994
|
|
159
|
+
c0.800781 0 0.800781 0.800781 0.800781 1.60059l-0.800781 3.2002c-5.59961 16.7998 -3.19922 34.3994 5.60059 48c8.7998 13.5996 21.5996 20.7998 36.7998 20.7998c8 0 16 -2.40039 23.2002 -7.2002l-9.60059 -14.4004c-0.799805 -0.799805 0 -1.59961 0.800781 -1.59961
|
|
160
|
+
l48.7998 4.7998c1.59961 0 1.59961 0.799805 1.59961 1.60059l-16.7998 46.3994c0 0.799805 -0.799805 0.799805 -1.59961 0l-9.60059 -15.2002c-12 7.2002 -24.7998 11.2002 -37.5996 11.2002c-22.4004 0 -43.2002 -11.2002 -56 -31.2002zM449.6 55.2002
|
|
161
|
+
c7.2002 7.2002 4.80078 19.2002 -3.19922 24.7998l-62.4004 44c-8.7998 5.59961 -21.5996 4.7998 -28.7998 -2.40039l-38.4004 -38.3994c-27.2002 19.2002 -56 42.3994 -87.2002 73.5996c-31.1992 31.2002 -54.3994 60.7998 -73.5996 87.2002l38.4004 38.4004
|
|
162
|
+
c7.19922 7.19922 8.7998 20 3.19922 28l-44.7998 63.1992c-5.59961 8.80078 -17.5996 10.4004 -24.7998 3.2002l-52.7998 -52.7998s-8 -91.2002 111.2 -210.4c119.199 -119.199 210.399 -111.199 210.399 -111.199z" />
|
|
163
|
+
</font>
|
|
164
|
+
</defs></svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// compiled file.
|
|
9
|
+
//
|
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
|
11
|
+
// about supported directives.
|
|
12
|
+
//
|
|
13
|
+
//= require_tree .
|
|
Binary file
|
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
// A cross-browser javascript shim for html5 audio
|
|
2
|
+
(function(audiojs, audiojsInstance, container) {
|
|
3
|
+
// Use the path to the audio.js file to create relative paths to the swf and player graphics
|
|
4
|
+
// Remember that some systems (e.g. ruby on rails) append strings like '?1301478336' to asset paths
|
|
5
|
+
var path = (function() {
|
|
6
|
+
var re = new RegExp('audio(\.min)?\.js.*'),
|
|
7
|
+
scripts = document.getElementsByTagName('script');
|
|
8
|
+
for (var i = 0, ii = scripts.length; i < ii; i++) {
|
|
9
|
+
var path = scripts[i].getAttribute('src');
|
|
10
|
+
if(re.test(path)) return path.replace(re, '');
|
|
11
|
+
}
|
|
12
|
+
})();
|
|
13
|
+
|
|
14
|
+
// ##The audiojs interface
|
|
15
|
+
// This is the global object which provides an interface for creating new `audiojs` instances.
|
|
16
|
+
// It also stores all of the construction helper methods and variables.
|
|
17
|
+
container[audiojs] = {
|
|
18
|
+
instanceCount: 0,
|
|
19
|
+
instances: {},
|
|
20
|
+
// The markup for the swf. It is injected into the page if there is not support for the `<audio>` element. The `$n`s are placeholders.
|
|
21
|
+
// `$1` The name of the flash movie
|
|
22
|
+
// `$2` The path to the swf
|
|
23
|
+
// `$3` Cache invalidation
|
|
24
|
+
flashSource: '\
|
|
25
|
+
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="$1" width="1" height="1" name="$1" style="position: absolute; left: -1px;"> \
|
|
26
|
+
<param name="movie" value="$2?playerInstance='+audiojs+'.instances[\'$1\']&datetime=$3"> \
|
|
27
|
+
<param name="allowscriptaccess" value="always"> \
|
|
28
|
+
<embed name="$1" src="$2?playerInstance='+audiojs+'.instances[\'$1\']&datetime=$3" width="1" height="1" allowscriptaccess="always"> \
|
|
29
|
+
</object>',
|
|
30
|
+
|
|
31
|
+
// ### The main settings object
|
|
32
|
+
// Where all the default settings are stored. Each of these variables and methods can be overwritten by the user-provided `options` object.
|
|
33
|
+
settings: {
|
|
34
|
+
autoplay: false,
|
|
35
|
+
loop: false,
|
|
36
|
+
preload: true,
|
|
37
|
+
imageLocation: '<%= asset_path 'audiojs-player-graphics.gif' %>',
|
|
38
|
+
swfLocation: '<%= asset_path 'audiojs.swf' %>',
|
|
39
|
+
useFlash: (function() {
|
|
40
|
+
var a = document.createElement('audio');
|
|
41
|
+
return !(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
|
|
42
|
+
})(),
|
|
43
|
+
hasFlash: (function() {
|
|
44
|
+
if (navigator.plugins && navigator.plugins.length && navigator.plugins['Shockwave Flash']) {
|
|
45
|
+
return true;
|
|
46
|
+
} else if (navigator.mimeTypes && navigator.mimeTypes.length) {
|
|
47
|
+
var mimeType = navigator.mimeTypes['application/x-shockwave-flash'];
|
|
48
|
+
return mimeType && mimeType.enabledPlugin;
|
|
49
|
+
} else {
|
|
50
|
+
try {
|
|
51
|
+
var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
|
|
52
|
+
return true;
|
|
53
|
+
} catch (e) {}
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
})(),
|
|
57
|
+
// The default markup and classes for creating the player:
|
|
58
|
+
createPlayer: {
|
|
59
|
+
markup: '\
|
|
60
|
+
<div class="play-pause"> \
|
|
61
|
+
<p class="play"></p> \
|
|
62
|
+
<p class="pause"></p> \
|
|
63
|
+
<p class="loading"></p> \
|
|
64
|
+
<p class="error"></p> \
|
|
65
|
+
</div> \
|
|
66
|
+
<div class="scrubber"> \
|
|
67
|
+
<div class="progress"></div> \
|
|
68
|
+
<div class="loaded"></div> \
|
|
69
|
+
</div> \
|
|
70
|
+
<div class="time"> \
|
|
71
|
+
<em class="played">00:00</em>/<strong class="duration">00:00</strong> \
|
|
72
|
+
</div> \
|
|
73
|
+
<div class="error-message"></div>',
|
|
74
|
+
playPauseClass: 'play-pause',
|
|
75
|
+
scrubberClass: 'scrubber',
|
|
76
|
+
progressClass: 'progress',
|
|
77
|
+
loaderClass: 'loaded',
|
|
78
|
+
timeClass: 'time',
|
|
79
|
+
durationClass: 'duration',
|
|
80
|
+
playedClass: 'played',
|
|
81
|
+
errorMessageClass: 'error-message',
|
|
82
|
+
playingClass: 'playing',
|
|
83
|
+
loadingClass: 'loading',
|
|
84
|
+
errorClass: 'error'
|
|
85
|
+
},
|
|
86
|
+
// The css used by the default player. This is is dynamically injected into a `<style>` tag in the top of the head.
|
|
87
|
+
css: '\
|
|
88
|
+
.audiojs audio { position: absolute; left: -1px; } \
|
|
89
|
+
.audiojs { width: 415px; height: 20px; background: #404040; overflow: hidden; font-family: monospace; font-size: 12px; } \
|
|
90
|
+
.audiojs .play-pause { width: 25px; height: 20px; padding: 0 6px; margin: 0px; float: left; overflow: hidden; } \
|
|
91
|
+
.audiojs p { display: none; width: 25px; height: 40px; margin: 0px; cursor: pointer; margin: -4px 0 0 -5px} \
|
|
92
|
+
.audiojs .play { display: block; } \
|
|
93
|
+
.audiojs .scrubber { position: relative; float: left; width: 280px; background: #5a5a5a; height: 11px; margin: 4px 0 0 0; border-top: 1px solid #3f3f3f; border-left: 0px; border-bottom: 0px; overflow: hidden; } \
|
|
94
|
+
.audiojs .progress { position: absolute; top: 0px; left: 0px; height: 10px; width: 0px; background: #1abc9c; z-index: 1; -moz-border-radius:0; -webkit-border-radius:0; -o-border-radius:0; border-radius:0; } \
|
|
95
|
+
.audiojs .loaded { position: absolute; top: 0px; left: 0px; height: 14px; width: 0px; background: #000; } \
|
|
96
|
+
.audiojs .time { float: left; height: 16px; line-height: 16px; margin: 2px 0px 0px 6px; padding: 0px 6px 0px 12px; color: #ddd; } \
|
|
97
|
+
.audiojs .time em { padding: 0px 2px 0px 0px; color: #f9f9f9; font-style: normal; } \
|
|
98
|
+
.audiojs .time strong { padding: 0px 0px 0px 2px; font-weight: normal; } \
|
|
99
|
+
.audiojs .error-message { float: left; display: none; margin: 0px 10px; height: 36px; width: 400px; overflow: hidden; line-height: 36px; white-space: nowrap; color: #fff; \
|
|
100
|
+
text-overflow: ellipsis; -o-text-overflow: ellipsis; -icab-text-overflow: ellipsis; -khtml-text-overflow: ellipsis; -moz-text-overflow: ellipsis; -webkit-text-overflow: ellipsis; } \
|
|
101
|
+
.audiojs .error-message a { color: #eee; text-decoration: none; padding-bottom: 1px; border-bottom: 1px solid #999; white-space: wrap; } \
|
|
102
|
+
\
|
|
103
|
+
.audiojs .play { background: url("$1") -2px -1px no-repeat; } \
|
|
104
|
+
.audiojs .loading { background: url("$1") -2px -31px no-repeat; } \
|
|
105
|
+
.audiojs .error { background: url("$1") -2px -61px no-repeat; } \
|
|
106
|
+
.audiojs .pause { background: url("$1") -2px -91px no-repeat; } \
|
|
107
|
+
\
|
|
108
|
+
.playing .play, .playing .loading, .playing .error { display: none; } \
|
|
109
|
+
.playing .pause { display: block; } \
|
|
110
|
+
\
|
|
111
|
+
.loading .play, .loading .pause, .loading .error { display: none; } \
|
|
112
|
+
.loading .loading { display: block; } \
|
|
113
|
+
\
|
|
114
|
+
.error .time, .error .play, .error .pause, .error .scrubber, .error .loading { display: none; } \
|
|
115
|
+
.error .error { display: block; } \
|
|
116
|
+
.error .play-pause p { cursor: auto; } \
|
|
117
|
+
.error .error-message { display: block; }',
|
|
118
|
+
// The default event callbacks:
|
|
119
|
+
trackEnded: function(e) {},
|
|
120
|
+
flashError: function() {
|
|
121
|
+
var player = this.settings.createPlayer,
|
|
122
|
+
errorMessage = getByClass(player.errorMessageClass, this.wrapper),
|
|
123
|
+
html = 'Missing <a href="http://get.adobe.com/flashplayer/">flash player</a> plugin.';
|
|
124
|
+
if (this.mp3) html += ' <a href="'+this.mp3+'">Download audio file</a>.';
|
|
125
|
+
container[audiojs].helpers.removeClass(this.wrapper, player.loadingClass);
|
|
126
|
+
container[audiojs].helpers.addClass(this.wrapper, player.errorClass);
|
|
127
|
+
errorMessage.innerHTML = html;
|
|
128
|
+
},
|
|
129
|
+
loadError: function(e) {
|
|
130
|
+
var player = this.settings.createPlayer,
|
|
131
|
+
errorMessage = getByClass(player.errorMessageClass, this.wrapper);
|
|
132
|
+
container[audiojs].helpers.removeClass(this.wrapper, player.loadingClass);
|
|
133
|
+
container[audiojs].helpers.addClass(this.wrapper, player.errorClass);
|
|
134
|
+
errorMessage.innerHTML = 'Error loading: "'+this.mp3+'"';
|
|
135
|
+
},
|
|
136
|
+
init: function() {
|
|
137
|
+
var player = this.settings.createPlayer;
|
|
138
|
+
container[audiojs].helpers.addClass(this.wrapper, player.loadingClass);
|
|
139
|
+
},
|
|
140
|
+
loadStarted: function() {
|
|
141
|
+
var player = this.settings.createPlayer,
|
|
142
|
+
duration = getByClass(player.durationClass, this.wrapper),
|
|
143
|
+
m = Math.floor(this.duration / 60),
|
|
144
|
+
s = Math.floor(this.duration % 60);
|
|
145
|
+
container[audiojs].helpers.removeClass(this.wrapper, player.loadingClass);
|
|
146
|
+
duration.innerHTML = ((m<10?'0':'')+m+':'+(s<10?'0':'')+s);
|
|
147
|
+
},
|
|
148
|
+
loadProgress: function(percent) {
|
|
149
|
+
var player = this.settings.createPlayer,
|
|
150
|
+
scrubber = getByClass(player.scrubberClass, this.wrapper),
|
|
151
|
+
loaded = getByClass(player.loaderClass, this.wrapper);
|
|
152
|
+
loaded.style.width = (scrubber.offsetWidth * percent) + 'px';
|
|
153
|
+
},
|
|
154
|
+
playPause: function() {
|
|
155
|
+
if (this.playing) this.settings.play();
|
|
156
|
+
else this.settings.pause();
|
|
157
|
+
},
|
|
158
|
+
play: function() {
|
|
159
|
+
var player = this.settings.createPlayer;
|
|
160
|
+
container[audiojs].helpers.addClass(this.wrapper, player.playingClass);
|
|
161
|
+
},
|
|
162
|
+
pause: function() {
|
|
163
|
+
var player = this.settings.createPlayer;
|
|
164
|
+
container[audiojs].helpers.removeClass(this.wrapper, player.playingClass);
|
|
165
|
+
},
|
|
166
|
+
updatePlayhead: function(percent) {
|
|
167
|
+
var player = this.settings.createPlayer,
|
|
168
|
+
scrubber = getByClass(player.scrubberClass, this.wrapper),
|
|
169
|
+
progress = getByClass(player.progressClass, this.wrapper);
|
|
170
|
+
progress.style.width = (scrubber.offsetWidth * percent) + 'px';
|
|
171
|
+
|
|
172
|
+
var played = getByClass(player.playedClass, this.wrapper),
|
|
173
|
+
p = this.duration * percent,
|
|
174
|
+
m = Math.floor(p / 60),
|
|
175
|
+
s = Math.floor(p % 60);
|
|
176
|
+
played.innerHTML = ((m<10?'0':'')+m+':'+(s<10?'0':'')+s);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
// ### Contructor functions
|
|
181
|
+
|
|
182
|
+
// `create()`
|
|
183
|
+
// Used to create a single `audiojs` instance.
|
|
184
|
+
// If an array is passed then it calls back to `createAll()`.
|
|
185
|
+
// Otherwise, it creates a single instance and returns it.
|
|
186
|
+
create: function(element, options) {
|
|
187
|
+
var options = options || {}
|
|
188
|
+
if (element.length) {
|
|
189
|
+
return this.createAll(options, element);
|
|
190
|
+
} else {
|
|
191
|
+
return this.newInstance(element, options);
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
// `createAll()`
|
|
196
|
+
// Creates multiple `audiojs` instances.
|
|
197
|
+
// If `elements` is `null`, then automatically find any `<audio>` tags on the page and create `audiojs` instances for them.
|
|
198
|
+
createAll: function(options, elements) {
|
|
199
|
+
var audioElements = elements || document.getElementsByTagName('audio'),
|
|
200
|
+
instances = []
|
|
201
|
+
options = options || {};
|
|
202
|
+
for (var i = 0, ii = audioElements.length; i < ii; i++) {
|
|
203
|
+
instances.push(this.newInstance(audioElements[i], options));
|
|
204
|
+
}
|
|
205
|
+
return instances;
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
// ### Creating and returning a new instance
|
|
209
|
+
// This goes through all the steps required to build out a usable `audiojs` instance.
|
|
210
|
+
newInstance: function(element, options) {
|
|
211
|
+
var element = element,
|
|
212
|
+
s = this.helpers.clone(this.settings),
|
|
213
|
+
id = 'audiojs'+this.instanceCount,
|
|
214
|
+
wrapperId = 'audiojs_wrapper'+this.instanceCount,
|
|
215
|
+
instanceCount = this.instanceCount++;
|
|
216
|
+
|
|
217
|
+
// Check for `autoplay`, `loop` and `preload` attributes and write them into the settings.
|
|
218
|
+
if (element.getAttribute('autoplay') != null) s.autoplay = true;
|
|
219
|
+
if (element.getAttribute('loop') != null) s.loop = true;
|
|
220
|
+
if (element.getAttribute('preload') == 'none') s.preload = false;
|
|
221
|
+
// Merge the default settings with the user-defined `options`.
|
|
222
|
+
if (options) this.helpers.merge(s, options);
|
|
223
|
+
|
|
224
|
+
// Inject the player html if required.
|
|
225
|
+
if (s.createPlayer.markup) element = this.createPlayer(element, s.createPlayer, wrapperId);
|
|
226
|
+
else element.parentNode.setAttribute('id', wrapperId);
|
|
227
|
+
|
|
228
|
+
// Return a new `audiojs` instance.
|
|
229
|
+
var audio = new container[audiojsInstance](element, s);
|
|
230
|
+
|
|
231
|
+
// If css has been passed in, dynamically inject it into the `<head>`.
|
|
232
|
+
if (s.css) this.helpers.injectCss(audio, s.css);
|
|
233
|
+
|
|
234
|
+
// If `<audio>` or mp3 playback isn't supported, insert the swf & attach the required events for it.
|
|
235
|
+
if (s.useFlash && s.hasFlash) {
|
|
236
|
+
this.injectFlash(audio, id);
|
|
237
|
+
this.attachFlashEvents(audio.wrapper, audio);
|
|
238
|
+
} else if (s.useFlash && !s.hasFlash) {
|
|
239
|
+
this.settings.flashError.apply(audio);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Attach event callbacks to the new audiojs instance.
|
|
243
|
+
if (!s.useFlash || (s.useFlash && s.hasFlash)) this.attachEvents(audio.wrapper, audio);
|
|
244
|
+
|
|
245
|
+
// Store the newly-created `audiojs` instance.
|
|
246
|
+
this.instances[id] = audio;
|
|
247
|
+
return audio;
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
// ### Helper methods for constructing a working player
|
|
251
|
+
// Inject a wrapping div and the markup for the html player.
|
|
252
|
+
createPlayer: function(element, player, id) {
|
|
253
|
+
var wrapper = document.createElement('div'),
|
|
254
|
+
newElement = element.cloneNode(true);
|
|
255
|
+
wrapper.setAttribute('class', 'audiojs');
|
|
256
|
+
wrapper.setAttribute('className', 'audiojs');
|
|
257
|
+
wrapper.setAttribute('id', id);
|
|
258
|
+
|
|
259
|
+
// Fix IE's broken implementation of `innerHTML` & `cloneNode` for HTML5 elements.
|
|
260
|
+
if (newElement.outerHTML && !document.createElement('audio').canPlayType) {
|
|
261
|
+
newElement = this.helpers.cloneHtml5Node(element);
|
|
262
|
+
wrapper.innerHTML = player.markup;
|
|
263
|
+
wrapper.appendChild(newElement);
|
|
264
|
+
element.outerHTML = wrapper.outerHTML;
|
|
265
|
+
wrapper = document.getElementById(id);
|
|
266
|
+
} else {
|
|
267
|
+
wrapper.appendChild(newElement);
|
|
268
|
+
wrapper.innerHTML = wrapper.innerHTML + player.markup;
|
|
269
|
+
element.parentNode.replaceChild(wrapper, element);
|
|
270
|
+
}
|
|
271
|
+
return wrapper.getElementsByTagName('audio')[0];
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
// Attaches useful event callbacks to an `audiojs` instance.
|
|
275
|
+
attachEvents: function(wrapper, audio) {
|
|
276
|
+
if (!audio.settings.createPlayer) return;
|
|
277
|
+
var player = audio.settings.createPlayer,
|
|
278
|
+
playPause = getByClass(player.playPauseClass, wrapper),
|
|
279
|
+
scrubber = getByClass(player.scrubberClass, wrapper),
|
|
280
|
+
leftPos = function(elem) {
|
|
281
|
+
var curleft = 0;
|
|
282
|
+
if (elem.offsetParent) {
|
|
283
|
+
do { curleft += elem.offsetLeft; } while (elem = elem.offsetParent);
|
|
284
|
+
}
|
|
285
|
+
return curleft;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
container[audiojs].events.addListener(playPause, 'click', function(e) {
|
|
289
|
+
audio.playPause.apply(audio);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
container[audiojs].events.addListener(scrubber, 'click', function(e) {
|
|
293
|
+
var relativeLeft = e.clientX - leftPos(this);
|
|
294
|
+
audio.skipTo(relativeLeft / scrubber.offsetWidth);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// _If flash is being used, then the following handlers don't need to be registered._
|
|
298
|
+
if (audio.settings.useFlash) return;
|
|
299
|
+
|
|
300
|
+
// Start tracking the load progress of the track.
|
|
301
|
+
container[audiojs].events.trackLoadProgress(audio);
|
|
302
|
+
|
|
303
|
+
container[audiojs].events.addListener(audio.element, 'timeupdate', function(e) {
|
|
304
|
+
audio.updatePlayhead.apply(audio);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
container[audiojs].events.addListener(audio.element, 'ended', function(e) {
|
|
308
|
+
audio.trackEnded.apply(audio);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
container[audiojs].events.addListener(audio.source, 'error', function(e) {
|
|
312
|
+
// on error, cancel any load timers that are running.
|
|
313
|
+
clearInterval(audio.readyTimer);
|
|
314
|
+
clearInterval(audio.loadTimer);
|
|
315
|
+
audio.settings.loadError.apply(audio);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
// Flash requires a slightly different API to the `<audio>` element, so this method is used to overwrite the standard event handlers.
|
|
321
|
+
attachFlashEvents: function(element, audio) {
|
|
322
|
+
audio['swfReady'] = false;
|
|
323
|
+
audio['load'] = function(mp3) {
|
|
324
|
+
// If the swf isn't ready yet then just set `audio.mp3`. `init()` will load it in once the swf is ready.
|
|
325
|
+
audio.mp3 = mp3;
|
|
326
|
+
if (audio.swfReady) audio.element.load(mp3);
|
|
327
|
+
}
|
|
328
|
+
audio['loadProgress'] = function(percent, duration) {
|
|
329
|
+
audio.loadedPercent = percent;
|
|
330
|
+
audio.duration = duration;
|
|
331
|
+
audio.settings.loadStarted.apply(audio);
|
|
332
|
+
audio.settings.loadProgress.apply(audio, [percent]);
|
|
333
|
+
}
|
|
334
|
+
audio['skipTo'] = function(percent) {
|
|
335
|
+
if (percent > audio.loadedPercent) return;
|
|
336
|
+
audio.updatePlayhead.call(audio, [percent])
|
|
337
|
+
audio.element.skipTo(percent);
|
|
338
|
+
}
|
|
339
|
+
audio['updatePlayhead'] = function(percent) {
|
|
340
|
+
audio.settings.updatePlayhead.apply(audio, [percent]);
|
|
341
|
+
}
|
|
342
|
+
audio['play'] = function() {
|
|
343
|
+
// If the audio hasn't started preloading, then start it now.
|
|
344
|
+
// Then set `preload` to `true`, so that any tracks loaded in subsequently are loaded straight away.
|
|
345
|
+
if (!audio.settings.preload) {
|
|
346
|
+
audio.settings.preload = true;
|
|
347
|
+
audio.element.init(audio.mp3);
|
|
348
|
+
}
|
|
349
|
+
audio.playing = true;
|
|
350
|
+
// IE doesn't allow a method named `play()` to be exposed through `ExternalInterface`, so lets go with `pplay()`.
|
|
351
|
+
// <http://dev.nuclearrooster.com/2008/07/27/externalinterfaceaddcallback-can-cause-ie-js-errors-with-certain-keyworkds/>
|
|
352
|
+
audio.element.pplay();
|
|
353
|
+
audio.settings.play.apply(audio);
|
|
354
|
+
}
|
|
355
|
+
audio['pause'] = function() {
|
|
356
|
+
audio.playing = false;
|
|
357
|
+
// Use `ppause()` for consistency with `pplay()`, even though it isn't really required.
|
|
358
|
+
audio.element.ppause();
|
|
359
|
+
audio.settings.pause.apply(audio);
|
|
360
|
+
}
|
|
361
|
+
audio['setVolume'] = function(v) {
|
|
362
|
+
audio.element.setVolume(v);
|
|
363
|
+
}
|
|
364
|
+
audio['loadStarted'] = function() {
|
|
365
|
+
// Load the mp3 specified by the audio element into the swf.
|
|
366
|
+
audio.swfReady = true;
|
|
367
|
+
if (audio.settings.preload) audio.element.init(audio.mp3);
|
|
368
|
+
if (audio.settings.autoplay) audio.play.apply(audio);
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
|
|
372
|
+
// ### Injecting an swf from a string
|
|
373
|
+
// Build up the swf source by replacing the `$keys` and then inject the markup into the page.
|
|
374
|
+
injectFlash: function(audio, id) {
|
|
375
|
+
var flashSource = this.flashSource.replace(/\$1/g, id);
|
|
376
|
+
flashSource = flashSource.replace(/\$2/g, audio.settings.swfLocation);
|
|
377
|
+
// `(+new Date)` ensures the swf is not pulled out of cache. The fixes an issue with Firefox running multiple players on the same page.
|
|
378
|
+
flashSource = flashSource.replace(/\$3/g, (+new Date + Math.random()));
|
|
379
|
+
// Inject the player markup using a more verbose `innerHTML` insertion technique that works with IE.
|
|
380
|
+
var html = audio.wrapper.innerHTML,
|
|
381
|
+
div = document.createElement('div');
|
|
382
|
+
div.innerHTML = flashSource + html;
|
|
383
|
+
audio.wrapper.innerHTML = div.innerHTML;
|
|
384
|
+
audio.element = this.helpers.getSwf(id);
|
|
385
|
+
},
|
|
386
|
+
|
|
387
|
+
// ## Helper functions
|
|
388
|
+
helpers: {
|
|
389
|
+
// **Merge two objects, with `obj2` overwriting `obj1`**
|
|
390
|
+
// The merge is shallow, but that's all that is required for our purposes.
|
|
391
|
+
merge: function(obj1, obj2) {
|
|
392
|
+
for (attr in obj2) {
|
|
393
|
+
if (obj1.hasOwnProperty(attr) || obj2.hasOwnProperty(attr)) {
|
|
394
|
+
obj1[attr] = obj2[attr];
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
// **Clone a javascript object (recursively)**
|
|
399
|
+
clone: function(obj){
|
|
400
|
+
if (obj == null || typeof(obj) !== 'object') return obj;
|
|
401
|
+
var temp = new obj.constructor();
|
|
402
|
+
for (var key in obj) temp[key] = arguments.callee(obj[key]);
|
|
403
|
+
return temp;
|
|
404
|
+
},
|
|
405
|
+
// **Adding/removing classnames from elements**
|
|
406
|
+
addClass: function(element, className) {
|
|
407
|
+
var re = new RegExp('(\\s|^)'+className+'(\\s|$)');
|
|
408
|
+
if (re.test(element.className)) return;
|
|
409
|
+
element.className += ' ' + className;
|
|
410
|
+
},
|
|
411
|
+
removeClass: function(element, className) {
|
|
412
|
+
var re = new RegExp('(\\s|^)'+className+'(\\s|$)');
|
|
413
|
+
element.className = element.className.replace(re,' ');
|
|
414
|
+
},
|
|
415
|
+
// **Dynamic CSS injection**
|
|
416
|
+
// Takes a string of css, inserts it into a `<style>`, then injects it in at the very top of the `<head>`. This ensures any user-defined styles will take precedence.
|
|
417
|
+
injectCss: function(audio, string) {
|
|
418
|
+
|
|
419
|
+
// If an `audiojs` `<style>` tag already exists, then append to it rather than creating a whole new `<style>`.
|
|
420
|
+
var prepend = '',
|
|
421
|
+
styles = document.getElementsByTagName('style'),
|
|
422
|
+
css = string.replace(/\$1/g, audio.settings.imageLocation);
|
|
423
|
+
|
|
424
|
+
for (var i = 0, ii = styles.length; i < ii; i++) {
|
|
425
|
+
var title = styles[i].getAttribute('title');
|
|
426
|
+
if (title && ~title.indexOf('audiojs')) {
|
|
427
|
+
style = styles[i];
|
|
428
|
+
if (style.innerHTML === css) return;
|
|
429
|
+
prepend = style.innerHTML;
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
var head = document.getElementsByTagName('head')[0],
|
|
435
|
+
firstchild = head.firstChild,
|
|
436
|
+
style = document.createElement('style');
|
|
437
|
+
|
|
438
|
+
if (!head) return;
|
|
439
|
+
|
|
440
|
+
style.setAttribute('type', 'text/css');
|
|
441
|
+
style.setAttribute('title', 'audiojs');
|
|
442
|
+
|
|
443
|
+
if (style.styleSheet) style.styleSheet.cssText = prepend + css;
|
|
444
|
+
else style.appendChild(document.createTextNode(prepend + css));
|
|
445
|
+
|
|
446
|
+
if (firstchild) head.insertBefore(style, firstchild);
|
|
447
|
+
else head.appendChild(styleElement);
|
|
448
|
+
},
|
|
449
|
+
// **Handle all the IE6+7 requirements for cloning `<audio>` nodes**
|
|
450
|
+
// Create a html5-safe document fragment by injecting an `<audio>` element into the document fragment.
|
|
451
|
+
cloneHtml5Node: function(audioTag) {
|
|
452
|
+
var fragment = document.createDocumentFragment(),
|
|
453
|
+
doc = fragment.createElement ? fragment : document;
|
|
454
|
+
doc.createElement('audio');
|
|
455
|
+
var div = doc.createElement('div');
|
|
456
|
+
fragment.appendChild(div);
|
|
457
|
+
div.innerHTML = audioTag.outerHTML;
|
|
458
|
+
return div.firstChild;
|
|
459
|
+
},
|
|
460
|
+
// **Cross-browser `<object>` / `<embed>` element selection**
|
|
461
|
+
getSwf: function(name) {
|
|
462
|
+
var swf = document[name] || window[name];
|
|
463
|
+
return swf.length > 1 ? swf[swf.length - 1] : swf;
|
|
464
|
+
}
|
|
465
|
+
},
|
|
466
|
+
// ## Event-handling
|
|
467
|
+
events: {
|
|
468
|
+
memoryLeaking: false,
|
|
469
|
+
listeners: [],
|
|
470
|
+
// **A simple cross-browser event handler abstraction**
|
|
471
|
+
addListener: function(element, eventName, func) {
|
|
472
|
+
// For modern browsers use the standard DOM-compliant `addEventListener`.
|
|
473
|
+
if (element.addEventListener) {
|
|
474
|
+
element.addEventListener(eventName, func, false);
|
|
475
|
+
// For older versions of Internet Explorer, use `attachEvent`.
|
|
476
|
+
// Also provide a fix for scoping `this` to the calling element and register each listener so the containing elements can be purged on page unload.
|
|
477
|
+
} else if (element.attachEvent) {
|
|
478
|
+
this.listeners.push(element);
|
|
479
|
+
if (!this.memoryLeaking) {
|
|
480
|
+
window.attachEvent('onunload', function() {
|
|
481
|
+
if(this.listeners) {
|
|
482
|
+
for (var i = 0, ii = this.listeners.length; i < ii; i++) {
|
|
483
|
+
container[audiojs].events.purge(this.listeners[i]);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
this.memoryLeaking = true;
|
|
488
|
+
}
|
|
489
|
+
element.attachEvent('on' + eventName, function() {
|
|
490
|
+
func.call(element, window.event);
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
|
|
495
|
+
trackLoadProgress: function(audio) {
|
|
496
|
+
// If `preload` has been set to `none`, then we don't want to start loading the track yet.
|
|
497
|
+
if (!audio.settings.preload) return;
|
|
498
|
+
|
|
499
|
+
var readyTimer,
|
|
500
|
+
loadTimer,
|
|
501
|
+
audio = audio,
|
|
502
|
+
ios = (/(ipod|iphone|ipad)/i).test(navigator.userAgent);
|
|
503
|
+
|
|
504
|
+
// Use timers here rather than the official `progress` event, as Chrome has issues calling `progress` when loading mp3 files from cache.
|
|
505
|
+
readyTimer = setInterval(function() {
|
|
506
|
+
if (audio.element.readyState > -1) {
|
|
507
|
+
// iOS doesn't start preloading the mp3 until the user interacts manually, so this stops the loader being displayed prematurely.
|
|
508
|
+
if (!ios) audio.init.apply(audio);
|
|
509
|
+
}
|
|
510
|
+
if (audio.element.readyState > 1) {
|
|
511
|
+
if (audio.settings.autoplay) audio.play.apply(audio);
|
|
512
|
+
clearInterval(readyTimer);
|
|
513
|
+
// Once we have data, start tracking the load progress.
|
|
514
|
+
loadTimer = setInterval(function() {
|
|
515
|
+
audio.loadProgress.apply(audio);
|
|
516
|
+
if (audio.loadedPercent >= 1) clearInterval(loadTimer);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}, 10);
|
|
520
|
+
audio.readyTimer = readyTimer;
|
|
521
|
+
audio.loadTimer = loadTimer;
|
|
522
|
+
},
|
|
523
|
+
|
|
524
|
+
// **Douglas Crockford's IE6 memory leak fix**
|
|
525
|
+
// <http://javascript.crockford.com/memory/leak.html>
|
|
526
|
+
// This is used to release the memory leak created by the circular references created when fixing `this` scoping for IE. It is called on page unload.
|
|
527
|
+
purge: function(d) {
|
|
528
|
+
var a = d.attributes, i;
|
|
529
|
+
if (a) {
|
|
530
|
+
for (i = 0; i < a.length; i += 1) {
|
|
531
|
+
if (typeof d[a[i].name] === 'function') d[a[i].name] = null;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
a = d.childNodes;
|
|
535
|
+
if (a) {
|
|
536
|
+
for (i = 0; i < a.length; i += 1) purge(d.childNodes[i]);
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
|
|
540
|
+
// **DOMready function**
|
|
541
|
+
// As seen here: <https://github.com/dperini/ContentLoaded/>.
|
|
542
|
+
ready: (function() { return function(fn) {
|
|
543
|
+
var win = window, done = false, top = true,
|
|
544
|
+
doc = win.document, root = doc.documentElement,
|
|
545
|
+
add = doc.addEventListener ? 'addEventListener' : 'attachEvent',
|
|
546
|
+
rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent',
|
|
547
|
+
pre = doc.addEventListener ? '' : 'on',
|
|
548
|
+
init = function(e) {
|
|
549
|
+
if (e.type == 'readystatechange' && doc.readyState != 'complete') return;
|
|
550
|
+
(e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);
|
|
551
|
+
if (!done && (done = true)) fn.call(win, e.type || e);
|
|
552
|
+
},
|
|
553
|
+
poll = function() {
|
|
554
|
+
try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; }
|
|
555
|
+
init('poll');
|
|
556
|
+
};
|
|
557
|
+
if (doc.readyState == 'complete') fn.call(win, 'lazy');
|
|
558
|
+
else {
|
|
559
|
+
if (doc.createEventObject && root.doScroll) {
|
|
560
|
+
try { top = !win.frameElement; } catch(e) { }
|
|
561
|
+
if (top) poll();
|
|
562
|
+
}
|
|
563
|
+
doc[add](pre + 'DOMContentLoaded', init, false);
|
|
564
|
+
doc[add](pre + 'readystatechange', init, false);
|
|
565
|
+
win[add](pre + 'load', init, false);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
})()
|
|
569
|
+
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// ## The audiojs class
|
|
574
|
+
// We create one of these per `<audio>` and then push them into `audiojs['instances']`.
|
|
575
|
+
container[audiojsInstance] = function(element, settings) {
|
|
576
|
+
// Each audio instance returns an object which contains an API back into the `<audio>` element.
|
|
577
|
+
this.element = element;
|
|
578
|
+
this.wrapper = element.parentNode;
|
|
579
|
+
this.source = element.getElementsByTagName('source')[0] || element;
|
|
580
|
+
// First check the `<audio>` element directly for a src and if one is not found, look for a `<source>` element.
|
|
581
|
+
this.mp3 = (function(element) {
|
|
582
|
+
var source = element.getElementsByTagName('source')[0];
|
|
583
|
+
return element.getAttribute('src') || (source ? source.getAttribute('src') : null);
|
|
584
|
+
})(element);
|
|
585
|
+
this.settings = settings;
|
|
586
|
+
this.loadStartedCalled = false;
|
|
587
|
+
this.loadedPercent = 0;
|
|
588
|
+
this.duration = 1;
|
|
589
|
+
this.playing = false;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
container[audiojsInstance].prototype = {
|
|
593
|
+
// API access events:
|
|
594
|
+
// Each of these do what they need do and then call the matching methods defined in the settings object.
|
|
595
|
+
updatePlayhead: function() {
|
|
596
|
+
var percent = this.element.currentTime / this.duration;
|
|
597
|
+
this.settings.updatePlayhead.apply(this, [percent]);
|
|
598
|
+
},
|
|
599
|
+
skipTo: function(percent) {
|
|
600
|
+
if (percent > this.loadedPercent) return;
|
|
601
|
+
this.element.currentTime = this.duration * percent;
|
|
602
|
+
this.updatePlayhead();
|
|
603
|
+
},
|
|
604
|
+
load: function(mp3) {
|
|
605
|
+
this.loadStartedCalled = false;
|
|
606
|
+
this.source.setAttribute('src', mp3);
|
|
607
|
+
// The now outdated `load()` method is required for Safari 4
|
|
608
|
+
this.element.load();
|
|
609
|
+
this.mp3 = mp3;
|
|
610
|
+
container[audiojs].events.trackLoadProgress(this);
|
|
611
|
+
},
|
|
612
|
+
loadError: function() {
|
|
613
|
+
this.settings.loadError.apply(this);
|
|
614
|
+
},
|
|
615
|
+
init: function() {
|
|
616
|
+
this.settings.init.apply(this);
|
|
617
|
+
},
|
|
618
|
+
loadStarted: function() {
|
|
619
|
+
// Wait until `element.duration` exists before setting up the audio player.
|
|
620
|
+
if (!this.element.duration) return false;
|
|
621
|
+
|
|
622
|
+
this.duration = this.element.duration;
|
|
623
|
+
this.updatePlayhead();
|
|
624
|
+
this.settings.loadStarted.apply(this);
|
|
625
|
+
},
|
|
626
|
+
loadProgress: function() {
|
|
627
|
+
if (this.element.buffered != null && this.element.buffered.length) {
|
|
628
|
+
// Ensure `loadStarted()` is only called once.
|
|
629
|
+
if (!this.loadStartedCalled) {
|
|
630
|
+
this.loadStartedCalled = this.loadStarted();
|
|
631
|
+
}
|
|
632
|
+
var durationLoaded = this.element.buffered.end(this.element.buffered.length - 1);
|
|
633
|
+
this.loadedPercent = durationLoaded / this.duration;
|
|
634
|
+
|
|
635
|
+
this.settings.loadProgress.apply(this, [this.loadedPercent]);
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
playPause: function() {
|
|
639
|
+
if (this.playing) this.pause();
|
|
640
|
+
else this.play();
|
|
641
|
+
},
|
|
642
|
+
play: function() {
|
|
643
|
+
var ios = (/(ipod|iphone|ipad)/i).test(navigator.userAgent);
|
|
644
|
+
// On iOS this interaction will trigger loading the mp3, so run `init()`.
|
|
645
|
+
if (ios && this.element.readyState == 0) this.init.apply(this);
|
|
646
|
+
// If the audio hasn't started preloading, then start it now.
|
|
647
|
+
// Then set `preload` to `true`, so that any tracks loaded in subsequently are loaded straight away.
|
|
648
|
+
if (!this.settings.preload) {
|
|
649
|
+
this.settings.preload = true;
|
|
650
|
+
this.element.setAttribute('preload', 'auto');
|
|
651
|
+
container[audiojs].events.trackLoadProgress(this);
|
|
652
|
+
}
|
|
653
|
+
this.playing = true;
|
|
654
|
+
this.element.play();
|
|
655
|
+
this.settings.play.apply(this);
|
|
656
|
+
},
|
|
657
|
+
pause: function() {
|
|
658
|
+
this.playing = false;
|
|
659
|
+
this.element.pause();
|
|
660
|
+
this.settings.pause.apply(this);
|
|
661
|
+
},
|
|
662
|
+
setVolume: function(v) {
|
|
663
|
+
this.element.volume = v;
|
|
664
|
+
},
|
|
665
|
+
trackEnded: function(e) {
|
|
666
|
+
this.skipTo.apply(this, [0]);
|
|
667
|
+
if (!this.settings.loop) this.pause.apply(this);
|
|
668
|
+
this.settings.trackEnded.apply(this);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// **getElementsByClassName**
|
|
673
|
+
// Having to rely on `getElementsByTagName` is pretty inflexible internally, so a modified version of Dustin Diaz's `getElementsByClassName` has been included.
|
|
674
|
+
// This version cleans things up and prefers the native DOM method if it's available.
|
|
675
|
+
var getByClass = function(searchClass, node) {
|
|
676
|
+
var matches = [];
|
|
677
|
+
node = node || document;
|
|
678
|
+
|
|
679
|
+
if (node.getElementsByClassName) {
|
|
680
|
+
matches = node.getElementsByClassName(searchClass);
|
|
681
|
+
} else {
|
|
682
|
+
var i, l,
|
|
683
|
+
els = node.getElementsByTagName("*"),
|
|
684
|
+
pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
|
|
685
|
+
|
|
686
|
+
for (i = 0, l = els.length; i < l; i++) {
|
|
687
|
+
if (pattern.test(els[i].className)) {
|
|
688
|
+
matches.push(els[i]);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
return matches.length > 1 ? matches : matches[0];
|
|
693
|
+
};
|
|
694
|
+
// The global variable names are passed in here and can be changed if they conflict with anything else.
|
|
695
|
+
})('audiojs', 'audiojsInstance', this);
|