hancock_cms 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +113 -0
- data/Rakefile +1 -0
- data/app/assets/images/devices/login-bg.jpg +0 -0
- data/app/assets/images/rails-admin/hancock_logo.svg +5 -0
- data/app/assets/javascripts/hancock/app/back_to_top.coffee +24 -0
- data/app/assets/javascripts/hancock/cms.coffee +11 -0
- data/app/assets/javascripts/hancock/cms/flash.coffee +3 -0
- data/app/assets/javascripts/hancock/cms/init.coffee +1 -0
- data/app/assets/javascripts/hancock/cms/map.coffee +22 -0
- data/app/assets/javascripts/hancock/rails_admin/cms.ui.coffee +43 -0
- data/app/assets/javascripts/hancock/rails_admin/custom/ui.coffee +0 -0
- data/app/assets/javascripts/head.load.js +707 -0
- data/app/assets/javascripts/jquery.placeholder.js +157 -0
- data/app/assets/javascripts/rails_admin/custom/ui.coffee +2 -0
- data/app/assets/stylesheets/hancock/cms.sass +9 -0
- data/app/assets/stylesheets/hancock/cms/devise.sass +157 -0
- data/app/assets/stylesheets/hancock/cms/flash.sass +69 -0
- data/app/assets/stylesheets/hancock/cms/mixins.sass +98 -0
- data/app/assets/stylesheets/hancock/cms/normalize.scss +407 -0
- data/app/assets/stylesheets/hancock/cms/powered.sass +18 -0
- data/app/assets/stylesheets/hancock/rails_admin/cms.theming.sass +703 -0
- data/app/assets/stylesheets/hancock/rails_admin/custom/theming.sass +1 -0
- data/app/assets/stylesheets/hancock/toplink/toplink.sass +24 -0
- data/app/assets/stylesheets/rails_admin/custom/theming.sass +4 -0
- data/app/controllers/concerns/hancock/current_user.rb +12 -0
- data/app/controllers/concerns/hancock/decorators/home.rb +12 -0
- data/app/controllers/concerns/hancock/decorators/registrations.rb +5 -0
- data/app/controllers/concerns/hancock/decorators/sessions.rb +5 -0
- data/app/controllers/concerns/hancock/errors.rb +94 -0
- data/app/controllers/concerns/hancock/fancybox.rb +14 -0
- data/app/controllers/concerns/hancock/no_cache.rb +12 -0
- data/app/controllers/hancock/home_controller.rb +10 -0
- data/app/controllers/hancock/registrations_controller.rb +23 -0
- data/app/controllers/hancock/sessions_controller.rb +24 -0
- data/app/helpers/hancock/gzip_helper.rb +27 -0
- data/app/helpers/hancock/home_helper.rb +2 -0
- data/app/helpers/hancock/powered_helper.rb +42 -0
- data/app/models/concerns/hancock/boolean_field.rb +21 -0
- data/app/models/concerns/hancock/cacheable.rb +33 -0
- data/app/models/concerns/hancock/decorators/embedded_element.rb +28 -0
- data/app/models/concerns/hancock/enableable.rb +8 -0
- data/app/models/concerns/hancock/geocodeable.rb +4 -0
- data/app/models/concerns/hancock/hash_field.rb +113 -0
- data/app/models/concerns/hancock/html_field.rb +33 -0
- data/app/models/concerns/hancock/mappable.rb +91 -0
- data/app/models/concerns/hancock/model_localizeable.rb +33 -0
- data/app/models/concerns/hancock/rails_admin_patch.rb +86 -0
- data/app/models/concerns/hancock/sort_field.rb +20 -0
- data/app/models/concerns/hancock/sortable.rb +8 -0
- data/app/models/hancock/embedded_element.rb +17 -0
- data/app/views/blocks/_favicon.html.slim +60 -0
- data/app/views/blocks/_footer.html.slim +1 -0
- data/app/views/blocks/_header.html.slim +3 -0
- data/app/views/devise/passwords/edit.html.slim +29 -0
- data/app/views/devise/passwords/new.html.slim +19 -0
- data/app/views/devise/registrations/edit.html.slim +31 -0
- data/app/views/devise/registrations/new.html.slim +39 -0
- data/app/views/devise/sessions/new.html.slim +39 -0
- data/app/views/devise/shared/_links.html.slim +11 -0
- data/app/views/hancock/errors/_base.html.slim +3 -0
- data/app/views/hancock/errors/error_403.html.slim +1 -0
- data/app/views/hancock/errors/error_404.html.slim +1 -0
- data/app/views/hancock/errors/error_500.html.slim +1 -0
- data/app/views/hancock/home/index.html.slim +1 -0
- data/app/views/hancock/simple_captcha/_simple_captcha.html.slim +13 -0
- data/app/views/hancock/toplink/_toplink.html.slim +2 -0
- data/app/views/layouts/application.html.slim +35 -0
- data/app/views/layouts/hancock/devise/confirmations.html.slim +22 -0
- data/app/views/layouts/hancock/devise/passwords.html.slim +22 -0
- data/app/views/layouts/hancock/devise/registrations.html.slim +22 -0
- data/app/views/layouts/hancock/devise/sessions.html.slim +22 -0
- data/app/views/layouts/hancock/devise/unlocks.html.slim +22 -0
- data/app/views/layouts/rails_admin/_footer.html.slim +2 -0
- data/app/views/layouts/rails_admin/_footer_navigation.html.slim +20 -0
- data/app/views/layouts/rails_admin/_navigation.html.slim +73 -0
- data/app/views/layouts/rails_admin/_secondary_navigation.html.slim +32 -0
- data/app/views/layouts/rails_admin/application.html.haml +68 -0
- data/app/views/layouts/rails_admin/pjax.html.haml +17 -0
- data/app/views/rails_admin/main/_check_boxes.html.slim +27 -0
- data/app/views/rails_admin/main/_enum_check_boxes.html.slim +5 -0
- data/app/views/rails_admin/main/_enum_radio_buttons.html.slim +5 -0
- data/app/views/rails_admin/main/_form_hancock_multiselect.html.slim +48 -0
- data/app/views/rails_admin/main/_form_raw.html.slim +1 -0
- data/app/views/rails_admin/main/_hancock_hash.html.slim +9 -0
- data/app/views/rails_admin/main/_hancock_hash_ml.html.slim +10 -0
- data/app/views/rails_admin/main/_hancock_html.html.slim +16 -0
- data/app/views/rails_admin/main/_hancock_html_ml.html.slim +53 -0
- data/app/views/shared/_admin_link.html.slim +3 -0
- data/app/views/shared/_messages.html.slim +7 -0
- data/config/initializers/embedded_findable.rb +57 -0
- data/config/initializers/hancock_cms.rb +11 -0
- data/config/initializers/simple_captcha.rb +70 -0
- data/config/locales/en.hancock.yml +29 -0
- data/config/locales/en.hancock_admin.yml +6 -0
- data/config/locales/ru.cancan.yml +4 -0
- data/config/locales/ru.devise.yml +65 -0
- data/config/locales/ru.hancock.yml +36 -0
- data/config/locales/ru.hancock_admin.yml +6 -0
- data/config/locales/ru.models.yml +82 -0
- data/config/locales/ru.mongoid.yml +450 -0
- data/config/locales/ru.rails_admin.yml +168 -0
- data/hancock_cms.gemspec +46 -0
- data/lib/filename_to_slug.rb +32 -0
- data/lib/generators/hancock/cms/ability_generator.rb +14 -0
- data/lib/generators/hancock/cms/admin_generator.rb +21 -0
- data/lib/generators/hancock/cms/application_generator.rb +14 -0
- data/lib/generators/hancock/cms/assets_generator.rb +35 -0
- data/lib/generators/hancock/cms/config_generator.rb +13 -0
- data/lib/generators/hancock/cms/controllers/decorators_generator.rb +27 -0
- data/lib/generators/hancock/cms/gemfile_generator.rb +13 -0
- data/lib/generators/hancock/cms/layout_generator.rb +14 -0
- data/lib/generators/hancock/cms/model_generator.rb +39 -0
- data/lib/generators/hancock/cms/models/embedded_element_generator.rb +56 -0
- data/lib/generators/hancock/cms/models/templates/embedded_element.erb +47 -0
- data/lib/generators/hancock/cms/paperclip_optimizer_generator.rb +13 -0
- data/lib/generators/hancock/cms/rack_generator.rb +12 -0
- data/lib/generators/hancock/cms/robots_generator.rb +14 -0
- data/lib/generators/hancock/cms/scripts_generator.rb +31 -0
- data/lib/generators/hancock/cms/templates/Gemfile.erb +69 -0
- data/lib/generators/hancock/cms/templates/ability.erb +49 -0
- data/lib/generators/hancock/cms/templates/admin.erb +74 -0
- data/lib/generators/hancock/cms/templates/application.erb +42 -0
- data/lib/generators/hancock/cms/templates/assets/javascripts/application.coffee.erb +5 -0
- data/lib/generators/hancock/cms/templates/assets/stylesheets/application.sass.erb +88 -0
- data/lib/generators/hancock/cms/templates/hancock_cms.erb +30 -0
- data/lib/generators/hancock/cms/templates/model.erb +42 -0
- data/lib/generators/hancock/cms/templates/paperclip_optimizer.erb +80 -0
- data/lib/generators/hancock/cms/templates/rack.erb +15 -0
- data/lib/generators/hancock/cms/templates/robots.txt.erb +5 -0
- data/lib/generators/hancock/cms/templates/scripts/assets_precompile.sh +3 -0
- data/lib/generators/hancock/cms/templates/scripts/bundle_production.sh +4 -0
- data/lib/generators/hancock/cms/templates/scripts/db_dump.sh.erb +3 -0
- data/lib/generators/hancock/cms/templates/scripts/db_restore.sh +3 -0
- data/lib/generators/hancock/cms/templates/scripts/full_assets_precompile.sh +4 -0
- data/lib/generators/hancock/cms/templates/scripts/restart_thru_kill.sh +3 -0
- data/lib/generators/hancock/cms/templates/scripts/send_hup.sh +3 -0
- data/lib/generators/hancock/cms/templates/scripts/send_usr2.sh +3 -0
- data/lib/generators/hancock/cms/templates/scripts/server.sh +5 -0
- data/lib/generators/hancock/cms/templates/scripts/server_alt.sh +5 -0
- data/lib/generators/hancock/cms/templates/unicorn.erb +57 -0
- data/lib/generators/hancock/cms/templates/unicorn.god.erb +59 -0
- data/lib/generators/hancock/cms/unicorn_god_generator.rb +15 -0
- data/lib/generators/hancock/cms/utils.rb +21 -0
- data/lib/hancock/admin.rb +60 -0
- data/lib/hancock/admin/embedded_element.rb +26 -0
- data/lib/hancock/configuration.rb +48 -0
- data/lib/hancock/controller.rb +30 -0
- data/lib/hancock/engine.rb +48 -0
- data/lib/hancock/migration.rb +15 -0
- data/lib/hancock/model.rb +53 -0
- data/lib/hancock/models/embedded_element.rb +12 -0
- data/lib/hancock/models/mongoid/embedded_element.rb +14 -0
- data/lib/hancock/plugin.rb +25 -0
- data/lib/hancock/plugin_configuration.rb +30 -0
- data/lib/hancock/rails_admin_ext/config.rb +129 -0
- data/lib/hancock/rails_admin_ext/hancock_hash.rb +84 -0
- data/lib/hancock/rails_admin_ext/hancock_html.rb +79 -0
- data/lib/hancock/rails_admin_ext/hancock_multiselect.rb +44 -0
- data/lib/hancock/rails_admin_ext/hancock_slugs.rb +35 -0
- data/lib/hancock/rails_admin_ext/patches/field_patch.rb +14 -0
- data/lib/hancock/rails_admin_ext/patches/group_patch.rb +41 -0
- data/lib/hancock/rails_admin_ext/patches/hancock_cms_group.rb +61 -0
- data/lib/hancock/rails_admin_ext/patches/new_controller_patch.rb +54 -0
- data/lib/hancock/routes.rb +20 -0
- data/lib/hancock/simple_form_patch.rb +12 -0
- data/lib/hancock/tasks.rb +13 -0
- data/lib/hancock/version.rb +3 -0
- data/lib/hancock_cms.rb +130 -0
- data/lib/manual_slug.rb +10 -0
- data/lib/manual_slug/active_record.rb +32 -0
- data/lib/manual_slug/mongoid.rb +40 -0
- data/lib/rails_admin/custom_show_in_app.rb +43 -0
- data/release.sh +12 -0
- data/template.rb +564 -0
- metadata +455 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2bb11bbd769e8fe10d0b729feec21bab3dbc0d6f
|
4
|
+
data.tar.gz: 9c1e705aadab3d37bacde39c8db2f987ce0800c5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 041b271b62472f1e9a23a554be65e845a47b59115144b2dca7b2485d20b6d598f380dd0b879ec66556ae75d2e1ea3eb690689287ef9ab2b1dd7b87e8c7168f1d
|
7
|
+
data.tar.gz: e6877df62eb2d1275f466d8bf53d4b0936a272ca86238424b9ffc67cd26c8105bbbaf18cc0890f6469d5ac531e8188a38571ad541c2ee017c5a98ddfe911f3a8
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
.idea
|
2
|
+
.idea/*
|
3
|
+
|
4
|
+
*.gem
|
5
|
+
*.rbc
|
6
|
+
.bundle
|
7
|
+
.config
|
8
|
+
.yardoc
|
9
|
+
InstalledFiles
|
10
|
+
_yardoc
|
11
|
+
coverage
|
12
|
+
doc/
|
13
|
+
lib/bundler/man
|
14
|
+
pkg
|
15
|
+
rdoc
|
16
|
+
spec/reports
|
17
|
+
test/tmp
|
18
|
+
test/version_tmp
|
19
|
+
tmp
|
20
|
+
|
21
|
+
mongoid/Gemfile.lock
|
22
|
+
activerecord/Gemfile.lock
|
23
|
+
/Gemfile.lock
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
hancock_cms_rails4
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.1
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2016 Alexander Kiseliev
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# HancockCMS
|
2
|
+
|
3
|
+
#### Inspired by [RocketCMS](https://github.com/rs-pro/rocket_cms)
|
4
|
+
### Remaded from [EnjoyCMS](https://github.com/enjoycreative/enjoy_cms)
|
5
|
+
|
6
|
+
# DEVELOPMENT VERSION
|
7
|
+
|
8
|
+
Rails + RailsAdmin + Mongoid/PostgreSQL CMS
|
9
|
+
|
10
|
+
Very opinionated and tuned for my needs.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
gem 'hancock_cms_mongoid', '~> 1.0'
|
17
|
+
|
18
|
+
or:
|
19
|
+
|
20
|
+
gem 'hancock_cms_activerecord', '~> 1.0'
|
21
|
+
|
22
|
+
*Only PostgreSQL is tested or supported for AR(from root repo). Others will probably work, but untested.*
|
23
|
+
|
24
|
+
And then execute:
|
25
|
+
|
26
|
+
$ bundle
|
27
|
+
|
28
|
+
Or install it yourself as:
|
29
|
+
|
30
|
+
$ gem install hancock_cms -v 1.0
|
31
|
+
|
32
|
+
For activerecord, generate migrations and run them
|
33
|
+
|
34
|
+
rails g rails_admin_settings:migration
|
35
|
+
rails g hancock_cms:migration
|
36
|
+
rake db:migrate
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
### Using app generator
|
41
|
+
|
42
|
+
Make sure you have rails 4.2 installed
|
43
|
+
|
44
|
+
rails -v
|
45
|
+
|
46
|
+
If not, uninstall rails and install again
|
47
|
+
|
48
|
+
gem uninstall rails
|
49
|
+
gem install rails -v 4.2
|
50
|
+
|
51
|
+
Then, for mongoid:
|
52
|
+
|
53
|
+
rails new my_app -T -O -m https://raw.githubusercontent.com/red-rocks/hancock_cms/rails4/template.rb
|
54
|
+
|
55
|
+
for ActiveRecord:
|
56
|
+
|
57
|
+
rails new my_app -T --database=postgresql -m https://raw.githubusercontent.com/red-rocks/hancock_cms/rails4/template.rb
|
58
|
+
|
59
|
+
generator creates a new RVM gemset, so after cd'ing to app dir, you should run `bundle install` again if you use rvm.
|
60
|
+
|
61
|
+
### Localization
|
62
|
+
|
63
|
+
All models included in the gem support localization via either [hstore_translate](https://github.com/Leadformance/hstore_translate) or built-in Mongoid localize: true option.
|
64
|
+
|
65
|
+
You can get a nice admin UI for editing locales by adding [rails_admin_hstore_translate](https://github.com/glebtv/rails_admin_hstore_translate) or [rails_admin_mongoid_localize_field](https://github.com/sudosu/rails_admin_mongoid_localize_field)
|
66
|
+
|
67
|
+
<!-- Wrap your routes with locale scope:
|
68
|
+
```ruby
|
69
|
+
scope "(:locale)", locale: /en|ru/ do
|
70
|
+
hancock_cms_routes
|
71
|
+
end
|
72
|
+
``` -->
|
73
|
+
|
74
|
+
Enable localization in HancockCMS:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
Hancock.configure do |hancock|
|
78
|
+
hancock.localize = true
|
79
|
+
...
|
80
|
+
end
|
81
|
+
```
|
82
|
+
|
83
|
+
Add ```rails_admin_hstore_translate``` or ```hstore_translate``` gem if using PostgreSQL:
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
gem 'rails_admin_hstore_translate'
|
87
|
+
```
|
88
|
+
|
89
|
+
or
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
gem 'hstore_translate'
|
93
|
+
```
|
94
|
+
|
95
|
+
Add ```rails_admin_mongoid_localize_field``` gem if using MongoDB:
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
gem 'rails_admin_mongoid_localize_field'
|
99
|
+
```
|
100
|
+
|
101
|
+
### Documentation
|
102
|
+
|
103
|
+
It's basically Mongoid + Rails Admin + some of my common models and controllers, etc.
|
104
|
+
|
105
|
+
See their documentation for more info
|
106
|
+
|
107
|
+
## Contributing
|
108
|
+
|
109
|
+
1. Fork it
|
110
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
111
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
112
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
113
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
Binary file
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="hancock_logo" width="2925" height="512" viewBox="0 0 2925 512">
|
4
|
+
<path fill="#fff" d="M272.303 133.032l67.375 59.112 11.639-6.226 34.906-133.816 3.2-11.226-201.31-38.169 73.832 121.192 10.36 9.135zM618.658 125.816h55.506v97.921h122.706v-97.921h55.506v260.424h-55.506v-107.695h-122.648v107.695h-55.506v-260.424zM2527.032 218.095l26.881 2.734c-2.232 15.304-9.528 28.6-20.088 38.424-9.416 7.832-21.576 12.561-34.848 12.561-0.441 0-0.889-0.009-1.334-0.016-0.696 0.040-1.592 0.065-2.49 0.065-16.936 0-31.96-8.184-41.329-20.81-9.769-13.622-15.56-30.448-15.56-48.632 0-0.935 0.015-1.863 0.043-2.784-0.040-0.776-0.063-1.839-0.063-2.91 0-18.44 6.36-35.385 17-48.782 10.113-12.36 25.56-20.296 42.857-20.296 0.68 0 1.353 0.009 2.030 0.040q45.168-0.006 53.782 47.704l-26.881 3.666q-3.494-25.72-25.368-25.774c-0.414-0.024-0.903-0.040-1.385-0.040-9.633 0-17.945 5.64-21.823 13.8-4.632 9.352-7.305 20.192-7.305 31.656 0 0.744 0.008 1.487 0.034 2.226-0.056 0.832-0.088 1.928-0.088 3.034 0 10.632 2.84 20.601 7.8 29.192 4.018 6.729 11.559 11.359 20.175 11.359 0.177 0 0.354-0.002 0.53-0.008 13.646 0 22.778-8.785 27.258-26.414v0zM2784.258 268.946h-32.76v-86.168q0-26.881-23.854-26.824c-0.296-0.008-0.647-0.018-0.992-0.018-8.52 0-16.12 3.937-21.079 10.088-5.288 7.53-8.426 16.824-8.426 26.856 0 1.215 0.046 2.423 0.136 3.608l-0.008 72.456h-33.16v-86.168c0-18.152-7.448-27.288-22.344-27.288-0.056-0-0.127-0-0.199-0-9.129 0-17.266 4.28-22.504 10.936-5.864 7.537-9.368 17.058-9.368 27.4 0 0.887 0.024 1.761 0.073 2.632l-0.008 72.488h-32.232v-138.36h30.312v29.44q14.776-32.346 46.135-32.346t39.736 32.346q16.696-32.346 46.135-32.346c0.664-0.040 1.448-0.056 2.232-0.056 23.296 0 42.184 18.888 42.184 42.184 0 0.472-0.008 0.936-0.024 1.407l0.002 97.736zM2805.202 237.12l29.095-5.816q6.746 16.815 29.615 16.815 29.095 0 29.095-17.106c0.001-0.038 0.001-0.073 0.001-0.12 0-3.647-1.775-6.879-4.505-8.879-3-2.367-6.599-4.057-10.52-4.824l-25.352-4.793q-41.946-8.088-41.946-40.728c-0.006-0.192-0.008-0.423-0.008-0.648 0-12.040 5.096-22.891 13.247-30.52 8.923-8.52 22.072-12.824 39.646-12.824q43.814 0 53.586 32.232l-27.814 5.816c-2.968-10.415-11.226-15.592-24.904-15.592q-24.96 0-24.96 15.592c0 7.214 6.746 12.216 20.135 14.894l29.672 5.704q34.906 7.16 34.906 39.736c0.039 0.616 0.056 1.336 0.056 2.063 0 13.482-7.066 25.32-17.704 31.999-11.662 7.192-25.608 11.4-40.536 11.4-0.678 0-1.351-0.009-2.019-0.024-0.298 0.009-0.776 0.010-1.242 0.010-13.198 0-25.655-3.19-36.632-8.832-9.944-4.967-17.691-14.152-20.833-25.274l-0.072-0.287zM1051.243 168.584l72.026 217.656h-58.824l-65.224-201.776c-0.75-2.712-2.12-5.048-3.96-6.927-1.606-1.375-3.704-2.216-6.008-2.216-0.12 0-0.232 0.002-0.35 0.008-0.056-0.006-0.149-0.007-0.232-0.007-2.15 0-4.104 0.822-5.576 2.162-1.784 1.84-3.091 4.168-3.698 6.76l-65.303 201.992h-59.112l71.624-217.656c4.21-14.686 12.337-27.128 23.176-36.52 10.158-7.398 22.76-11.784 36.393-11.784 1.006 0 2.008 0.024 3 0.072 0.689-0.041 1.663-0.070 2.64-0.070 13.934 0 26.809 4.52 37.25 12.168 10.728 9 18.664 21.336 22.184 35.425l0.101 0.466zM1264.833 180.506l39.272 138.008c1.192 5.551 3.464 10.44 6.584 14.648 2.191 2.106 5.288 3.471 8.705 3.471 0.266 0 0.536-0.009 0.802-0.024 0.217 0.023 0.52 0.031 0.824 0.031 3.765 0 7.144-1.624 9.487-4.207 2.256-3.057 3.608-6.888 3.608-11.031 0-0.464-0.017-0.92-0.050-1.378l0.006-194.209h55.506v200.615q0 30.546-17.92 47.825t-50.040 17.454q-29.094 0-45.321-13.56c-10.761-9.016-19.32-24.495-25.544-46.546l-39.215-138.296c-1.144-5.496-3.353-10.344-6.416-14.536-2.186-2.104-5.288-3.464-8.703-3.464-0.266 0-0.536 0.008-0.802 0.024-0.264-0.024-0.608-0.040-0.958-0.040-3.704 0-7.048 1.558-9.416 4.047-2.216 2.984-3.545 6.737-3.545 10.798 0 0.482 0.022 0.958 0.056 1.432l-0.007 194.673h-55.561v-201.192q0-30.374 17.976-47.48t50.040-16.986q29.094 0 45.321 13.559c10.761 9.016 19.32 24.494 25.544 46.546v0zM1503.781 125.64h114.909v54.401h-109.615c-0.712-0.056-1.535-0.088-2.37-0.088-8.048 0-15.384 3.034-20.935 8.024-4.904 5.608-7.912 13.032-7.912 21.16 0 0.839 0.032 1.665 0.094 2.488l-0.008 88.68c-0.152 1.081-0.233 2.337-0.233 3.608 0 15.327 12.425 27.752 27.752 27.752 1.272 0 2.526-0.088 3.752-0.248l109.416 0.016v54.808h-114.854q-38.107 0-59.752-21.704t-21.64-60.041v-97.336q0-38.281 21.64-59.866t59.752-21.528v0zM1732.436 175.16c-0.681-0.056-1.48-0.086-2.288-0.086-8.072 0-15.434 3.032-21.016 8.024-4.903 5.512-7.912 12.856-7.912 20.898 0 0.824 0.032 1.643 0.094 2.456l-0.008 98.802c-0.152 1.081-0.233 2.337-0.233 3.608 0 15.327 12.425 27.752 27.752 27.752 1.272 0 2.526-0.088 3.752-0.248l73.752 0.016c1.081 0.152 2.337 0.233 3.608 0.233 15.328 0 27.752-12.425 27.752-27.752 0-1.272-0.088-2.526-0.248-3.752l0.016-98.767c0.056-0.703 0.088-1.522 0.088-2.345 0-8.042-3.015-15.384-7.97-20.953-5.52-4.934-12.888-7.961-20.954-7.961-0.808 0-1.607 0.030-2.392 0.088l-73.784-0.008zM1727.145 120.345h84.361q38.344 0 59.928 21.641t21.64 59.752v107.87q0 38.281-21.64 60.041t-59.928 21.816h-84.424q-38.107 0-59.695-21.816t-21.64-60.041v-107.695q0-38.168 21.64-59.752t59.695-21.641v0zM2006.012 125.585h114.91v54.401h-109.615c-0.712-0.056-1.535-0.088-2.37-0.088-8.048 0-15.384 3.034-20.935 8.024-4.904 5.608-7.912 13.032-7.912 21.16 0 0.839 0.032 1.665 0.094 2.488l-0.008 88.735c-0.152 1.081-0.233 2.337-0.233 3.608 0 15.327 12.425 27.752 27.752 27.752 1.272 0 2.526-0.088 3.752-0.248l109.416 0.016v54.808h-114.909q-38.107 0-59.752-21.704t-21.64-60.041v-97.336q0-38.281 21.64-59.866t59.752-21.528v0zM2149.49 125.585h55.506v98.152h38.632q31.535 0 44.334-6.456c8.705-4.392 15.104-12.28 17.408-21.768l19.656-69.695h58.184l-24.728 83.201c-3.096 11.512-9.361 21.281-17.793 28.625-8.744 7.095-19.545 11.831-31.383 13.178 12.887 0.962 24.84 5.442 34.842 12.504 7.521 6.199 14.27 19.112 20.146 38.839l25.425 84.072h-59.345l-19.72-72.376q-5.816-20.826-18.039-28.104t-46.080-7.272h-41.425v107.752h-55.506v-260.424zM25.259 375.768l-7.561 8.841 164.888 121.72-13.96-141.269-5.352-12.68-35.374-83.546-12.104 0.346-90.648 106.648zM10.658 158.344l140.455 5.816 8.84 10.535-50.792 92.392-100.306 97.575-7.736-206.721 9.544 0.408zM0.821 149.559v4.774l0.408-4.186v-1.161l-0.408 0.584zM173.569 16.144l83.256 110.952-2.504 13.095-100.306 17.864-140.8-19.144 153.426-132.015 6.921 9.254zM174.435 0.144v0zM399.546 42.733v0zM491.24 240.84l-126.664 56.026-12.216-5.352 4.361-89.601 0.64-13.734 48.696-133.176 95.707 181.176-10.534 4.655zM408.851 440.469l10.24 5.352 82.094-187.87-134.695 45.094-84.015 60.454 3.432 12.974 122.936 64zM401.584 458.792l-197.935 53.352-2.214-11.639-26.586-135.975 7.912-10.76 99.666 27.928 119.16 77.147zM235.008 265.688v0l-56.84 76.975-10.648-3.080-29.559-71.041 97.048-2.854zM246.178 267.784l-57.425 77.906 73.135 21 9.079-6.456-24.786-92.454zM254.849 260.334v0l87.68 38.226-0.584 11.055-61.848 44.28-25.016-93.44zM254.436 248.696l84.536-44.68 8.32 7.386-4.186 76.28-88.666-38.695zM261.713 154.792l1.28-6.865 10.936-1.864 56.841 50.616-85.586 45.56 16.466-87.272zM234.193 245.146v0l-62.081-72.146 5.816-10.12 74.472-12.744-18.214 95.014zM245.249 242.184v0 0zM229.65 255.624l-95.592 3.546-4.248-10.184 36.946-66.441z"></path>
|
5
|
+
</svg>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
slide_to_top = () ->
|
2
|
+
|
3
|
+
pos = $(window).scrollTop()
|
4
|
+
|
5
|
+
if pos > 100
|
6
|
+
$('.toplink').addClass('active')
|
7
|
+
|
8
|
+
$(window).scroll ->
|
9
|
+
if $(this).scrollTop() > 100
|
10
|
+
$('.toplink').addClass('active')
|
11
|
+
else
|
12
|
+
$('.toplink').removeClass('active')
|
13
|
+
|
14
|
+
$('.toplink').click ->
|
15
|
+
$('html, body').stop().animate { scrollTop: 0 }, 500,'swing', ->
|
16
|
+
$('.toplink').removeClass('active')
|
17
|
+
return false
|
18
|
+
return false
|
19
|
+
|
20
|
+
$(window).on 'load', ->
|
21
|
+
slide_to_top()
|
22
|
+
|
23
|
+
$(document).bind "page:load", ->
|
24
|
+
slide_to_top()
|
@@ -0,0 +1 @@
|
|
1
|
+
window.hancock_cms ||= {}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
window.ya_init = ->
|
2
|
+
$('.ymap').not('.done').addClass('done').each ->
|
3
|
+
$m = $(this)
|
4
|
+
coord = [$m.data('lat'), $m.data('lon')]
|
5
|
+
map = new ymaps.Map($m[0],
|
6
|
+
center: coord
|
7
|
+
zoom: 14,
|
8
|
+
behaviors: ['default'] #, 'scrollZoom']
|
9
|
+
)
|
10
|
+
map.controls.add('zoomControl', { left: 5, top: 5 })
|
11
|
+
obj = new ymaps.Placemark(coord,
|
12
|
+
hintContent: $m.data('hint')
|
13
|
+
balloonContent: $m.data('hint') + ' ' + $m.data('addr')
|
14
|
+
)
|
15
|
+
map.geoObjects.add obj
|
16
|
+
|
17
|
+
$(document).on 'page:change', ->
|
18
|
+
return if $('.ymap').not('.done').length == 0
|
19
|
+
if window.ymaps
|
20
|
+
ya_init()
|
21
|
+
else
|
22
|
+
head.load "//api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU&onload=ya_init"
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#= require jquery.mCustomScrollbar.concat.min
|
2
|
+
|
3
|
+
window.hancock_cms ||= {}
|
4
|
+
window.hancock_cms.multiselect_dblclick = (selector)->
|
5
|
+
$(document).delegate selector + ' .ra-multiselect-left select option', 'dblclick', (e)->
|
6
|
+
$(e.currentTarget).closest('.ra-multiselect').find('.ra-multiselect-center .ra-multiselect-item-add').click()
|
7
|
+
|
8
|
+
$(document).delegate selector + ' .ra-multiselect-right select option', 'dblclick', (e)->
|
9
|
+
$(e.currentTarget).closest('.ra-multiselect').find('.ra-multiselect-center .ra-multiselect-item-remove').click()
|
10
|
+
|
11
|
+
window.hancock_cms.multiselect_dblclick("select.hancock_multiselect + .ra-multiselect")
|
12
|
+
|
13
|
+
|
14
|
+
$(document).delegate '.toolbar .nav .dropdown-header', 'click', (e)->
|
15
|
+
e.preventDefault()
|
16
|
+
_target = $(e.currentTarget).toggleClass('opened')
|
17
|
+
li = _target.next()
|
18
|
+
loop
|
19
|
+
li.toggleClass('visible')
|
20
|
+
li = li.next()
|
21
|
+
break if li.length == 0 or li.hasClass('dropdown-header')
|
22
|
+
|
23
|
+
$(document).on 'pjax:complete ready', ()->
|
24
|
+
active_nav_element = $(".toolbar .nav .active")
|
25
|
+
if active_nav_element.length > 0
|
26
|
+
_parent = active_nav_element.prevAll(".dropdown-header:first")
|
27
|
+
if _parent.length > 0 and !_parent.hasClass('opened')
|
28
|
+
_parent.click()
|
29
|
+
|
30
|
+
mscroll = () ->
|
31
|
+
$('.toolbar').mCustomScrollbar(
|
32
|
+
scrollInertia: 60
|
33
|
+
mouseWheelPixels: 60
|
34
|
+
theme: 'minimal'
|
35
|
+
mouseWheel:
|
36
|
+
scrollAmount: 0
|
37
|
+
)
|
38
|
+
|
39
|
+
$(window).on 'load', ->
|
40
|
+
mscroll()
|
41
|
+
|
42
|
+
$(document).bind "page:load", ->
|
43
|
+
mscroll()
|
File without changes
|
@@ -0,0 +1,707 @@
|
|
1
|
+
///#source 1 1 /src/1.0.0/load.js
|
2
|
+
/*! head.load - v1.0.3 */
|
3
|
+
/*
|
4
|
+
* HeadJS The only script in your <HEAD>
|
5
|
+
* Author Tero Piirainen (tipiirai)
|
6
|
+
* Maintainer Robert Hoffmann (itechnology)
|
7
|
+
* License MIT / http://bit.ly/mit-license
|
8
|
+
* WebSite http://headjs.com
|
9
|
+
*/
|
10
|
+
(function (win, undefined) {
|
11
|
+
"use strict";
|
12
|
+
|
13
|
+
//#region variables
|
14
|
+
var doc = win.document,
|
15
|
+
domWaiters = [],
|
16
|
+
handlers = {}, // user functions waiting for events
|
17
|
+
assets = {}, // loadable items in various states
|
18
|
+
isAsync = "async" in doc.createElement("script") || "MozAppearance" in doc.documentElement.style || win.opera,
|
19
|
+
isDomReady,
|
20
|
+
|
21
|
+
/*** public API ***/
|
22
|
+
headVar = win.head_conf && win.head_conf.head || "head",
|
23
|
+
api = win[headVar] = (win[headVar] || function () { api.ready.apply(null, arguments); }),
|
24
|
+
|
25
|
+
// states
|
26
|
+
PRELOADING = 1,
|
27
|
+
PRELOADED = 2,
|
28
|
+
LOADING = 3,
|
29
|
+
LOADED = 4;
|
30
|
+
//#endregion
|
31
|
+
|
32
|
+
//#region PRIVATE functions
|
33
|
+
|
34
|
+
//#region Helper functions
|
35
|
+
function noop() {
|
36
|
+
// does nothing
|
37
|
+
}
|
38
|
+
|
39
|
+
function each(arr, callback) {
|
40
|
+
if (!arr) {
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
|
44
|
+
// arguments special type
|
45
|
+
if (typeof arr === "object") {
|
46
|
+
arr = [].slice.call(arr);
|
47
|
+
}
|
48
|
+
|
49
|
+
// do the job
|
50
|
+
for (var i = 0, l = arr.length; i < l; i++) {
|
51
|
+
callback.call(arr, arr[i], i);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
/* A must read: http://bonsaiden.github.com/JavaScript-Garden
|
56
|
+
************************************************************/
|
57
|
+
function is(type, obj) {
|
58
|
+
var clas = Object.prototype.toString.call(obj).slice(8, -1);
|
59
|
+
return obj !== undefined && obj !== null && clas === type;
|
60
|
+
}
|
61
|
+
|
62
|
+
function isFunction(item) {
|
63
|
+
return is("Function", item);
|
64
|
+
}
|
65
|
+
|
66
|
+
function isArray(item) {
|
67
|
+
return is("Array", item);
|
68
|
+
}
|
69
|
+
|
70
|
+
function toLabel(url) {
|
71
|
+
///<summary>Converts a url to a file label</summary>
|
72
|
+
var items = url.split("/"),
|
73
|
+
name = items[items.length - 1],
|
74
|
+
i = name.indexOf("?");
|
75
|
+
|
76
|
+
return i !== -1 ? name.substring(0, i) : name;
|
77
|
+
}
|
78
|
+
|
79
|
+
// INFO: this look like a "im triggering callbacks all over the place, but only wanna run it one time function" ..should try to make everything work without it if possible
|
80
|
+
// INFO: Even better. Look into promises/defered's like jQuery is doing
|
81
|
+
function one(callback) {
|
82
|
+
///<summary>Execute a callback only once</summary>
|
83
|
+
callback = callback || noop;
|
84
|
+
|
85
|
+
if (callback._done) {
|
86
|
+
return;
|
87
|
+
}
|
88
|
+
|
89
|
+
callback();
|
90
|
+
callback._done = 1;
|
91
|
+
}
|
92
|
+
//#endregion
|
93
|
+
|
94
|
+
function conditional(test, success, failure, callback) {
|
95
|
+
///<summary>
|
96
|
+
/// INFO: use cases:
|
97
|
+
/// head.test(condition, null , "file.NOk" , callback);
|
98
|
+
/// head.test(condition, "fileOk.js", null , callback);
|
99
|
+
/// head.test(condition, "fileOk.js", "file.NOk" , callback);
|
100
|
+
/// head.test(condition, "fileOk.js", ["file.NOk", "file.NOk"], callback);
|
101
|
+
/// head.test({
|
102
|
+
/// test : condition,
|
103
|
+
/// success : [{ label1: "file1Ok.js" }, { label2: "file2Ok.js" }],
|
104
|
+
/// failure : [{ label1: "file1NOk.js" }, { label2: "file2NOk.js" }],
|
105
|
+
/// callback: callback
|
106
|
+
/// );
|
107
|
+
/// head.test({
|
108
|
+
/// test : condition,
|
109
|
+
/// success : ["file1Ok.js" , "file2Ok.js"],
|
110
|
+
/// failure : ["file1NOk.js", "file2NOk.js"],
|
111
|
+
/// callback: callback
|
112
|
+
/// );
|
113
|
+
///</summary>
|
114
|
+
var obj = (typeof test === "object") ? test : {
|
115
|
+
test: test,
|
116
|
+
success: !!success ? isArray(success) ? success : [success] : false,
|
117
|
+
failure: !!failure ? isArray(failure) ? failure : [failure] : false,
|
118
|
+
callback: callback || noop
|
119
|
+
};
|
120
|
+
|
121
|
+
// Test Passed ?
|
122
|
+
var passed = !!obj.test;
|
123
|
+
|
124
|
+
// Do we have a success case
|
125
|
+
if (passed && !!obj.success) {
|
126
|
+
obj.success.push(obj.callback);
|
127
|
+
api.load.apply(null, obj.success);
|
128
|
+
}
|
129
|
+
// Do we have a fail case
|
130
|
+
else if (!passed && !!obj.failure) {
|
131
|
+
obj.failure.push(obj.callback);
|
132
|
+
api.load.apply(null, obj.failure);
|
133
|
+
}
|
134
|
+
else {
|
135
|
+
callback();
|
136
|
+
}
|
137
|
+
|
138
|
+
return api;
|
139
|
+
}
|
140
|
+
|
141
|
+
function getAsset(item) {
|
142
|
+
///<summary>
|
143
|
+
/// Assets are in the form of
|
144
|
+
/// {
|
145
|
+
/// name : label,
|
146
|
+
/// url : url,
|
147
|
+
/// state: state
|
148
|
+
/// }
|
149
|
+
///</summary>
|
150
|
+
var asset = {};
|
151
|
+
|
152
|
+
if (typeof item === "object") {
|
153
|
+
for (var label in item) {
|
154
|
+
if (!!item[label]) {
|
155
|
+
asset = {
|
156
|
+
name: label,
|
157
|
+
url : item[label]
|
158
|
+
};
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|
162
|
+
else {
|
163
|
+
asset = {
|
164
|
+
name: toLabel(item),
|
165
|
+
url : item
|
166
|
+
};
|
167
|
+
}
|
168
|
+
|
169
|
+
// is the item already existant
|
170
|
+
var existing = assets[asset.name];
|
171
|
+
if (existing && existing.url === asset.url) {
|
172
|
+
return existing;
|
173
|
+
}
|
174
|
+
|
175
|
+
assets[asset.name] = asset;
|
176
|
+
return asset;
|
177
|
+
}
|
178
|
+
|
179
|
+
function allLoaded(items) {
|
180
|
+
items = items || assets;
|
181
|
+
|
182
|
+
for (var name in items) {
|
183
|
+
if (items.hasOwnProperty(name) && items[name].state !== LOADED) {
|
184
|
+
return false;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
return true;
|
189
|
+
}
|
190
|
+
|
191
|
+
function onPreload(asset) {
|
192
|
+
asset.state = PRELOADED;
|
193
|
+
|
194
|
+
each(asset.onpreload, function (afterPreload) {
|
195
|
+
afterPreload.call();
|
196
|
+
});
|
197
|
+
}
|
198
|
+
|
199
|
+
function preLoad(asset, callback) {
|
200
|
+
if (asset.state === undefined) {
|
201
|
+
|
202
|
+
asset.state = PRELOADING;
|
203
|
+
asset.onpreload = [];
|
204
|
+
|
205
|
+
loadAsset({ url: asset.url, type: "cache" }, function () {
|
206
|
+
onPreload(asset);
|
207
|
+
});
|
208
|
+
}
|
209
|
+
}
|
210
|
+
|
211
|
+
function apiLoadHack() {
|
212
|
+
/// <summary>preload with text/cache hack
|
213
|
+
///
|
214
|
+
/// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
|
215
|
+
/// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
|
216
|
+
/// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
|
217
|
+
/// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
|
218
|
+
/// </summary>
|
219
|
+
var args = arguments,
|
220
|
+
callback = args[args.length - 1],
|
221
|
+
rest = [].slice.call(args, 1),
|
222
|
+
next = rest[0];
|
223
|
+
|
224
|
+
if (!isFunction(callback)) {
|
225
|
+
callback = null;
|
226
|
+
}
|
227
|
+
|
228
|
+
// if array, repush as args
|
229
|
+
if (isArray(args[0])) {
|
230
|
+
args[0].push(callback);
|
231
|
+
api.load.apply(null, args[0]);
|
232
|
+
|
233
|
+
return api;
|
234
|
+
}
|
235
|
+
|
236
|
+
// multiple arguments
|
237
|
+
if (!!next) {
|
238
|
+
/* Preload with text/cache hack (not good!)
|
239
|
+
* http://blog.getify.com/on-script-loaders/
|
240
|
+
* http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
|
241
|
+
* If caching is not configured correctly on the server, then items could load twice !
|
242
|
+
*************************************************************************************/
|
243
|
+
each(rest, function (item) {
|
244
|
+
// item is not a callback or empty string
|
245
|
+
if (!isFunction(item) && !!item) {
|
246
|
+
preLoad(getAsset(item));
|
247
|
+
}
|
248
|
+
});
|
249
|
+
|
250
|
+
// execute
|
251
|
+
load(getAsset(args[0]), isFunction(next) ? next : function () {
|
252
|
+
api.load.apply(null, rest);
|
253
|
+
});
|
254
|
+
}
|
255
|
+
else {
|
256
|
+
// single item
|
257
|
+
load(getAsset(args[0]));
|
258
|
+
}
|
259
|
+
|
260
|
+
return api;
|
261
|
+
}
|
262
|
+
|
263
|
+
function apiLoadAsync() {
|
264
|
+
///<summary>
|
265
|
+
/// simply load and let browser take care of ordering
|
266
|
+
///
|
267
|
+
/// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
|
268
|
+
/// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
|
269
|
+
/// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
|
270
|
+
/// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
|
271
|
+
///</summary>
|
272
|
+
var args = arguments,
|
273
|
+
callback = args[args.length - 1],
|
274
|
+
items = {};
|
275
|
+
|
276
|
+
if (!isFunction(callback)) {
|
277
|
+
callback = null;
|
278
|
+
}
|
279
|
+
|
280
|
+
// if array, repush as args
|
281
|
+
if (isArray(args[0])) {
|
282
|
+
args[0].push(callback);
|
283
|
+
api.load.apply(null, args[0]);
|
284
|
+
|
285
|
+
return api;
|
286
|
+
}
|
287
|
+
|
288
|
+
// JRH 262#issuecomment-26288601
|
289
|
+
// First populate the items array.
|
290
|
+
// When allLoaded is called, all items will be populated.
|
291
|
+
// Issue when lazy loaded, the callback can execute early.
|
292
|
+
each(args, function (item, i) {
|
293
|
+
if (item !== callback) {
|
294
|
+
item = getAsset(item);
|
295
|
+
items[item.name] = item;
|
296
|
+
}
|
297
|
+
});
|
298
|
+
|
299
|
+
each(args, function (item, i) {
|
300
|
+
if (item !== callback) {
|
301
|
+
item = getAsset(item);
|
302
|
+
|
303
|
+
load(item, function () {
|
304
|
+
if (allLoaded(items)) {
|
305
|
+
one(callback);
|
306
|
+
}
|
307
|
+
});
|
308
|
+
}
|
309
|
+
});
|
310
|
+
|
311
|
+
return api;
|
312
|
+
}
|
313
|
+
|
314
|
+
function load(asset, callback) {
|
315
|
+
///<summary>Used with normal loading logic</summary>
|
316
|
+
callback = callback || noop;
|
317
|
+
|
318
|
+
if (asset.state === LOADED) {
|
319
|
+
callback();
|
320
|
+
return;
|
321
|
+
}
|
322
|
+
|
323
|
+
// INFO: why would we trigger a ready event when its not really loaded yet ?
|
324
|
+
if (asset.state === LOADING) {
|
325
|
+
api.ready(asset.name, callback);
|
326
|
+
return;
|
327
|
+
}
|
328
|
+
|
329
|
+
if (asset.state === PRELOADING) {
|
330
|
+
asset.onpreload.push(function () {
|
331
|
+
load(asset, callback);
|
332
|
+
});
|
333
|
+
return;
|
334
|
+
}
|
335
|
+
|
336
|
+
asset.state = LOADING;
|
337
|
+
|
338
|
+
loadAsset(asset, function () {
|
339
|
+
asset.state = LOADED;
|
340
|
+
|
341
|
+
callback();
|
342
|
+
|
343
|
+
// handlers for this asset
|
344
|
+
each(handlers[asset.name], function (fn) {
|
345
|
+
one(fn);
|
346
|
+
});
|
347
|
+
|
348
|
+
// dom is ready & no assets are queued for loading
|
349
|
+
// INFO: shouldn't we be doing the same test above ?
|
350
|
+
if (isDomReady && allLoaded()) {
|
351
|
+
each(handlers.ALL, function (fn) {
|
352
|
+
one(fn);
|
353
|
+
});
|
354
|
+
}
|
355
|
+
});
|
356
|
+
}
|
357
|
+
|
358
|
+
function getExtension(url) {
|
359
|
+
url = url || "";
|
360
|
+
|
361
|
+
var items = url.split("?")[0].split(".");
|
362
|
+
return items[items.length-1].toLowerCase();
|
363
|
+
}
|
364
|
+
|
365
|
+
/* Parts inspired from: https://github.com/cujojs/curl
|
366
|
+
******************************************************/
|
367
|
+
function loadAsset(asset, callback) {
|
368
|
+
callback = callback || noop;
|
369
|
+
|
370
|
+
function error(event) {
|
371
|
+
event = event || win.event;
|
372
|
+
|
373
|
+
// release event listeners
|
374
|
+
ele.onload = ele.onreadystatechange = ele.onerror = null;
|
375
|
+
|
376
|
+
// do callback
|
377
|
+
callback();
|
378
|
+
|
379
|
+
// need some more detailed error handling here
|
380
|
+
}
|
381
|
+
|
382
|
+
function process(event) {
|
383
|
+
event = event || win.event;
|
384
|
+
|
385
|
+
// IE 7/8 (2 events on 1st load)
|
386
|
+
// 1) event.type = readystatechange, s.readyState = loading
|
387
|
+
// 2) event.type = readystatechange, s.readyState = loaded
|
388
|
+
|
389
|
+
// IE 7/8 (1 event on reload)
|
390
|
+
// 1) event.type = readystatechange, s.readyState = complete
|
391
|
+
|
392
|
+
// event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
|
393
|
+
|
394
|
+
// IE 9 (3 events on 1st load)
|
395
|
+
// 1) event.type = readystatechange, s.readyState = loading
|
396
|
+
// 2) event.type = readystatechange, s.readyState = loaded
|
397
|
+
// 3) event.type = load , s.readyState = loaded
|
398
|
+
|
399
|
+
// IE 9 (2 events on reload)
|
400
|
+
// 1) event.type = readystatechange, s.readyState = complete
|
401
|
+
// 2) event.type = load , s.readyState = complete
|
402
|
+
|
403
|
+
// event.type === 'load' && /loaded|complete/.test(s.readyState)
|
404
|
+
// event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
|
405
|
+
|
406
|
+
// IE 10 (3 events on 1st load)
|
407
|
+
// 1) event.type = readystatechange, s.readyState = loading
|
408
|
+
// 2) event.type = load , s.readyState = complete
|
409
|
+
// 3) event.type = readystatechange, s.readyState = loaded
|
410
|
+
|
411
|
+
// IE 10 (3 events on reload)
|
412
|
+
// 1) event.type = readystatechange, s.readyState = loaded
|
413
|
+
// 2) event.type = load , s.readyState = complete
|
414
|
+
// 3) event.type = readystatechange, s.readyState = complete
|
415
|
+
|
416
|
+
// event.type === 'load' && /loaded|complete/.test(s.readyState)
|
417
|
+
// event.type === 'readystatechange' && /complete/.test(s.readyState)
|
418
|
+
|
419
|
+
// Other Browsers (1 event on 1st load)
|
420
|
+
// 1) event.type = load, s.readyState = undefined
|
421
|
+
|
422
|
+
// Other Browsers (1 event on reload)
|
423
|
+
// 1) event.type = load, s.readyState = undefined
|
424
|
+
|
425
|
+
// event.type == 'load' && s.readyState = undefined
|
426
|
+
|
427
|
+
// !doc.documentMode is for IE6/7, IE8+ have documentMode
|
428
|
+
if (event.type === "load" || (/loaded|complete/.test(ele.readyState) && (!doc.documentMode || doc.documentMode < 9))) {
|
429
|
+
// remove timeouts
|
430
|
+
win.clearTimeout(asset.errorTimeout);
|
431
|
+
win.clearTimeout(asset.cssTimeout);
|
432
|
+
|
433
|
+
// release event listeners
|
434
|
+
ele.onload = ele.onreadystatechange = ele.onerror = null;
|
435
|
+
|
436
|
+
// do callback
|
437
|
+
callback();
|
438
|
+
}
|
439
|
+
}
|
440
|
+
|
441
|
+
function isCssLoaded() {
|
442
|
+
// should we test again ? 20 retries = 5secs ..after that, the callback will be triggered by the error handler at 7secs
|
443
|
+
if (asset.state !== LOADED && asset.cssRetries <= 20) {
|
444
|
+
|
445
|
+
// loop through stylesheets
|
446
|
+
for (var i = 0, l = doc.styleSheets.length; i < l; i++) {
|
447
|
+
// do we have a match ?
|
448
|
+
// we need to tests agains ele.href and not asset.url, because a local file will be assigned the full http path on a link element
|
449
|
+
if (doc.styleSheets[i].href === ele.href) {
|
450
|
+
process({ "type": "load" });
|
451
|
+
return;
|
452
|
+
}
|
453
|
+
}
|
454
|
+
|
455
|
+
// increment & try again
|
456
|
+
asset.cssRetries++;
|
457
|
+
asset.cssTimeout = win.setTimeout(isCssLoaded, 250);
|
458
|
+
}
|
459
|
+
}
|
460
|
+
|
461
|
+
var ele;
|
462
|
+
var ext = getExtension(asset.url);
|
463
|
+
|
464
|
+
if (ext === "css") {
|
465
|
+
ele = doc.createElement("link");
|
466
|
+
ele.type = "text/" + (asset.type || "css");
|
467
|
+
ele.rel = "stylesheet";
|
468
|
+
ele.href = asset.url;
|
469
|
+
|
470
|
+
/* onload supported for CSS on unsupported browsers
|
471
|
+
* Safari windows 5.1.7, FF < 10
|
472
|
+
*/
|
473
|
+
|
474
|
+
// Set counter to zero
|
475
|
+
asset.cssRetries = 0;
|
476
|
+
asset.cssTimeout = win.setTimeout(isCssLoaded, 500);
|
477
|
+
}
|
478
|
+
else {
|
479
|
+
ele = doc.createElement("script");
|
480
|
+
ele.type = "text/" + (asset.type || "javascript");
|
481
|
+
ele.src = asset.url;
|
482
|
+
}
|
483
|
+
|
484
|
+
ele.onload = ele.onreadystatechange = process;
|
485
|
+
ele.onerror = error;
|
486
|
+
|
487
|
+
/* Good read, but doesn't give much hope !
|
488
|
+
* http://blog.getify.com/on-script-loaders/
|
489
|
+
* http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
|
490
|
+
* https://hacks.mozilla.org/2009/06/defer/
|
491
|
+
*/
|
492
|
+
|
493
|
+
// ASYNC: load in parallel and execute as soon as possible
|
494
|
+
ele.async = false;
|
495
|
+
// DEFER: load in parallel but maintain execution order
|
496
|
+
ele.defer = false;
|
497
|
+
|
498
|
+
// timout for asset loading
|
499
|
+
asset.errorTimeout = win.setTimeout(function () {
|
500
|
+
error({ type: "timeout" });
|
501
|
+
}, 7e3);
|
502
|
+
|
503
|
+
// use insertBefore to keep IE from throwing Operation Aborted (thx Bryan Forbes!)
|
504
|
+
var head = doc.head || doc.getElementsByTagName("head")[0];
|
505
|
+
|
506
|
+
// but insert at end of head, because otherwise if it is a stylesheet, it will not override values
|
507
|
+
head.insertBefore(ele, head.lastChild);
|
508
|
+
}
|
509
|
+
|
510
|
+
/* Parts inspired from: https://github.com/jrburke/requirejs
|
511
|
+
************************************************************/
|
512
|
+
function init() {
|
513
|
+
var items = doc.getElementsByTagName("script");
|
514
|
+
|
515
|
+
// look for a script with a data-head-init attribute
|
516
|
+
for (var i = 0, l = items.length; i < l; i++) {
|
517
|
+
var dataMain = items[i].getAttribute("data-headjs-load");
|
518
|
+
if (!!dataMain) {
|
519
|
+
api.load(dataMain);
|
520
|
+
return;
|
521
|
+
}
|
522
|
+
}
|
523
|
+
}
|
524
|
+
|
525
|
+
function ready(key, callback) {
|
526
|
+
///<summary>
|
527
|
+
/// INFO: use cases:
|
528
|
+
/// head.ready(callBack);
|
529
|
+
/// head.ready(document , callBack);
|
530
|
+
/// head.ready("file.js", callBack);
|
531
|
+
/// head.ready("label" , callBack);
|
532
|
+
/// head.ready(["label1", "label2"], callback);
|
533
|
+
///</summary>
|
534
|
+
|
535
|
+
// DOM ready check: head.ready(document, function() { });
|
536
|
+
if (key === doc) {
|
537
|
+
if (isDomReady) {
|
538
|
+
one(callback);
|
539
|
+
}
|
540
|
+
else {
|
541
|
+
domWaiters.push(callback);
|
542
|
+
}
|
543
|
+
|
544
|
+
return api;
|
545
|
+
}
|
546
|
+
|
547
|
+
// shift arguments
|
548
|
+
if (isFunction(key)) {
|
549
|
+
callback = key;
|
550
|
+
key = "ALL"; // holds all callbacks that where added without labels: ready(callBack)
|
551
|
+
}
|
552
|
+
|
553
|
+
// queue all items from key and return. The callback will be executed if all items from key are already loaded.
|
554
|
+
if (isArray(key)) {
|
555
|
+
var items = {};
|
556
|
+
|
557
|
+
each(key, function (item) {
|
558
|
+
items[item] = assets[item];
|
559
|
+
|
560
|
+
api.ready(item, function() {
|
561
|
+
if (allLoaded(items)) {
|
562
|
+
one(callback);
|
563
|
+
}
|
564
|
+
});
|
565
|
+
});
|
566
|
+
|
567
|
+
return api;
|
568
|
+
}
|
569
|
+
|
570
|
+
// make sure arguments are sane
|
571
|
+
if (typeof key !== "string" || !isFunction(callback)) {
|
572
|
+
return api;
|
573
|
+
}
|
574
|
+
|
575
|
+
// this can also be called when we trigger events based on filenames & labels
|
576
|
+
var asset = assets[key];
|
577
|
+
|
578
|
+
// item already loaded --> execute and return
|
579
|
+
if (asset && asset.state === LOADED || key === "ALL" && allLoaded() && isDomReady) {
|
580
|
+
one(callback);
|
581
|
+
return api;
|
582
|
+
}
|
583
|
+
|
584
|
+
var arr = handlers[key];
|
585
|
+
if (!arr) {
|
586
|
+
arr = handlers[key] = [callback];
|
587
|
+
}
|
588
|
+
else {
|
589
|
+
arr.push(callback);
|
590
|
+
}
|
591
|
+
|
592
|
+
return api;
|
593
|
+
}
|
594
|
+
|
595
|
+
/* Mix of stuff from jQuery & IEContentLoaded
|
596
|
+
* http://dev.w3.org/html5/spec/the-end.html#the-end
|
597
|
+
***************************************************/
|
598
|
+
function domReady() {
|
599
|
+
// Make sure body exists, at least, in case IE gets a little overzealous (jQuery ticket #5443).
|
600
|
+
if (!doc.body) {
|
601
|
+
// let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
|
602
|
+
win.clearTimeout(api.readyTimeout);
|
603
|
+
api.readyTimeout = win.setTimeout(domReady, 50);
|
604
|
+
return;
|
605
|
+
}
|
606
|
+
|
607
|
+
if (!isDomReady) {
|
608
|
+
isDomReady = true;
|
609
|
+
|
610
|
+
init();
|
611
|
+
each(domWaiters, function (fn) {
|
612
|
+
one(fn);
|
613
|
+
});
|
614
|
+
}
|
615
|
+
}
|
616
|
+
|
617
|
+
function domContentLoaded() {
|
618
|
+
// W3C
|
619
|
+
if (doc.addEventListener) {
|
620
|
+
doc.removeEventListener("DOMContentLoaded", domContentLoaded, false);
|
621
|
+
domReady();
|
622
|
+
}
|
623
|
+
|
624
|
+
// IE
|
625
|
+
else if (doc.readyState === "complete") {
|
626
|
+
// we're here because readyState === "complete" in oldIE
|
627
|
+
// which is good enough for us to call the dom ready!
|
628
|
+
doc.detachEvent("onreadystatechange", domContentLoaded);
|
629
|
+
domReady();
|
630
|
+
}
|
631
|
+
}
|
632
|
+
|
633
|
+
// Catch cases where ready() is called after the browser event has already occurred.
|
634
|
+
// we once tried to use readyState "interactive" here, but it caused issues like the one
|
635
|
+
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
|
636
|
+
if (doc.readyState === "complete") {
|
637
|
+
domReady();
|
638
|
+
}
|
639
|
+
|
640
|
+
// W3C
|
641
|
+
else if (doc.addEventListener) {
|
642
|
+
doc.addEventListener("DOMContentLoaded", domContentLoaded, false);
|
643
|
+
|
644
|
+
// A fallback to window.onload, that will always work
|
645
|
+
win.addEventListener("load", domReady, false);
|
646
|
+
}
|
647
|
+
|
648
|
+
// IE
|
649
|
+
else {
|
650
|
+
// Ensure firing before onload, maybe late but safe also for iframes
|
651
|
+
doc.attachEvent("onreadystatechange", domContentLoaded);
|
652
|
+
|
653
|
+
// A fallback to window.onload, that will always work
|
654
|
+
win.attachEvent("onload", domReady);
|
655
|
+
|
656
|
+
// If IE and not a frame
|
657
|
+
// continually check to see if the document is ready
|
658
|
+
var top = false;
|
659
|
+
|
660
|
+
try {
|
661
|
+
top = !win.frameElement && doc.documentElement;
|
662
|
+
} catch (e) { }
|
663
|
+
|
664
|
+
if (top && top.doScroll) {
|
665
|
+
(function doScrollCheck() {
|
666
|
+
if (!isDomReady) {
|
667
|
+
try {
|
668
|
+
// Use the trick by Diego Perini
|
669
|
+
// http://javascript.nwbox.com/IEContentLoaded/
|
670
|
+
top.doScroll("left");
|
671
|
+
} catch (error) {
|
672
|
+
// let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
|
673
|
+
win.clearTimeout(api.readyTimeout);
|
674
|
+
api.readyTimeout = win.setTimeout(doScrollCheck, 50);
|
675
|
+
return;
|
676
|
+
}
|
677
|
+
|
678
|
+
// and execute any waiting functions
|
679
|
+
domReady();
|
680
|
+
}
|
681
|
+
}());
|
682
|
+
}
|
683
|
+
}
|
684
|
+
//#endregion
|
685
|
+
|
686
|
+
//#region Public Exports
|
687
|
+
// INFO: determine which method to use for loading
|
688
|
+
api.load = api.js = isAsync ? apiLoadAsync : apiLoadHack;
|
689
|
+
api.test = conditional;
|
690
|
+
api.ready = ready;
|
691
|
+
//#endregion
|
692
|
+
|
693
|
+
//#region INIT
|
694
|
+
// perform this when DOM is ready
|
695
|
+
api.ready(doc, function () {
|
696
|
+
if (allLoaded()) {
|
697
|
+
each(handlers.ALL, function (callback) {
|
698
|
+
one(callback);
|
699
|
+
});
|
700
|
+
}
|
701
|
+
|
702
|
+
if (api.feature) {
|
703
|
+
api.feature("domloaded", true);
|
704
|
+
}
|
705
|
+
});
|
706
|
+
//#endregion
|
707
|
+
}(window));
|