rmails 0.1.1
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/.gitignore +20 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +167 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +9 -0
- data/Rakefile +31 -0
- data/Rakefile1 +9 -0
- data/Vagrantfile +51 -0
- data/app/assets/images/arrow_bottom.gif +0 -0
- data/app/assets/images/arrow_right.gif +0 -0
- data/app/assets/images/at-sign.png +0 -0
- data/app/assets/images/checkerboard.gif +0 -0
- data/app/assets/images/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/glyphicons-halflings.png +0 -0
- data/app/assets/images/icon_draft.gif +0 -0
- data/app/assets/images/icon_layout.gif +0 -0
- data/app/assets/images/icon_move.gif +0 -0
- data/app/assets/images/icon_regular.gif +0 -0
- data/app/assets/images/icon_snippet.gif +0 -0
- data/app/assets/images/nav_arrow.png +0 -0
- data/app/assets/images/x.png +0 -0
- data/app/assets/javascripts/application.coffee.erb +27 -0
- data/app/assets/javascripts/canjs/can.construct.proxy.js +60 -0
- data/app/assets/javascripts/canjs/can.construct.super.js +44 -0
- data/app/assets/javascripts/canjs/can.control.plugin.js +245 -0
- data/app/assets/javascripts/canjs/can.control.view.js +88 -0
- data/app/assets/javascripts/canjs/can.dojo.js +3669 -0
- data/app/assets/javascripts/canjs/can.dojo.min.js +66 -0
- data/app/assets/javascripts/canjs/can.fixture.js +1020 -0
- data/app/assets/javascripts/canjs/can.jquery.js +2995 -0
- data/app/assets/javascripts/canjs/can.jquery.min.js +52 -0
- data/app/assets/javascripts/canjs/can.mootools.js +3462 -0
- data/app/assets/javascripts/canjs/can.mootools.min.js +63 -0
- data/app/assets/javascripts/canjs/can.observe.attributes.js +293 -0
- data/app/assets/javascripts/canjs/can.observe.backup.js +368 -0
- data/app/assets/javascripts/canjs/can.observe.delegate.js +359 -0
- data/app/assets/javascripts/canjs/can.observe.setter.js +58 -0
- data/app/assets/javascripts/canjs/can.observe.validations.js +374 -0
- data/app/assets/javascripts/canjs/can.view.modifiers.js +292 -0
- data/app/assets/javascripts/canjs/can.yui.js +3530 -0
- data/app/assets/javascripts/canjs/can.yui.min.js +65 -0
- data/app/assets/javascripts/canjs/can.zepto.js +3426 -0
- data/app/assets/javascripts/canjs/can.zepto.min.js +62 -0
- data/app/assets/javascripts/controls/admins.coffee.erb +105 -0
- data/app/assets/javascripts/controls/aliases.coffee.erb +91 -0
- data/app/assets/javascripts/controls/domains.coffee.erb +115 -0
- data/app/assets/javascripts/controls/settings.coffee.erb +47 -0
- data/app/assets/javascripts/controls/users.coffee.erb +94 -0
- data/app/assets/javascripts/lib/facebox.js +311 -0
- data/app/assets/javascripts/lib/html5.js +2 -0
- data/app/assets/javascripts/lib/jquery.js +9301 -0
- data/app/assets/javascripts/lib/jquery_formparams.js +108 -0
- data/app/assets/javascripts/lib/jquery_input_hint.js +20 -0
- data/app/assets/javascripts/lib/jquery_paginate.js +120 -0
- data/app/assets/javascripts/lib/jquery_ui_custom.js +6 -0
- data/app/assets/javascripts/lib/json2.js +487 -0
- data/app/assets/javascripts/lib/utils.coffee.erb +48 -0
- data/app/assets/javascripts/models/admin.coffee.erb +42 -0
- data/app/assets/javascripts/models/alias.coffee.erb +28 -0
- data/app/assets/javascripts/models/domain.coffee.erb +39 -0
- data/app/assets/javascripts/models/property.coffee.erb +18 -0
- data/app/assets/javascripts/models/user.coffee.erb +29 -0
- data/app/assets/stylesheets/application.sass +156 -0
- data/app/assets/stylesheets/base.css.sass +243 -0
- data/app/assets/stylesheets/facebox.css +80 -0
- data/app/assets/stylesheets/lib/bootstrap.css +9 -0
- data/app/assets/stylesheets/twitter/bootstrap-responsive.scss +1 -0
- data/app/assets/stylesheets/twitter/bootstrap.scss +63 -0
- data/app/assets/stylesheets/twitter/bootstrap/_accordion.scss +34 -0
- data/app/assets/stylesheets/twitter/bootstrap/_alerts.scss +79 -0
- data/app/assets/stylesheets/twitter/bootstrap/_breadcrumbs.scss +24 -0
- data/app/assets/stylesheets/twitter/bootstrap/_button-groups.scss +229 -0
- data/app/assets/stylesheets/twitter/bootstrap/_buttons.scss +228 -0
- data/app/assets/stylesheets/twitter/bootstrap/_carousel.scss +158 -0
- data/app/assets/stylesheets/twitter/bootstrap/_close.scss +32 -0
- data/app/assets/stylesheets/twitter/bootstrap/_code.scss +61 -0
- data/app/assets/stylesheets/twitter/bootstrap/_component-animations.scss +22 -0
- data/app/assets/stylesheets/twitter/bootstrap/_dropdowns.scss +237 -0
- data/app/assets/stylesheets/twitter/bootstrap/_forms.scss +689 -0
- data/app/assets/stylesheets/twitter/bootstrap/_grid.scss +21 -0
- data/app/assets/stylesheets/twitter/bootstrap/_hero-unit.scss +25 -0
- data/app/assets/stylesheets/twitter/bootstrap/_labels-badges.scss +83 -0
- data/app/assets/stylesheets/twitter/bootstrap/_layouts.scss +16 -0
- data/app/assets/stylesheets/twitter/bootstrap/_media.scss +55 -0
- data/app/assets/stylesheets/twitter/bootstrap/_mixins.scss +690 -0
- data/app/assets/stylesheets/twitter/bootstrap/_modals.scss +95 -0
- data/app/assets/stylesheets/twitter/bootstrap/_navbar.scss +497 -0
- data/app/assets/stylesheets/twitter/bootstrap/_navs.scss +409 -0
- data/app/assets/stylesheets/twitter/bootstrap/_pager.scss +43 -0
- data/app/assets/stylesheets/twitter/bootstrap/_pagination.scss +123 -0
- data/app/assets/stylesheets/twitter/bootstrap/_popovers.scss +133 -0
- data/app/assets/stylesheets/twitter/bootstrap/_progress-bars.scss +122 -0
- data/app/assets/stylesheets/twitter/bootstrap/_reset.scss +216 -0
- data/app/assets/stylesheets/twitter/bootstrap/_responsive-1200px-min.scss +28 -0
- data/app/assets/stylesheets/twitter/bootstrap/_responsive-767px-max.scss +193 -0
- data/app/assets/stylesheets/twitter/bootstrap/_responsive-768px-979px.scss +19 -0
- data/app/assets/stylesheets/twitter/bootstrap/_responsive-navbar.scss +189 -0
- data/app/assets/stylesheets/twitter/bootstrap/_responsive-utilities.scss +74 -0
- data/app/assets/stylesheets/twitter/bootstrap/_scaffolding.scss +53 -0
- data/app/assets/stylesheets/twitter/bootstrap/_sprites.scss +197 -0
- data/app/assets/stylesheets/twitter/bootstrap/_tables.scss +235 -0
- data/app/assets/stylesheets/twitter/bootstrap/_thumbnails.scss +53 -0
- data/app/assets/stylesheets/twitter/bootstrap/_tooltip.scss +70 -0
- data/app/assets/stylesheets/twitter/bootstrap/_type.scss +247 -0
- data/app/assets/stylesheets/twitter/bootstrap/_utilities.scss +45 -0
- data/app/assets/stylesheets/twitter/bootstrap/_variables.scss +301 -0
- data/app/assets/stylesheets/twitter/bootstrap/_wells.scss +29 -0
- data/app/assets/stylesheets/twitter/bootstrap/responsive.scss +48 -0
- data/app/controllers/admin_users_controller.rb +62 -0
- data/app/controllers/aliases_controller.rb +35 -0
- data/app/controllers/application_controller.rb +20 -0
- data/app/controllers/domains_controller.rb +48 -0
- data/app/controllers/server_controller.rb +28 -0
- data/app/controllers/users_controller.rb +35 -0
- data/app/helpers/admin_users_helper.rb +11 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/helpers/domains_helper.rb +25 -0
- data/app/helpers/server_helper.rb +30 -0
- data/app/mailers/.gitkeep +0 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/admin_user.rb +54 -0
- data/app/models/certificate_manager.rb +46 -0
- data/app/models/property.rb +103 -0
- data/app/models/property/awstats.rb +15 -0
- data/app/models/property/dovecot.rb +61 -0
- data/app/models/property/dspam.rb +45 -0
- data/app/models/property/nginx.rb +47 -0
- data/app/models/property/postfix.rb +64 -0
- data/app/models/property_value_validator.rb +41 -0
- data/app/models/system_manager.rb +88 -0
- data/app/models/virtual_alias.rb +13 -0
- data/app/models/virtual_domain.rb +15 -0
- data/app/models/virtual_user.rb +51 -0
- data/app/views/admin_users/_form.html.haml +21 -0
- data/app/views/admin_users/first.html.haml +12 -0
- data/app/views/admin_users/index.html.haml +61 -0
- data/app/views/aliases/_form.html.haml +11 -0
- data/app/views/aliases/_list.html.haml +0 -0
- data/app/views/devise/confirmations/new.html.haml +9 -0
- data/app/views/devise/mailer/confirmation_instructions.html.haml +4 -0
- data/app/views/devise/mailer/reset_password_instructions.html.haml +6 -0
- data/app/views/devise/mailer/unlock_instructions.html.haml +5 -0
- data/app/views/devise/passwords/edit.html.haml +14 -0
- data/app/views/devise/passwords/new.html.haml +12 -0
- data/app/views/devise/registrations/edit.html.haml +18 -0
- data/app/views/devise/registrations/new.html.haml +10 -0
- data/app/views/devise/sessions/new.html.haml +16 -0
- data/app/views/devise/shared/_links.haml +17 -0
- data/app/views/devise/unlocks/new.html.haml +11 -0
- data/app/views/domains/_fields.html.haml +0 -0
- data/app/views/domains/_form.html.haml +7 -0
- data/app/views/domains/index.html.haml +133 -0
- data/app/views/domains/show.html.haml +1 -0
- data/app/views/layouts/_nav.html.haml +3 -0
- data/app/views/layouts/application.html.haml +29 -0
- data/app/views/server/_certificates.html.haml +10 -0
- data/app/views/server/_dovecot.html.haml +27 -0
- data/app/views/server/_dspam.html.haml +9 -0
- data/app/views/server/_postfix_info.html.haml +5 -0
- data/app/views/server/_postfix_test.html.haml +5 -0
- data/app/views/server/_status.html.haml +11 -0
- data/app/views/server/index.html.haml +36 -0
- data/app/views/users/_form.html.haml +11 -0
- data/app/views/users/_list.html.haml +0 -0
- data/bin/rmails +43 -0
- data/config.ru +4 -0
- data/config/application.rb +62 -0
- data/config/boot.rb +6 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +37 -0
- data/config/environments/production.rb +67 -0
- data/config/environments/test.rb +37 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/devise.rb +240 -0
- data/config/initializers/devise_encryptable.rb +37 -0
- data/config/initializers/devise_models.rb +86 -0
- data/config/initializers/inflections.rb +15 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/initializers/secret_token.rb +7 -0
- data/config/initializers/session_store.rb +8 -0
- data/config/initializers/simple_form.rb +142 -0
- data/config/initializers/simple_form_bootstrap.rb +45 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/cz.yml +45 -0
- data/config/locales/devise.cz.yml +47 -0
- data/config/locales/devise.en.yml +60 -0
- data/config/locales/en.yml +5 -0
- data/config/locales/server/cz.yml +14 -0
- data/config/locales/server/en.yml +7 -0
- data/config/locales/server/help/dovecot/cz.yml +21 -0
- data/config/locales/server/help/dovecot/en.yml +18 -0
- data/config/locales/server/help/dspam/cz.yml +10 -0
- data/config/locales/server/help/dspam/en.yml +4 -0
- data/config/locales/server/key/dovecot/cz.yml +23 -0
- data/config/locales/server/key/dovecot/en.yml +20 -0
- data/config/locales/server/key/dspam/cz.yml +10 -0
- data/config/locales/server/key/dspam/en.yml +4 -0
- data/config/locales/simple_form.en.yml +26 -0
- data/config/locales/views/admin_users/cz.yml +25 -0
- data/config/locales/views/admin_users/en.yml +5 -0
- data/config/locales/views/aliases/cz.yml +17 -0
- data/config/locales/views/aliases/en.yml +1 -0
- data/config/locales/views/devise/cz.yml +26 -0
- data/config/locales/views/devise/en.yml +13 -0
- data/config/locales/views/domains/cz.yml +15 -0
- data/config/locales/views/domains/en.yml +15 -0
- data/config/locales/views/server/cz.yml +19 -0
- data/config/locales/views/server/en.yml +3 -0
- data/config/locales/views/users/cz.yml +18 -0
- data/config/locales/views/users/en.yml +1 -0
- data/config/routes.rb +80 -0
- data/db/migrate/20121112201233_virtual_domain.rb +11 -0
- data/db/migrate/20121112201247_virtual_alias.rb +10 -0
- data/db/migrate/20121112201341_virtual_user.rb +34 -0
- data/db/migrate/20121112201359_create_admin_user.rb +30 -0
- data/db/migrate/20121112201411_server_configuration.rb +13 -0
- data/db/migrate/20130304083938_join_domains_users.rb +12 -0
- data/db/migrate/20130311214040_create_versions.rb +18 -0
- data/db/seeds.rb +45 -0
- data/lib/devise-encryptable.rb +1 -0
- data/lib/rmails.rb +5 -0
- data/lib/rmails/installer.rb +37 -0
- data/lib/rmails/version.rb +3 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/templates/haml/scaffold/_form.html.haml +10 -0
- data/locals +0 -0
- data/log/.gitkeep +0 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +25 -0
- data/public/favicon.ico +0 -0
- data/public/fonts/London.eot +0 -0
- data/public/fonts/London.otf +0 -0
- data/public/fonts/London.woff +0 -0
- data/public/fonts/LondonBold.otf +0 -0
- data/public/robots.txt +5 -0
- data/rmails.gemspec +35 -0
- data/script/prepflog.pl +576 -0
- data/script/rails +6 -0
- data/system/config/automateit_env.rb +16 -0
- data/system/config/fields.yml +48 -0
- data/system/config/tags.yml +39 -0
- data/system/dist/README_AutomateIt_dist.txt +20 -0
- data/system/dist/amavis/spamassassin.cf.erb +85 -0
- data/system/dist/amavis/user.erb +33 -0
- data/system/dist/awstats/awstats.mail.conf.erb +41 -0
- data/system/dist/awstats/prepflog.pl +576 -0
- data/system/dist/dovecot/dovecot-sql.conf.ext.erb +14 -0
- data/system/dist/dovecot/dovecot.conf.erb +297 -0
- data/system/dist/dovecot/old_dovecot.conf.erb +63 -0
- data/system/dist/dspam/conf.erb +96 -0
- data/system/dist/dspam/pgsql.conf +33 -0
- data/system/dist/nginx/awstats.erb +17 -0
- data/system/dist/nginx/rmails.erb +40 -0
- data/system/dist/postfix/email2email.cf.erb +5 -0
- data/system/dist/postfix/main.cf.erb +118 -0
- data/system/dist/postfix/master.cf.erb +74 -0
- data/system/dist/postfix/sasl.conf.erb +3 -0
- data/system/dist/postfix/sender_login_maps.cf.erb +5 -0
- data/system/dist/postfix/virtual_alias_maps.cf.erb +5 -0
- data/system/dist/postfix/virtual_mailbox_domains.cf.erb +5 -0
- data/system/dist/postfix/virtual_mailbox_maps.cf.erb +5 -0
- data/system/dist/postgresql/postgresql.conf.erb +54 -0
- data/system/dist/rmails/Gemfile.1 +8 -0
- data/system/dist/rmails/Gemfile.2 +24 -0
- data/system/dist/rmails/database.yml.erb +15 -0
- data/system/dist/sudoers +37 -0
- data/system/lib/README_AutomateIt_lib.txt +22 -0
- data/system/lib/dkim_key.rb +9 -0
- data/system/lib/smtpd_key.rb +39 -0
- data/system/lib/ssl.rb +23 -0
- data/system/recipes/01_prepare_server.rb +84 -0
- data/system/recipes/02_setup_database.rb +65 -0
- data/system/recipes/03_setup_postfix.rb +124 -0
- data/system/recipes/04_setup_dovecot.rb +78 -0
- data/system/recipes/05_setup_nginx.rb +29 -0
- data/system/recipes/06_setup_dspam.rb +24 -0
- data/system/recipes/07_setup_amavis.rb +16 -0
- data/system/recipes/08_setup_spamassassin.rb +22 -0
- data/system/recipes/09_setup_awstats.rb +49 -0
- data/system/recipes/XX_start_services.rb +5 -0
- data/test/fixtures/.gitkeep +0 -0
- data/test/functional/.gitkeep +0 -0
- data/test/functional/aliases_controller_test.rb +7 -0
- data/test/functional/domains_controller_test.rb +7 -0
- data/test/functional/users_controller_test.rb +7 -0
- data/test/integration/.gitkeep +0 -0
- data/test/performance/browsing_test.rb +12 -0
- data/test/test_helper.rb +13 -0
- data/test/unit/.gitkeep +0 -0
- data/test/unit/helpers/aliases_helper_test.rb +4 -0
- data/test/unit/helpers/domains_helper_test.rb +4 -0
- data/test/unit/helpers/users_helper_test.rb +4 -0
- data/vendor/assets/javascripts/.gitkeep +0 -0
- data/vendor/assets/javascripts/canjs/can.construct.proxy.js +60 -0
- data/vendor/assets/javascripts/canjs/can.construct.super.js +44 -0
- data/vendor/assets/javascripts/canjs/can.control.plugin.js +245 -0
- data/vendor/assets/javascripts/canjs/can.control.view.js +88 -0
- data/vendor/assets/javascripts/canjs/can.dojo.js +3669 -0
- data/vendor/assets/javascripts/canjs/can.dojo.min.js +66 -0
- data/vendor/assets/javascripts/canjs/can.fixture.js +1020 -0
- data/vendor/assets/javascripts/canjs/can.jquery.js +2995 -0
- data/vendor/assets/javascripts/canjs/can.jquery.min.js +52 -0
- data/vendor/assets/javascripts/canjs/can.mootools.js +3462 -0
- data/vendor/assets/javascripts/canjs/can.mootools.min.js +63 -0
- data/vendor/assets/javascripts/canjs/can.observe.attributes.js +293 -0
- data/vendor/assets/javascripts/canjs/can.observe.backup.js +368 -0
- data/vendor/assets/javascripts/canjs/can.observe.delegate.js +359 -0
- data/vendor/assets/javascripts/canjs/can.observe.setter.js +58 -0
- data/vendor/assets/javascripts/canjs/can.observe.validations.js +374 -0
- data/vendor/assets/javascripts/canjs/can.view.modifiers.js +292 -0
- data/vendor/assets/javascripts/canjs/can.yui.js +3530 -0
- data/vendor/assets/javascripts/canjs/can.yui.min.js +65 -0
- data/vendor/assets/javascripts/canjs/can.zepto.js +3426 -0
- data/vendor/assets/javascripts/canjs/can.zepto.min.js +62 -0
- data/vendor/assets/javascripts/twitter/bootstrap-affix.js +104 -0
- data/vendor/assets/javascripts/twitter/bootstrap-alert.js +90 -0
- data/vendor/assets/javascripts/twitter/bootstrap-button.js +96 -0
- data/vendor/assets/javascripts/twitter/bootstrap-carousel.js +176 -0
- data/vendor/assets/javascripts/twitter/bootstrap-collapse.js +158 -0
- data/vendor/assets/javascripts/twitter/bootstrap-dropdown.js +150 -0
- data/vendor/assets/javascripts/twitter/bootstrap-modal.js +239 -0
- data/vendor/assets/javascripts/twitter/bootstrap-popover.js +103 -0
- data/vendor/assets/javascripts/twitter/bootstrap-scrollspy.js +151 -0
- data/vendor/assets/javascripts/twitter/bootstrap-tab.js +135 -0
- data/vendor/assets/javascripts/twitter/bootstrap-tooltip.js +275 -0
- data/vendor/assets/javascripts/twitter/bootstrap-transition.js +60 -0
- data/vendor/assets/javascripts/twitter/bootstrap-typeahead.js +300 -0
- data/vendor/assets/javascripts/twitter/my/bootstrap-typeahead.js +311 -0
- data/vendor/assets/stylesheets/.gitkeep +0 -0
- metadata +470 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
(function(c,q,j){function V(a,b){var d=a[D],d=d&&E[d];return b===j?d||W(a):d&&d[b]||ya.call($(a),b)}function W(a,b,d){a=a[D]||(a[D]=++X);a=E[a]||(E[a]={});b!==j&&(a[b]=d);return a}var E={},ya=$.fn.data,X=$.uuid=+new Date,D=$.expando="Zepto"+X;$.fn.data=function(a,b){return b===j?0==this.length?j:V(this[0],a):this.each(function(d){W(this,a,$.isFunction(b)?b.call(this,d,V(this,a)):b)})};$.cleanData=function(a){for(var b=0,d;(d=a[b])!==j;b++)c.trigger(d,"destroyed",[],!1),delete E[d[D]]};c.addEvent=
|
|
2
|
+
function(a,b){this.__bindEvents||(this.__bindEvents={});var d=a.split(".")[0];this.__bindEvents[d]||(this.__bindEvents[d]=[]);this.__bindEvents[d].push({handler:b,name:a});return this};c.removeEvent=function(a,b){if(this.__bindEvents){for(var d=0,c=this.__bindEvents[a.split(".")[0]],e;d<c.length;)e=c[d],b&&e.handler===b||!b&&e.name===a?c.splice(d,1):d++;return this}};c.dispatch=function(a){if(this.__bindEvents){var b=(this.__bindEvents[a.type.split(".")[0]]||[]).slice(0),d=this,f=[a].concat(a.data||
|
|
3
|
+
[]);c.each(b,function(b){a.data=f.slice(1);b.handler.apply(d,f)})}};var t=document.createElement("table"),m=document.createElement("tr"),Y={tr:document.createElement("tbody"),tbody:t,thead:t,tfoot:t,td:m,th:m,"*":document.createElement("div")},za=/^\s*<(\w+)[^>]*>/,Aa=function(a,b){b===j&&(b=za.test(a)&&RegExp.$1);b in Y||(b="*");var d=Y[b];if("tr"===b){var c=document.createElement("div");c.innerHTML="<table><tbody>"+a+"</tbody></table>";d=c.firstChild.firstChild}else d.innerHTML=""+a;c={};d=d.childNodes;
|
|
4
|
+
c.length=d.length;for(var e=0;e<d.length;e++)c[e]=d[e];return[].slice.call(c)};c.buildFragment=function(a){var a=Aa(a),b=document.createDocumentFragment();a.forEach(function(a){b.appendChild(a)});return b};$.extend(c,Zepto);c.trigger=function(a,b,d,f){a.trigger?a.trigger(b,d):a[0]&&a[0].dispatchEvent||a.dispatchEvent?!1===f?$([a]).triggerHandler(b,d):$([a]).trigger(b,d):("string"==typeof b&&(b={type:b}),b.target=b.target||a,b.data=d,c.dispatch.call(a,b))};c.$=Zepto;c.bind=function(a,b){this.bind?
|
|
5
|
+
this.bind(a,b):this[0]&&this[0].addEventListener||this.addEventListener?$([this]).bind(a,b):c.addEvent.call(this,a,b);return this};c.unbind=function(a,b){this.unbind?this.unbind(a,b):this[0]&&this[0].addEventListener||this.addEventListener?$([this]).unbind(a,b):c.removeEvent.call(this,a,b);return this};c.delegate=function(a,b,d){this.delegate?this.delegate(a,b,d):$([this]).delegate(a,b,d)};c.undelegate=function(a,b,d){this.undelegate?this.undelegate(a,b,d):$([this]).undelegate(a,b,d)};$.each(["append",
|
|
6
|
+
"filter","addClass","remove","data"],function(a,b){c[b]=function(a){return a[b].apply(a,c.makeArray(arguments).slice(1))}});c.makeArray=function(a){var b=[];c.each(a,function(a,c){b[c]=a});return b};c.inArray=function(a,b){return b.indexOf(a)};c.proxy=function(a,b){return function(){return a.apply(b,arguments)}};var Ba=$.ajaxSettings.xhr;$.ajaxSettings.xhr=function(){var a=Ba(),b=a.open;a.open=function(a,c){b.call(this,a,c,F===j?!0:F)};return a};var F,Ca=$.ajax,J=function(a,b){for(var d in a)b[d]=
|
|
7
|
+
"function"==typeof b[d]?function(){a[d].apply(a,arguments)}:d[a]};c.ajax=function(a){var b=a.success,d=a.error,f=c.Deferred();a.success=function(){J(e,f);f.resolve.apply(f,arguments);b&&b.apply(this,arguments)};a.error=function(){J(e,f);f.reject.apply(f,arguments);d&&d.apply(this,arguments)};!1===a.async&&(F=!1);var e=Ca(a);F=j;J(e,f);return f};$.fn.empty=function(){return this.each(function(){$.cleanData(this.getElementsByTagName("*"));this.innerHTML=""})};$.fn.remove=function(){$.cleanData(this);
|
|
8
|
+
this.each(function(){null!=this.parentNode&&(this.getElementsByTagName&&$.cleanData(this.getElementsByTagName("*")),this.parentNode.removeChild(this))});return this};c.trim=function(a){return a.trim()};c.isEmptyObject=function(a){for(var b in a);return b===j};c.extend=function(a){if(!0===a){var b=c.makeArray(arguments);b.shift();return $.extend.apply($,b)}return $.extend.apply($,arguments)};c.get=function(a,b){return a[b]};var w=function(a){if(!(this instanceof w))return new w;this._doneFuncs=[];
|
|
9
|
+
this._failFuncs=[];this._resultArgs=null;this._status="";a&&a.call(this,this)};c.Deferred=w;c.when=w.when=function(){var a=c.makeArray(arguments);if(2>a.length){var b=a[0];return b&&c.isFunction(b.isResolved)&&c.isFunction(b.isRejected)?b:w().resolve(b)}var d=w(),f=0,e=[];c.each(a,function(b,c){b.done(function(){e[c]=2>arguments.length?arguments[0]:arguments;++f==a.length&&d.resolve.apply(d,e)}).fail(function(){d.reject(arguments)})});return d};t=function(a,b){return function(d){var c=this._resultArgs=
|
|
10
|
+
1<arguments.length?arguments[1]:[];return this.exec(d,this[a],c,b)}};m=function(a,b){return function(){var d=this;c.each(Array.prototype.slice.call(arguments),function(c,e,g){c&&(c.constructor===Array?g.callee.apply(d,c):(d._status===b&&c.apply(d,d._resultArgs||[]),d[a].push(c)))});return this}};c.extend(w.prototype,{pipe:function(a,b){var d=c.Deferred();this.done(function(){d.resolve(a.apply(this,arguments))});this.fail(function(){b?d.reject(b.apply(this,arguments)):d.reject.apply(d,arguments)});
|
|
11
|
+
return d},resolveWith:t("_doneFuncs","rs"),rejectWith:t("_failFuncs","rj"),done:m("_doneFuncs","rs"),fail:m("_failFuncs","rj"),always:function(){var a=c.makeArray(arguments);a.length&&a[0]&&this.done(a[0]).fail(a[0]);return this},then:function(){var a=c.makeArray(arguments);1<a.length&&a[1]&&this.fail(a[1]);a.length&&a[0]&&this.done(a[0]);return this},isResolved:function(){return"rs"===this._status},isRejected:function(){return"rj"===this._status},reject:function(){return this.rejectWith(this,arguments)},
|
|
12
|
+
resolve:function(){return this.resolveWith(this,arguments)},exec:function(a,b,d,f){if(""!==this._status)return this;this._status=f;c.each(b,function(b){b.apply(a,d)});return this}});c.each=function(a,b,d){var c=0,e;if(a)if("number"==typeof a.length&&a.pop){a.attr&&a.attr("length");for(e=a.length;c<e&&!1!==b.call(d||a[c],a[c],c,a);c++);}else for(e in a)if(!1===b.call(d||a[c],a[e],e,a))break;return a};var Da=/==/,Ea=/([A-Z]+)([A-Z][a-z])/g,Fa=/([a-z\d])([A-Z])/g,Ga=/([a-z\d])([A-Z])/g,Z=/\{([^\}]+)\}/g,
|
|
13
|
+
s=/"/g,Ha=/'/g;c.extend(c,{esc:function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(s,""").replace(Ha,"'")},getObject:function(a,b,d){var a=a?a.split("."):[],f=a.length,e,g=0,h,i,b=c.isArray(b)?b:[b||q];if(!f)return b[0];for(;e=b[g++];){for(i=0;i<f-1&&/^f|^o/.test(typeof e);i++)e=a[i]in e?e[a[i]]:d&&(e[a[i]]={});if(/^f|^o/.test(typeof e)&&(h=a[i]in e?e[a[i]]:d&&(e[a[i]]={}),h!==j))return!1===d&&delete e[a[i]],h}},capitalize:function(a){return a.charAt(0).toUpperCase()+
|
|
14
|
+
a.slice(1)},underscore:function(a){return a.replace(Da,"/").replace(Ea,"$1_$2").replace(Fa,"$1_$2").replace(Ga,"_").toLowerCase()},sub:function(a,b,d){var f=[];f.push(a.replace(Z,function(a,g){var h=c.getObject(g,b,d===j?d:!d);return/^f|^o/.test(typeof h)?(f.push(h),""):""+h}));return 1>=f.length?f[0]:f},replacer:Z,undHash:/_|-/});var K=0;c.Construct=function(){if(arguments.length)return c.Construct.extend.apply(c.Construct,arguments)};c.extend(c.Construct,{newInstance:function(){var a=this.instance(),
|
|
15
|
+
b;a.setup&&(b=a.setup.apply(a,arguments));a.init&&a.init.apply(a,b||arguments);return a},_inherit:function(a,b,d){c.extend(d||a,a||{})},_overwrite:function(a,b,d,c){a[d]=c},setup:function(a){this.defaults=c.extend(!0,{},a.defaults,this.defaults)},instance:function(){K=1;var a=new this;K=0;return a},extend:function(a,b,d){function f(){if(!K)return this.constructor!==f&&arguments.length?arguments.callee.extend.apply(arguments.callee,arguments):this.constructor.newInstance.apply(this.constructor,arguments)}
|
|
16
|
+
"string"!=typeof a&&(d=b,b=a,a=null);d||(d=b,b=null);var d=d||{},e=this.prototype,g,h,i,k;k=this.instance();c.Construct._inherit(d,e,k);for(g in this)this.hasOwnProperty(g)&&(f[g]=this[g]);c.Construct._inherit(b,this,f);if(a){i=a.split(".");h=i.pop();i=e=c.getObject(i.join("."),q,!0);var o=c.underscore(a.replace(/\./g,"_")),j=c.underscore(h);e[h]=f}c.extend(f,{constructor:f,prototype:k,namespace:i,shortName:h,_shortName:j,fullName:a,_fullName:o});f.prototype.constructor=f;h=[this].concat(c.makeArray(arguments));
|
|
17
|
+
k=f.setup.apply(f,h);f.init&&f.init.apply(f,k||h);return f}});var u=function(a){return a&&"object"===typeof a&&!(a instanceof Date)},M=function(a,b){return c.each(a,function(a){a&&a.unbind&&a.unbind("change"+b)})},N=function(a,b,d){a instanceof x?M([a],d._namespace):a=c.isArray(a)?new x.List(a):new x(a);a.bind("change"+d._namespace,function(f,e){var g=c.makeArray(arguments),f=g.shift();g[0]="*"===b?d.indexOf(a)+"."+g[0]:b+"."+g[0];f.triggeredNS=f.triggeredNS||{};f.triggeredNS[d._namespace]||(f.triggeredNS[d._namespace]=
|
|
18
|
+
!0,c.trigger(d,f,g),c.trigger(d,g[0],g))});return a},aa=0,y=j,ba=function(){if(!y)return y=[],!0},p=function(a,b,d){if(!a._init)if(y)y.push([a,{type:b,batchNum:ca},d]);else return c.trigger(a,b,d)},ca=1,da=function(){var a=y.slice(0);y=j;ca++;c.each(a,function(a){c.trigger.apply(c,a)})},G=function(a,b,d){a.each(function(a,e){d[e]=u(a)&&c.isFunction(a[b])?a[b]():a});return d},m=function(a){return function(){return c[a].apply(this,arguments)}},t=m("addEvent"),m=m("removeEvent"),O=function(a){return c.isArray(a)?
|
|
19
|
+
a:(""+a).split(".")},x=c.Construct("can.Observe",{setup:function(){c.Construct.setup.apply(this,arguments)},bind:t,unbind:m,id:"id"},{setup:function(a){this._data={};this._namespace=".observe"+ ++aa;this._init=1;this.attr(a);delete this._init},attr:function(a,b){if(~"ns".indexOf((typeof a).charAt(0))){if(b===j)return x.__reading&&x.__reading(this,a),this._get(a);this._set(a,b);return this}return this._attrs(a,b)},each:function(){return c.each.apply(j,[this.__get()].concat(c.makeArray(arguments)))},
|
|
20
|
+
removeAttr:function(a){var a=O(a),b=a.shift(),d=this._data[b];if(a.length)return d.removeAttr(a);delete this._data[b];b in this.constructor.prototype||delete this[b];p(this,"change",[b,"remove",j,d]);p(this,b,[j,d]);return d},_get:function(a){var a=O(a),b=this.__get(a.shift());return a.length?b?b._get(a):j:b},__get:function(a){return a?this._data[a]:this._data},_set:function(a,b){var d=O(a),c=d.shift(),e=this.__get(c);if(u(e)&&d.length)e._set(d,b);else{if(d.length)throw"can.Observe: Object does not exist";
|
|
21
|
+
this.__convert&&(b=this.__convert(c,b));this.__set(c,b,e)}},__set:function(a,b,d){if(b!==d){var c=this.__get().hasOwnProperty(a)?"set":"add";this.___set(a,u(b)?N(b,a,this):b);p(this,"change",[a,c,b,d]);p(this,a,[b,d]);d&&M([d],this._namespace)}},___set:function(a,b){this._data[a]=b;a in this.constructor.prototype||(this[a]=b)},bind:t,unbind:m,serialize:function(){return G(this,"serialize",{})},_attrs:function(a,b){if(a===j)return G(this,"attr",{});var a=c.extend(!0,{},a),d,f=ba(),e=this,g;this.each(function(c,
|
|
22
|
+
d){g=a[d];g===j?b&&e.removeAttr(d):(u(c)&&u(g)?c.attr(g,b):c!=g&&e._set(d,g),delete a[d])});for(d in a)g=a[d],this._set(d,g);f&&da();return this}}),Ia=[].splice,P=x("can.Observe.List",{setup:function(a,b){this.length=0;this._namespace=".observe"+ ++aa;this._init=1;this.bind("change",c.proxy(this._changes,this));this.push.apply(this,c.makeArray(a||[]));c.extend(this,b);delete this._init},_changes:function(a,b,c,f,e){~b.indexOf(".")||("add"===c?(p(this,c,[f,+b]),p(this,"length",[this.length])):"remove"===
|
|
23
|
+
c?(p(this,c,[e,+b]),p(this,"length",[this.length])):p(this,c,[f,+b]))},__get:function(a){return a?this[a]:this},___set:function(a,b){this[a]=b;+a>=this.length&&(this.length=+a+1)},serialize:function(){return G(this,"serialize",[])},splice:function(a,b){var d=c.makeArray(arguments),f;for(f=2;f<d.length;f++){var e=d[f];u(e)&&(d[f]=N(e,"*",this))}b===j&&(b=d[1]=this.length-a);f=Ia.apply(this,d);0<b&&(p(this,"change",[""+a,"remove",j,f]),M(f,this._namespace));2<d.length&&p(this,"change",[""+a,"add",d.slice(2),
|
|
24
|
+
f]);return f},_attrs:function(a,b){if(a===j)return G(this,"attr",[]);var a=a.slice(0),c=Math.min(a.length,this.length),f=ba(),e;for(e=0;e<c;e++){var g=this[e],h=a[e];u(g)&&u(h)?g.attr(h,b):g!=h&&this._set(e,h)}a.length>this.length?this.push(a.slice(this.length)):a.length<this.length&&b&&this.splice(a.length);f&&da()}});c.each({push:"length",unshift:0},function(a,b){P.prototype[b]=function(){for(var d=arguments[0]&&c.isArray(arguments[0])?arguments[0]:c.makeArray(arguments),f=a?this.length:0,e=0;e<
|
|
25
|
+
d.length;e++){var g=d[e];u(g)&&(d[e]=N(g,"*",this))}e=[][b].apply(this,d);(!this.comparator||!d.length)&&p(this,"change",[""+f,"add",d,j]);return e}});c.each({pop:"length",shift:0},function(a,b){P.prototype[b]=function(){var d=arguments[0]&&c.isArray(arguments[0])?arguments[0]:c.makeArray(arguments),f=a&&this.length?this.length-1:0,d=[][b].apply(this,d);p(this,"change",[""+f,"remove",j,[d]]);d&&d.unbind&&d.unbind("change"+this._namespace);return d}});P.prototype.indexOf=[].indexOf||function(a){return c.inArray(a,
|
|
26
|
+
this)};var Ja=function(a,b,d){var f=new c.Deferred;a.then(function(){arguments[0]=b[d](arguments[0]);f.resolve.apply(f,arguments)},function(){f.rejectWith.apply(this,arguments)});return f},Ka=0,ea=/change.observe\d+/,fa=function(a,b,c,f,e){var g;g=[a.serialize()];var h=a.constructor,i;"destroy"==b&&g.shift();"create"!==b&&g.unshift(a[a.constructor.id]);i=h[b].apply(h,g);g=i.pipe(function(c){a[e||b+"d"](c,i);return a});i.abort&&(g.abort=function(){i.abort()});return g.then(c,f)},La={create:{url:"_shortName",
|
|
27
|
+
type:"post"},update:{data:function(a,b){var b=b||{},d=this.id;b[d]&&b[d]!==a&&(b["new"+c.capitalize(a)]=b[d],delete b[d]);b[d]=a;return b},type:"put"},destroy:{type:"delete",data:function(a){var b={};b[this.id]=a;return b}},findAll:{url:"_shortName"},findOne:{}},ga=function(a,b){return function(d){var d=a.data?a.data.apply(this,arguments):d,f=b||this[a.url||"_url"],e=d,g=a.type||"get";if("string"==typeof f){var h=f.split(" "),f={url:h.pop()};h.length&&(f.type=h.pop())}f.data="object"==typeof e&&!c.isArray(e)?
|
|
28
|
+
c.extend(f.data||{},e):e;f.url=c.sub(f.url,f.data,!0);return c.ajax(c.extend({type:g||"post",dataType:"json",success:void 0,error:void 0},f))}};c.Observe("can.Model",{setup:function(a){c.Observe.apply(this,arguments);if(this!==c.Model){var b=this,d=c.proxy(this._clean,b);c.each(La,function(f,e){c.isFunction(b[e])||(b[e]=ga(f,b[e]));if(b["make"+c.capitalize(e)]){var g=b["make"+c.capitalize(e)](b[e]);c.Construct._overwrite(b,a,e,function(){this._super;this._reqs++;return g.apply(this,arguments).then(d,
|
|
29
|
+
d)})}});if(!b.fullName||b.fullName==a.fullName)b.fullName=b._shortName="Model"+ ++Ka;this.store={};this._reqs=0;this._url=this._shortName+"/{"+this.id+"}"}},_ajax:ga,_clean:function(){this._reqs--;if(!this._reqs)for(var a in this.store)this.store[a]._bindings||delete this.store[a]},models:function(a){if(a){if(a instanceof this.List)return a;var b=this,d=new (b.List||ha),f=c.isArray(a),e=a instanceof ha,e=f?a:e?a.serialize():a.data;c.each(e,function(a){d.push(b.model(a))});f||c.each(a,function(a,b){"data"!==
|
|
30
|
+
b&&(d[b]=a)});return d}},model:function(a){if(a){a instanceof this&&(a=a.serialize());var b=this.store[a[this.id]]?this.store[a[this.id]].attr(a):new this(a);this._reqs&&(this.store[a[this.id]]=b);return b}}},{isNew:function(){var a=this[this.constructor.id];return!(a||0===a)},save:function(a,b){return fa(this,this.isNew()?"create":"update",a,b)},destroy:function(a,b){return fa(this,"destroy",a,b,"destroyed")},bind:function(a){ea.test(a)||(this._bindings||(this.constructor.store[this[this.constructor.id]]=
|
|
31
|
+
this,this._bindings=0),this._bindings++);return c.Observe.prototype.bind.apply(this,arguments)},unbind:function(a){ea.test(a)||(this._bindings--,this._bindings||delete this.constructor.store[this[this.constructor.id]]);return c.Observe.prototype.unbind.apply(this,arguments)},___set:function(a,b){c.Observe.prototype.___set.call(this,a,b);a===this.constructor.id&&this._bindings&&(this.constructor.store[this[this.constructor.id]]=this)}});c.each({makeFindAll:"models",makeFindOne:"model"},function(a,
|
|
32
|
+
b){c.Model[b]=function(b){return function(c,e,g){return Ja(b.call(this,c),this,a).then(e,g)}}});c.each(["created","updated","destroyed"],function(a){c.Model.prototype[a]=function(b){var d=this.constructor;b&&"object"==typeof b&&this.attr(b.attr?b.attr():b);c.trigger(this,a);c.trigger(this,"change",a);c.trigger(d,a,this)}});var ha=c.Observe.List("can.Model.List",{setup:function(){c.Observe.List.prototype.setup.apply(this,arguments);var a=this;this.bind("change",function(b,c){/\w+\.destroyed/.test(c)&&
|
|
33
|
+
a.splice(a.indexOf(b.target),1)})}}),Ma=/^\d+$/,Na=/([^\[\]]+)|(\[\])/g,Oa=/([^?#]*)(#.*)?$/,ia=function(a){return decodeURIComponent(a.replace(/\+/g," "))};c.extend(c,{deparam:function(a){var b={},d;a&&Oa.test(a)&&(a=a.split("&"),c.each(a,function(a){var a=a.split("="),c=ia(a.shift()),g=ia(a.join("="));current=b;for(var a=c.match(Na),c=0,h=a.length-1;c<h;c++)current[a[c]]||(current[a[c]]=Ma.test(a[c+1])||"[]"==a[c+1]?[]:{}),current=current[a[c]];d=a.pop();"[]"==d?current.push(g):current[d]=g}));
|
|
34
|
+
return b}});var ja=/\:([\w\.]+)/g,ka=/^(?:&[^=]+=[^&]*)+/,Pa=function(a){var b=[];c.each(a,function(a,f){b.push(("className"===f?"class":f)+'="'+("href"===f?a:c.esc(a))+'"')});return b.join(" ")},la=function(a,b){var c=0,f=0,e={},g;for(g in a.defaults)a.defaults[g]===b[g]&&(e[g]=1,c++);for(;f<a.names.length;f++){if(!b.hasOwnProperty(a.names[f]))return-1;e[a.names[f]]||c++}return c},ma=!0,Q=q.location,z=c.each,v=c.extend;c.route=function(a,b){var b=b||{},d=[],f=a.replace(ja,function(c,f,h){d.push(f);
|
|
35
|
+
return"([^\\"+(a.substr(h+c.length,1)||"&")+"]"+(b[f]?"*":"+")+")"});c.route.routes[a]={test:RegExp("^"+f+"($|&)"),route:a,names:d,defaults:b,length:a.split("/").length};return c.route};v(c.route,{param:function(a,b){var d,f=0,e,g=a.route,h=0;delete a.route;z(a,function(){h++});z(c.route.routes,function(b){e=la(b,a);e>f&&(d=b,f=e);if(e>=h)return!1});c.route.routes[g]&&la(c.route.routes[g],a)===f&&(d=c.route.routes[g]);if(d){var i=v({},a),g=d.route.replace(ja,function(b,c){delete i[c];return a[c]===
|
|
36
|
+
d.defaults[c]?"":encodeURIComponent(a[c])}),k;z(d.defaults,function(a,b){i[b]===a&&delete i[b]});k=c.param(i);b&&c.route.attr("route",d.route);return g+(k?"&"+k:"")}return c.isEmptyObject(a)?"":"&"+c.param(a)},deparam:function(a){var b={length:-1};z(c.route.routes,function(c){c.test.test(a)&&c.length>b.length&&(b=c)});if(-1<b.length){var d=a.match(b.test),f=d.shift(),e=(f=a.substr(f.length-("&"===d[d.length-1]?1:0)))&&ka.test(f)?c.deparam(f.slice(1)):{},e=v(!0,{},b.defaults,e);z(d,function(a,c){a&&
|
|
37
|
+
"&"!==a&&(e[b.names[c]]=decodeURIComponent(a))});e.route=b.route;return e}"&"!==a.charAt(0)&&(a="&"+a);return ka.test(a)?c.deparam(a.slice(1)):{}},data:new c.Observe({}),routes:{},ready:function(a){!1===a&&(ma=a);(!0===a||!0===ma)&&na();return c.route},url:function(a,b){b&&(a=v({},R,a));return"#!"+c.route.param(a)},link:function(a,b,d,f){return"<a "+Pa(v({href:c.route.url(b,f)},d))+">"+a+"</a>"},current:function(a){return Q.hash=="#!"+c.route.param(a)}});z("bind unbind delegate undelegate attr removeAttr".split(" "),
|
|
38
|
+
function(a){c.route[a]=function(){return c.route.data[a].apply(c.route.data,arguments)}});var oa,R,na=function(){var a=Q.href.split(/#!?/)[1]||"";R=c.route.deparam(a);(!S||a!==pa)&&c.route.attr(R,!0)},pa,S;c.bind.call(q,"hashchange",na);c.route.bind("change",function(){S=1;clearTimeout(oa);oa=setTimeout(function(){S=0;var a=c.route.data.serialize();Q.hash="#!"+(pa=c.route.param(a,!0))},1)});c.bind.call(document,"ready",c.route.ready);(function(){var a=function(a,b,d){c.bind.call(a,b,d);return function(){c.unbind.call(a,
|
|
39
|
+
b,d)}},b=c.isFunction,d=c.extend,f=c.each,e=[].slice,g=/\{([^\}]+)\}/g,h=c.getObject("$.event.special")||{},i=function(a,b,d,f){c.delegate.call(a,b,d,f);return function(){c.undelegate.call(a,b,d,f)}},k=function(a,d){var f="string"==typeof d?a[d]:d;b(f)||(f=a[f]);return function(){a.called=d;return f.apply(a,[this.nodeName?c.$(this):this].concat(e.call(arguments,0)))}},o;c.Construct("can.Control",{setup:function(){c.Construct.setup.apply(this,arguments);if(this!==c.Control){var a;this.actions={};for(a in this.prototype)this._isAction(a)&&
|
|
40
|
+
(this.actions[a]=this._action(a))}},_isAction:function(a){var c=this.prototype[a],d=typeof c;return"constructor"!==a&&("function"==d||"string"==d&&b(this.prototype[c]))&&!(!h[a]&&!L[a]&&!/[^\w]/.test(a))},_action:function(a,b){g.lastIndex=0;if(b||!g.test(a)){var d=b?c.sub(a,[b,q]):a,f=c.isArray(d),e=(f?d[1]:d).match(/^(?:(.*?)\s)?([\w\.\:>]+)$/);return{processor:L[e[2]]||o,parts:e,delegate:f?d[0]:j}}},processors:{},defaults:{}},{setup:function(a,b){var f=this.constructor,e=f.pluginName||f._fullName;
|
|
41
|
+
this.element=c.$(a);e&&"can_control"!==e&&this.element.addClass(e);(e=c.data(this.element,"controls"))||c.data(this.element,"controls",e=[]);e.push(this);this.options=d({},f.defaults,b);this.on();return[this.element,this.options]},on:function(b,d,f,e){if(!b){this.off();var b=this.constructor,d=this._bindings,f=b.actions,e=this.element,g=k(this,"destroy"),h,o;for(h in f)f.hasOwnProperty(h)&&(o=f[h]||b._action(h,this.options),d.push(o.processor(o.delegate||e,o.parts[2],o.parts[1],h,this)));c.bind.call(e,
|
|
42
|
+
"destroyed",g);d.push(function(a){c.unbind.call(a,"destroyed",g)});return d.length}"string"==typeof b&&(e=f,f=d,d=b,b=this.element);"string"==typeof e&&(e=k(this,e));this._bindings.push(d?i(b,c.trim(d),f,e):a(b,f,e));return this._bindings.length},off:function(){var a=this.element[0];f(this._bindings||[],function(b){b(a)});this._bindings=[]},destroy:function(){var a=this.constructor,a=a.pluginName||a._fullName;this.off();a&&"can_control"!==a&&this.element.removeClass(a);a=c.data(this.element,"controls");
|
|
43
|
+
a.splice(c.inArray(this,a),1);c.trigger(this,"destroyed");this.element=null}});var L=c.Control.processors;o=function(b,d,f,e,g){e=k(g,e);return f?i(b,c.trim(f),d,e):a(b,d,e)};f("change click contextmenu dblclick keydown keyup keypress mousedown mousemove mouseout mouseover mouseup reset resize scroll select submit focusin focusout mouseenter mouseleave".split(" "),function(a){L[a]=o})})();c.Control.processors.route=function(a,b,d,f,e){c.route(d||"");var g,h=function(a){if(c.route.attr("route")===
|
|
44
|
+
(d||"")&&(a.batchNum===j||a.batchNum!==g))if(g=a.batchNum,a=c.route.attr(),delete a.route,c.isFunction(e[f]))e[f](a);else e[e[f]](a)};c.route.bind("change",h);return function(){c.route.unbind("change",h)}};var H=c.isFunction,Qa=c.makeArray,qa=1,l=c.view=function(a,b,d,f){a=l.render(a,b,d,f);return c.isDeferred(a)?a.pipe(function(a){return l.frag(a)}):l.frag(a)};c.extend(l,{frag:function(a,b){return l.hookup(l.fragment(a),b)},fragment:function(a){a=c.buildFragment(a,document.body);a.childNodes.length||
|
|
45
|
+
a.appendChild(document.createTextNode(""));return a},toId:function(a){return c.map(a.toString().split(/\/|\./g),function(a){if(a)return a}).join("_")},hookup:function(a,b){var d=[],f,e,g,h=0;for(c.each(a.childNodes?c.makeArray(a.childNodes):a,function(a){1===a.nodeType&&(d.push(a),d.push.apply(d,c.makeArray(a.getElementsByTagName("*"))))});g=d[h++];)if(g.getAttribute&&(f=g.getAttribute("data-view-id"))&&(e=l.hookups[f]))e(g,b,f),delete l.hookups[f],g.removeAttribute("data-view-id");return a},hookups:{},
|
|
46
|
+
hook:function(a){l.hookups[++qa]=a;return" data-view-id='"+qa+"'"},cached:{},cache:!0,register:function(a){this.types["."+a.suffix]=a},types:{},ext:".ejs",registerScript:function(){},preload:function(){},render:function(a,b,d,f){H(d)&&(f=d,d=j);var e=Ra(b);if(e.length){var g=new c.Deferred;e.push(ra(a,!0));c.when.apply(c,e).then(function(a){var e=Qa(arguments),h=e.pop();if(c.isDeferred(b))b=sa(a);else for(var j in b)c.isDeferred(b[j])&&(b[j]=sa(e.shift()));e=h(b,d);g.resolve(e);f&&f(e)});return g}var h,
|
|
47
|
+
e=H(f),g=ra(a,e);e?(h=g,g.then(function(a){f(a(b,d))})):g.then(function(a){h=a(b,d)});return h}});c.isDeferred=function(a){return a&&H(a.then)&&H(a.pipe)};var ta=function(a,b){if(!a.length)throw"can.view: No template or empty template:"+b;},ra=function(a,b){var d=a.match(/\.[\w\d]+$/),f,e,g,h=function(a){var a=f.renderer(g,a),b=new c.Deferred;b.resolve(a);l.cache&&(l.cached[g]=b);return b};a.match(/^#/)&&(a=a.substr(1));if(e=document.getElementById(a))d="."+e.type.match(/\/(x\-)?(.+)/)[2];!d&&!l.cached[a]&&
|
|
48
|
+
(a+=d=l.ext);c.isArray(d)&&(d=d[0]);g=c.view.toId(a);if(a.match(/^\/\//))var i=a.substr(2),a=!q.steal?"/"+i:steal.root.mapJoin(i);f=l.types[d];if(l.cached[g])return l.cached[g];if(e)return h(e.innerHTML);var k=new c.Deferred;c.ajax({async:b,url:a,dataType:"text",error:function(b){ta("",a);k.reject(b)},success:function(b){ta(b,a);k.resolve(f.renderer(g,b));l.cache&&(l.cached[g]=k)}});return k},Ra=function(a){var b=[];if(c.isDeferred(a))return[a];for(var d in a)c.isDeferred(a[d])&&b.push(a[d]);return b},
|
|
49
|
+
sa=function(a){return c.isArray(a)&&"success"===a[1]?a[0]:a};q.steal&&steal.type("view js",function(a,b){var d=c.view.types["."+a.type],f=c.view.toId(a.rootSrc);a.text="steal('"+(d.plugin||"can/view/"+a.type)+"').then(function($){can.view.preload('"+f+"',"+a.text+");\n})";b()});c.extend(c.view,{register:function(a){this.types["."+a.suffix]=a;q.steal&&steal.type(a.suffix+" view js",function(a,d){var f=c.view.types["."+a.type],e=c.view.toId(a.rootSrc+"");a.text=f.script(e,a.text);d()});c.view[a.suffix]=
|
|
50
|
+
function(b,c){l.preload(b,a.renderer(b,c))}},registerScript:function(a,b,c){return"can.view.preload('"+b+"',"+l.types["."+a].script(b,c)+");"},preload:function(a,b){c.view.cached[a]=(new c.Deferred).resolve(function(a,c){return b.call(a,a,c)})}});var Sa=function(a,b){var d;c.Observe&&(d=c.Observe.__reading,c.Observe.__reading=function(a,b){f.push({obj:a,attr:b})});var f=[],e=a.call(b);c.Observe&&(c.Observe.__reading=d);return{value:e,observed:f}},ua=function(a,b,d){var f={},e=!0,g={value:j,teardown:function(){for(var a in f){var b=
|
|
51
|
+
f[a];b.observe.obj.unbind(b.observe.attr,h);delete f[a]}}},h=function(){var a=g.value,b=i();g.value=b;b!==a&&d(b,a)},i=function(){var d=Sa(a,b),g=d.observed,d=d.value;e=!e;c.each(g,function(a){f[a.obj._namespace+"|"+a.attr]?f[a.obj._namespace+"|"+a.attr].matched=e:(f[a.obj._namespace+"|"+a.attr]={matched:e,observe:a},a.obj.bind(a.attr,h))});for(var i in f)g=f[i],g.matched!==e&&(g.observe.obj.unbind(g.observe.attr,h),delete f[i]);return d};g.value=i();g.isListening=!c.isEmptyObject(f);return g};c.compute=
|
|
52
|
+
function(a,b){if(a.isComputed)return a;var d,f=0,e,g=!0;"function"===typeof a?e=function(c){return c===j?d?d.value:a.call(b||this):a.apply(b||this,arguments)}:(e=function(b){if(b===j)return a;var d=a;a=b;d!==b&&c.trigger(e,"change",[b,d]);return b},g=!1);e.isComputed=!0;e.bind=function(h,i){c.addEvent.apply(e,arguments);f===0&&g&&(d=ua(a,b||this,function(a,b){c.trigger(e,"change",[a,b])}));f++};e.unbind=function(a,b){c.removeEvent.apply(e,arguments);f--;f===0&&g&&d.teardown()};return e};c.compute.binder=
|
|
53
|
+
ua;var Ta=function(a){eval(a)},v=c.extend,va=/\s*\(([\$\w]+)\)\s*->([^\n]*)/,wa=/([^\s]+)=$/,Ua=/(\r|\n)+/g,Va=/__!!__/g,Wa={"":"span",table:"tr",tr:"td",ol:"li",ul:"li",tbody:"tr",thead:"tr",tfoot:"tr"},C={"class":"className"},xa=c.each(["checked","disabled","readonly","required"],function(a){C[a]=a}),T=function(a,b,d){C[b]?a[C[b]]=-1<c.inArray(b,xa)?!0:d:a.setAttribute(b,d)},Xa=function(a){return"string"==typeof a||"number"==typeof a?c.esc(a):U(a)},U=function(a){if("string"==typeof a)return a;if(!a&&
|
|
54
|
+
0!=a)return"";var b=a.hookup&&function(b,c){a.hookup.call(a,b,c)}||"function"==typeof a&&a;return b?(A.push(b),""):""+a},n=function(a){if(this.constructor!=n){var b=new n(a);return function(a,c){return b.render(a,c)}}"function"==typeof a?this.template={fn:a}:(v(this,a),this.template=Ya(this.text,this.name))};c.EJS=n;n.prototype.render=function(a,b){a=a||{};return this.template.fn.call(a,a,new n.Helpers(a,b||{}))};v(n,{txt:function(a,b,d,f,e){var g=c.compute.binder(e,f,function(a,b){o(a,b)});if(!g.isListening)return(a||
|
|
55
|
+
0!==d?Xa:U)(g.value);var h,i=function(a){c.bind.call(a,"destroyed",g.teardown);h=a},k=function(a){a||(g.teardown(),c.unbind.call(h,"destroyed",g.teardown))},b=Wa[b]||"span",o;if(0==d)return"<"+b+c.view.hook(a?function(a,b){o=function(a){d.nodeValue=""+a;k(d.parentNode)};var c=b&&11===a.parentNode.nodeType?b:a.parentNode,d=document.createTextNode(g.value);c.insertBefore(d,a);c.removeChild(a);i(c)}:function(a,b){o=function(a){e[0].parentNode&&(e=d(a,e));k(e[0].parentNode)};var b=b&&11===a.parentNode.nodeType?
|
|
56
|
+
b:a.parentNode,d=function(a,d){var e=c.view.frag(a,b),f=c.map(e.childNodes,function(a){return a}),g=d[d.length-1];g.nextSibling?g.parentNode.insertBefore(e,g.nextSibling):g.parentNode.appendChild(e);c.remove(c.$(d));return f},e=d(g.value,[a]);i(b)})+"></"+b+">";if(1===d){var l=g.value.replace(/['"]/g,"").split("=")[0];A.push(function(a){o=function(b){var b=(b||"").replace(/['"]/g,"").split("="),d=b[0];if(d!=l&&l){var e=l;-1<c.inArray(e,xa)?a[e]=!1:a.removeAttribute(e)}d&&(T(a,d,b[1]),l=d)};i(a)});
|
|
57
|
+
return g.value}A.push(function(a){o=function(){T(a,d,h.render())};var b=c.$(a),e;(e=c.data(b,"hooks"))||c.data(b,"hooks",e={});var f=C[d]?a[C[d]]:a.getAttribute(d),b=f.split("__!!__"),h;e[d]?e[d].bindings.push(g):e[d]={render:function(){var a=0;return f.replace(Va,function(){return U(h.bindings[a++].value)})},bindings:[g],batchNum:j};h=e[d];b.splice(1,0,g.value);T(a,d,b.join(""));i(a)});return"__!!__"},pending:function(){if(A.length){var a=A.slice(0);A=[];return c.view.hook(function(b){c.each(a,function(a){a(b)})})}return""}});
|
|
58
|
+
var Za=RegExp("(<%%|%%>|<%==|<%=|<%#|<%|%>|<|>|\"|')","g"),B=null,I=s=null,A=[],Ya=function(a,b){var c=[],f=0,a=a.replace(Ua,"\n");a.replace(Za,function(b,e,g){g>f&&c.push(a.substring(f,g));c.push(e);f=g+e.length});f<a.length&&c.push(a.substr(f));var e="",g=["var ___v1ew = [];"],h=function(a,b){g.push("___v1ew.push(",'"',a.split("\\").join("\\\\").split("\n").join("\\n").split('"').join('\\"').split("\t").join("\\t"),'"'+(b||"")+");")},i=[],k,l=null,p=!1,m="",n=[],q=0,r;for(B=s=I=null;(r=c[q++])!==
|
|
59
|
+
j;){if(null===l)switch(r){case "<%":case "<%=":case "<%==":p=1;case "<%#":l=r;e.length&&h(e);e="";break;case "<%%":e+="<%";break;case "<":0!==c[q].indexOf("!--")&&(B=1,p=0);e+=r;break;case ">":B=0;p?(h(e,',can.EJS.pending(),">"'),e=""):e+=r;"/"==k.substr(-1)&&(n.pop(),m=n[n.length-1]);break;case "'":case '"':B&&(s&&s===r?s=null:null===s&&(s=r,I=k));default:"<"===k&&(m=r.split(" ")[0],0===m.indexOf("/")&&n.pop()===m.substr(1)?m=n[n.length-1]||m.substr(1):n.push(m)),e+=r}else switch(r){case "%>":switch(l){case "<%":k=
|
|
60
|
+
--e.split("{").length- --e.split("}").length;1==k?(g.push("___v1ew.push(","can.EJS.txt(0,'"+m+"',"+(s?"'"+I.match(wa)[1]+"'":B?1:0)+",this,function(){","var ___v1ew = [];",e),i.push({before:"",after:"return ___v1ew.join('')}));\n"})):(f=i.length&&-1==k?i.pop():{after:";"},f.before&&g.push(f.before),g.push(e,";",f.after));break;case "<%=":case "<%==":(k=--e.split("{").length- --e.split("}").length)&&i.push({before:"return ___v1ew.join('')",after:"}));"}),va.test(e)&&(e=e.match(va),e="function(__){var "+
|
|
61
|
+
e[1]+"=can.$(__);"+e[2]+"}"),g.push("___v1ew.push(","can.EJS.txt("+("<%="===l?1:0)+",'"+m+"',"+(s?"'"+I.match(wa)[1]+"'":B?1:0)+",this,function(){ return ",e,k?"var ___v1ew = [];":"}));")}l=null;e="";break;case "<%%":e+="<%";break;default:e+=r}k=r}e.length&&h(e);g.push(";");h={out:"with(_VIEW) { with (_CONTEXT) {"+g.join("")+" return ___v1ew.join('')}}"};Ta.call(h,"this.fn = (function(_CONTEXT,_VIEW){"+h.out+"});\r\n//@ sourceURL="+b+".js");return h};n.Helpers=function(a,b){this._data=a;this._extras=
|
|
62
|
+
b;v(this,b)};n.Helpers.prototype={list:function(a,b){c.each(a,function(c,f){b(c,f,a)})}};c.view.register({suffix:"ejs",script:function(a,b){return"can.EJS(function(_CONTEXT,_VIEW) { "+(new n({text:b,name:a})).template.out+" })"},renderer:function(a,b){return n({text:b,name:a})}});"function"===typeof define&&define.amd?define("can",[],function(){return c}):q.can=c})(can={},this);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
window.Admins = can.Control({
|
|
2
|
+
|
|
3
|
+
init: (el, opt) ->
|
|
4
|
+
@opt = opt
|
|
5
|
+
@model = Admin.models JSON.parse($('#admins_JSON').text())
|
|
6
|
+
return
|
|
7
|
+
|
|
8
|
+
"form reset": (el, ev) ->
|
|
9
|
+
li = el.parents('li')
|
|
10
|
+
if li.hasClass('empty')
|
|
11
|
+
$('#admins .empty').remove()
|
|
12
|
+
$('.add-admin').toggle()
|
|
13
|
+
else
|
|
14
|
+
ev.preventDefault()
|
|
15
|
+
la = li.find('.manage')
|
|
16
|
+
txt = la.text()
|
|
17
|
+
la.text(la.data('inverse'))
|
|
18
|
+
la.data('inverse', txt)
|
|
19
|
+
la.addClass('label-info')
|
|
20
|
+
li.find('.item-content:last').remove()
|
|
21
|
+
|
|
22
|
+
".add-admin click": (el, ev) ->
|
|
23
|
+
ev.preventDefault()
|
|
24
|
+
$('#admins .empty').remove()
|
|
25
|
+
$('#admins').prepend(can.view( 'admin_form_EJS', { item: new Admin } ))
|
|
26
|
+
$('#admin_user_virtual_domain_ids').chosen
|
|
27
|
+
allow_single_deselect: true
|
|
28
|
+
$('.add-admin').toggle()
|
|
29
|
+
|
|
30
|
+
"#new_admin_user submit": (el, ev) ->
|
|
31
|
+
ev.preventDefault()
|
|
32
|
+
self = this
|
|
33
|
+
li = el.parents('li')
|
|
34
|
+
values = el.formParams()
|
|
35
|
+
item = new Admin(values["admin_user"])
|
|
36
|
+
if item.errors() # validation error
|
|
37
|
+
item.alert()
|
|
38
|
+
return
|
|
39
|
+
if li.hasClass('empty')
|
|
40
|
+
Admin.create(values, (json) ->
|
|
41
|
+
# callback function after create
|
|
42
|
+
if json["errors"]
|
|
43
|
+
li.find('.item').append(
|
|
44
|
+
can.view( 'errors_EJS', { errors: json["errors"] } )
|
|
45
|
+
)
|
|
46
|
+
else
|
|
47
|
+
# post-create hook
|
|
48
|
+
li.removeClass('empty').attr('id', 'admin_'+json.id)
|
|
49
|
+
# show links to edit and remove with right id
|
|
50
|
+
li.find('.item').html(
|
|
51
|
+
can.view( 'admin_item_EJS', { item: item } )
|
|
52
|
+
).find('.btn-group a').attr('href', (i, v) ->
|
|
53
|
+
return unescape(v).replace(/{id}/g, json.id)
|
|
54
|
+
)
|
|
55
|
+
self.model.unshift(item)
|
|
56
|
+
$('.add-admin').toggle()
|
|
57
|
+
)
|
|
58
|
+
else
|
|
59
|
+
item.attr('id', li.attr('id').replace('admin_',''))
|
|
60
|
+
item.save (item) ->
|
|
61
|
+
# callback function after update
|
|
62
|
+
li.find('.item').html(
|
|
63
|
+
can.view( 'admin_item_EJS', { item: item } )
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
".delete click": (el, ev) ->
|
|
71
|
+
ev.preventDefault()
|
|
72
|
+
if not confirm('Are You sure?')
|
|
73
|
+
return false
|
|
74
|
+
li = el.parents('li')
|
|
75
|
+
id = li.attr('id').replace('admin_','')
|
|
76
|
+
item = @model.with_id(parseInt(id))
|
|
77
|
+
@model.splice(@model.indexOf(item), 1)
|
|
78
|
+
item.destroy()
|
|
79
|
+
li.remove()
|
|
80
|
+
return false
|
|
81
|
+
|
|
82
|
+
".manage click": (el, ev) ->
|
|
83
|
+
ev.preventDefault()
|
|
84
|
+
li = el.parents('li')
|
|
85
|
+
txt = el.text()
|
|
86
|
+
el.text(el.data('inverse'))
|
|
87
|
+
el.data('inverse', txt)
|
|
88
|
+
if el.hasClass('label-info')
|
|
89
|
+
el.removeClass('label-info')
|
|
90
|
+
else
|
|
91
|
+
el.addClass('label-info')
|
|
92
|
+
li.find('.item-content:last').remove()
|
|
93
|
+
return false
|
|
94
|
+
id = li.attr('id').replace('admin_','')
|
|
95
|
+
item = @model.with_id(parseInt(id))
|
|
96
|
+
li.find('.item').append(
|
|
97
|
+
can.view( 'manage_area_EJS', { item: item } )
|
|
98
|
+
)
|
|
99
|
+
if item['domains']
|
|
100
|
+
$('#admin_user_virtual_domain_ids').val(item.domain_ids())
|
|
101
|
+
$('#admin_user_virtual_domain_ids').chosen
|
|
102
|
+
allow_single_deselect: true
|
|
103
|
+
return false
|
|
104
|
+
|
|
105
|
+
})
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
window.Aliases = can.Control({
|
|
2
|
+
|
|
3
|
+
init: (el, opts) ->
|
|
4
|
+
@el = el
|
|
5
|
+
@di = opts.domain_id
|
|
6
|
+
@dname = opts.domain_name
|
|
7
|
+
@model = opts.items
|
|
8
|
+
@refresh()
|
|
9
|
+
|
|
10
|
+
show_title: (type) ->
|
|
11
|
+
$(@el).find('h4 span').hide()
|
|
12
|
+
type = (if type.length then '_' else '') + type
|
|
13
|
+
$(@el).find('h4 .title' + type).show()
|
|
14
|
+
|
|
15
|
+
refresh: () ->
|
|
16
|
+
$(@el).find('table').html( can.view( 'aliass_each_EJS', {
|
|
17
|
+
items: @model
|
|
18
|
+
domain_name: @dname
|
|
19
|
+
} ) )
|
|
20
|
+
|
|
21
|
+
"form reset": (el, ev) ->
|
|
22
|
+
@refresh()
|
|
23
|
+
@show_title('')
|
|
24
|
+
|
|
25
|
+
".edit-alias click": (el, ev) ->
|
|
26
|
+
ev.preventDefault()
|
|
27
|
+
@show_title('edit')
|
|
28
|
+
@el.find('.table tr').hide()
|
|
29
|
+
li = el.parents('tr')
|
|
30
|
+
id = li.attr('id').replace('alias_', '')
|
|
31
|
+
di = @model[id].virtual_domain_id
|
|
32
|
+
li.html(
|
|
33
|
+
can.view( 'aliass_form_EJS', { item: @model[id] } )
|
|
34
|
+
).find('input[type=submit]').attr('value','<%=I18n.t('update')%>')
|
|
35
|
+
li.find('form').attr('action', (i, v) ->
|
|
36
|
+
return unescape(v).replace(/{domain_id}/g, di)
|
|
37
|
+
).addClass('edit_alias')
|
|
38
|
+
li.show()
|
|
39
|
+
return false
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
".edit_alias submit": (el, ev) ->
|
|
43
|
+
ev.preventDefault()
|
|
44
|
+
values = el.formParams()
|
|
45
|
+
id = el.parents('tr').attr('id').replace('alias_', '')
|
|
46
|
+
item = @model[id]
|
|
47
|
+
item.attr(values['virtual_alias'])
|
|
48
|
+
if item.errors()
|
|
49
|
+
item.alert()
|
|
50
|
+
return
|
|
51
|
+
Alias.update(values, item, el.attr('action'))
|
|
52
|
+
@show_title('')
|
|
53
|
+
@refresh()
|
|
54
|
+
return false
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
".new-alias click": (el, ev) ->
|
|
58
|
+
ev.preventDefault()
|
|
59
|
+
@show_title('new')
|
|
60
|
+
@el.find('.table tr').hide()
|
|
61
|
+
di = @di
|
|
62
|
+
$('#domain_'+di+' .aliases .new').remove()
|
|
63
|
+
$('#domain_'+di+' .aliases table').prepend(can.view( 'aliass_tabr_EJS' ))
|
|
64
|
+
$('#domain_'+di+' .aliases .new').prepend(
|
|
65
|
+
can.view( 'aliass_form_EJS', { item: new Alias } )
|
|
66
|
+
).find('form').attr('action', (i, v) ->
|
|
67
|
+
return unescape(v).replace(/{domain_id}/g, di)
|
|
68
|
+
)
|
|
69
|
+
@el.find('.table tr:first').show()
|
|
70
|
+
return false
|
|
71
|
+
|
|
72
|
+
".new form submit": (el, ev) ->
|
|
73
|
+
ev.preventDefault()
|
|
74
|
+
li = el.parents('.new')
|
|
75
|
+
self = this
|
|
76
|
+
values = el.formParams()
|
|
77
|
+
item = new Alias(values["virtual_alias"])
|
|
78
|
+
if item.errors()
|
|
79
|
+
item.alert()
|
|
80
|
+
return
|
|
81
|
+
Alias.create(values, @di, (json) ->
|
|
82
|
+
if json["errors"]
|
|
83
|
+
alert(json["errors"])
|
|
84
|
+
else
|
|
85
|
+
li.removeClass('new').attr('id', 'alias_'+json.id)
|
|
86
|
+
self.model.unshift(item)
|
|
87
|
+
self.show_title('')
|
|
88
|
+
self.refresh()
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
})
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
window.Domains = can.Control({
|
|
2
|
+
|
|
3
|
+
init: (el, opt) ->
|
|
4
|
+
@opt = opt
|
|
5
|
+
@model = Domain.models JSON.parse($('#domains_JSON').text())
|
|
6
|
+
return
|
|
7
|
+
|
|
8
|
+
"form reset": (el, ev) ->
|
|
9
|
+
li = el.parents('li')
|
|
10
|
+
if li.hasClass('empty')
|
|
11
|
+
$('#domains .empty').remove()
|
|
12
|
+
$('.add-domain').toggle()
|
|
13
|
+
else if li.hasClass('inedit')
|
|
14
|
+
id = li.attr('id').replace('domain_','')
|
|
15
|
+
item = @model.with_id(parseInt(id))
|
|
16
|
+
li.find('.item').html(
|
|
17
|
+
can.view( 'domain_item_EJS', { item: item } )
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
".add-domain click": (el, ev) ->
|
|
21
|
+
ev.preventDefault()
|
|
22
|
+
$('#domains .empty').remove()
|
|
23
|
+
$('#domains').prepend(can.view( 'domain_form_EJS', { item: new Domain } ))
|
|
24
|
+
$('.add-domain').toggle()
|
|
25
|
+
|
|
26
|
+
".rm-domain click": (el, ev) ->
|
|
27
|
+
ev.preventDefault()
|
|
28
|
+
$('#domains .empty').remove()
|
|
29
|
+
$('.add-domain').toggle()
|
|
30
|
+
|
|
31
|
+
"#new_virtual_domain submit": (el, ev) ->
|
|
32
|
+
ev.preventDefault()
|
|
33
|
+
self = this
|
|
34
|
+
values = el.formParams()
|
|
35
|
+
item = new Domain(values["virtual_domain"])
|
|
36
|
+
if item.errors() # validation error
|
|
37
|
+
item.alert()
|
|
38
|
+
return
|
|
39
|
+
li = $('#domains .empty')
|
|
40
|
+
Domain.create(values, (json) ->
|
|
41
|
+
# callback function after creation
|
|
42
|
+
if json["errors"]
|
|
43
|
+
li.find('.item').append(
|
|
44
|
+
can.view( 'errors_EJS', { errors: json["errors"] } )
|
|
45
|
+
)
|
|
46
|
+
else
|
|
47
|
+
# post-creation hook
|
|
48
|
+
item.attr('id', json.id)
|
|
49
|
+
li.removeClass('empty').attr('id', 'domain_'+json.id)
|
|
50
|
+
# show links to edit and remove with right id
|
|
51
|
+
li.find('.item').html(
|
|
52
|
+
can.view( 'domain_item_EJS', { item: item } )
|
|
53
|
+
).find('.btn-group a').attr('href', (i, v) ->
|
|
54
|
+
return unescape(v).replace(/{id}/g, json.id)
|
|
55
|
+
)
|
|
56
|
+
self.model.unshift(item)
|
|
57
|
+
$('.add-domain').toggle()
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
".edit click": (el, ev) ->
|
|
63
|
+
ev.preventDefault()
|
|
64
|
+
li = el.parents('li')
|
|
65
|
+
id = li.attr('id').replace('domain_','')
|
|
66
|
+
item = @model.with_id(parseInt(id))
|
|
67
|
+
li.find('.item').html(can.view( 'domain_edit_EJS', { item: item } ))
|
|
68
|
+
li.addClass('inedit')
|
|
69
|
+
return false
|
|
70
|
+
|
|
71
|
+
".delete click": (el, ev) ->
|
|
72
|
+
ev.preventDefault()
|
|
73
|
+
if not confirm('Are You sure?')
|
|
74
|
+
return false
|
|
75
|
+
li = el.parents('li')
|
|
76
|
+
id = li.attr('id').replace('domain_','')
|
|
77
|
+
item = @model.with_id(parseInt(id))
|
|
78
|
+
@model.splice(@model.indexOf(item), 1)
|
|
79
|
+
item.destroy()
|
|
80
|
+
li.remove()
|
|
81
|
+
return false
|
|
82
|
+
|
|
83
|
+
".manage click": (el, ev) ->
|
|
84
|
+
ev.preventDefault()
|
|
85
|
+
li = el.parents('li')
|
|
86
|
+
txt = el.text()
|
|
87
|
+
el.text(el.data('inverse'))
|
|
88
|
+
el.data('inverse', txt)
|
|
89
|
+
if el.hasClass('label-info')
|
|
90
|
+
el.removeClass('label-info')
|
|
91
|
+
else
|
|
92
|
+
el.addClass('label-info')
|
|
93
|
+
li.find('.item-content:last').remove()
|
|
94
|
+
return false
|
|
95
|
+
|
|
96
|
+
id = li.attr('id').replace('domain_','')
|
|
97
|
+
item = @model.with_id(parseInt(id))
|
|
98
|
+
if li.find('.item .item-content:last').hasClass('out')
|
|
99
|
+
return false
|
|
100
|
+
li.find('.item').append(
|
|
101
|
+
can.view( 'manage_area_EJS' )
|
|
102
|
+
)
|
|
103
|
+
users = new Users(li.find('.item .users'), {
|
|
104
|
+
items: item["virtual_users"]
|
|
105
|
+
domain_id: id
|
|
106
|
+
domain_name: item.name
|
|
107
|
+
})
|
|
108
|
+
aliases = new Aliases(li.find('.item .aliases'), {
|
|
109
|
+
items: item["virtual_aliases"]
|
|
110
|
+
domain_id: id
|
|
111
|
+
domain_name: item.name
|
|
112
|
+
})
|
|
113
|
+
return false
|
|
114
|
+
|
|
115
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
window.Settings = can.Control({
|
|
2
|
+
|
|
3
|
+
init: (el) ->
|
|
4
|
+
@tab( $('#sys_nav li:first').addClass('active') ).show()
|
|
5
|
+
@model = Property.models JSON.parse($('#system_JSON').text())
|
|
6
|
+
$('#reject_rbls').chosen
|
|
7
|
+
allow_single_deselect: true
|
|
8
|
+
return
|
|
9
|
+
|
|
10
|
+
tab: (li) ->
|
|
11
|
+
$( li.find('a').attr('href') )
|
|
12
|
+
|
|
13
|
+
server_update_callback: (res) ->
|
|
14
|
+
$('.status .warning').remove()
|
|
15
|
+
$('#system .control-group').removeClass('warning').removeClass('success')
|
|
16
|
+
|
|
17
|
+
'#sys_nav li click': (el, ev) ->
|
|
18
|
+
ev.preventDefault()
|
|
19
|
+
@tab( $('#sys_nav .active').removeClass('active') ).hide()
|
|
20
|
+
@tab( el.addClass('active') ).show()
|
|
21
|
+
|
|
22
|
+
'option selected': (el, ev) ->
|
|
23
|
+
alert('selected '+ el.val())
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
'input change': (el, ev) ->
|
|
27
|
+
id = el.attr('name').replace('property[', '').replace(']', '')
|
|
28
|
+
$(".save").removeAttr("disabled")
|
|
29
|
+
Property.update(id, el.val(), (json) ->
|
|
30
|
+
if json.result == 'success'
|
|
31
|
+
el.parents('.control-group').addClass(json.result)
|
|
32
|
+
else
|
|
33
|
+
alert('alert.property')
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
'.save click': (el, ev) ->
|
|
38
|
+
ev.preventDefault()
|
|
39
|
+
data = {}
|
|
40
|
+
$("#system form input[type=hidden]").each( () ->
|
|
41
|
+
data[$(this).attr("name")] = $(this).val()
|
|
42
|
+
)
|
|
43
|
+
if confirm('Opravdu uložit?')
|
|
44
|
+
url = '<%= Rails.application.routes.url_helpers.server_update_path %>'
|
|
45
|
+
$.post(url, data, @server_update_callback, "json")
|
|
46
|
+
|
|
47
|
+
})
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
window.Users = can.Control({
|
|
2
|
+
|
|
3
|
+
init: (el, opts) ->
|
|
4
|
+
@el = el
|
|
5
|
+
@di = opts.domain_id
|
|
6
|
+
@dname = opts.domain_name
|
|
7
|
+
@model = opts.items
|
|
8
|
+
@dname = opts.domain_name
|
|
9
|
+
@refresh()
|
|
10
|
+
|
|
11
|
+
show_title: (type) ->
|
|
12
|
+
$(@el).find('h4 span').hide()
|
|
13
|
+
type = (if type.length then '_' else '') + type
|
|
14
|
+
$(@el).find('h4 .title' + type).show()
|
|
15
|
+
|
|
16
|
+
refresh: () ->
|
|
17
|
+
$(@el).find('table').html( can.view( 'vusers_each_EJS', {
|
|
18
|
+
items: @model
|
|
19
|
+
domain_name: @dname
|
|
20
|
+
} ) )
|
|
21
|
+
|
|
22
|
+
"form reset": (el, ev) ->
|
|
23
|
+
@refresh()
|
|
24
|
+
@show_title('')
|
|
25
|
+
|
|
26
|
+
".edit-user click": (el, ev) ->
|
|
27
|
+
ev.preventDefault()
|
|
28
|
+
@show_title('edit')
|
|
29
|
+
@el.find('.table tr').hide()
|
|
30
|
+
li = el.parents('tr')
|
|
31
|
+
id = li.attr('id').replace('user_', '')
|
|
32
|
+
di = @model[id].virtual_domain_id
|
|
33
|
+
li.html(
|
|
34
|
+
can.view( 'vusers_form_EJS', {item: @model[id], domain_name: @dname} )
|
|
35
|
+
).find('input[type=submit]').attr('value','<%=I18n.t('update')%>')
|
|
36
|
+
li.find('form').attr('action', (i, v) ->
|
|
37
|
+
return unescape(v).replace(/{domain_id}/g, di)
|
|
38
|
+
).addClass('edit_user').find('.email').append(
|
|
39
|
+
''#'<span class="add-on">@'+@dname+'</span>'
|
|
40
|
+
)
|
|
41
|
+
li.show()
|
|
42
|
+
return false
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
".edit_user submit": (el, ev) ->
|
|
46
|
+
ev.preventDefault()
|
|
47
|
+
values = el.formParams()
|
|
48
|
+
id = el.parents('tr').attr('id').replace('user_', '')
|
|
49
|
+
item = @model[id]
|
|
50
|
+
item.attr(values['virtual_user'])
|
|
51
|
+
if item.errors()
|
|
52
|
+
item.alert()
|
|
53
|
+
return
|
|
54
|
+
User.update(values, item, el.attr('action'))
|
|
55
|
+
@show_title('')
|
|
56
|
+
@refresh()
|
|
57
|
+
return false
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
".new-user click": (el, ev) ->
|
|
61
|
+
ev.preventDefault()
|
|
62
|
+
@show_title('new')
|
|
63
|
+
@el.find('.table tr').hide()
|
|
64
|
+
di = @di
|
|
65
|
+
$('#domain_'+di+' .users .new').remove()
|
|
66
|
+
$('#domain_'+di+' .users table').prepend(can.view( 'vusers_tabr_EJS' ))
|
|
67
|
+
$('#domain_'+di+' .users .new').prepend(
|
|
68
|
+
can.view( 'vusers_form_EJS', { item: new User } )
|
|
69
|
+
).find('form').attr('action', (i, v) ->
|
|
70
|
+
return unescape(v).replace(/{domain_id}/g, di)
|
|
71
|
+
)
|
|
72
|
+
@el.find('.table tr:first').show()
|
|
73
|
+
return false
|
|
74
|
+
|
|
75
|
+
".new form submit": (el, ev) ->
|
|
76
|
+
ev.preventDefault()
|
|
77
|
+
li = el.parents('.new')
|
|
78
|
+
self = this
|
|
79
|
+
values = el.formParams()
|
|
80
|
+
item = new User(values["virtual_user"])
|
|
81
|
+
if item.errors()
|
|
82
|
+
item.alert()
|
|
83
|
+
return
|
|
84
|
+
User.create(values, @di, (json) ->
|
|
85
|
+
if json["errors"]
|
|
86
|
+
alert(json["errors"])
|
|
87
|
+
else
|
|
88
|
+
li.removeClass('new').attr('id', 'user_'+json.id)
|
|
89
|
+
self.model.unshift(item)
|
|
90
|
+
self.show_title('')
|
|
91
|
+
self.refresh()
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
})
|