├── .gitignore ├── fabfile.py ├── manage.py ├── readme ├── restore.sh ├── static ├── admin │ ├── css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── dashboard.css │ │ ├── forms.css │ │ ├── ie.css │ │ ├── login.css │ │ ├── rtl.css │ │ └── widgets.css │ ├── img │ │ ├── changelist-bg.gif │ │ ├── changelist-bg_rtl.gif │ │ ├── chooser-bg.gif │ │ ├── chooser_stacked-bg.gif │ │ ├── default-bg-reverse.gif │ │ ├── default-bg.gif │ │ ├── deleted-overlay.gif │ │ ├── gis │ │ │ ├── move_vertex_off.png │ │ │ └── move_vertex_on.png │ │ ├── icon-no.gif │ │ ├── icon-unknown.gif │ │ ├── icon-yes.gif │ │ ├── icon_addlink.gif │ │ ├── icon_alert.gif │ │ ├── icon_calendar.gif │ │ ├── icon_changelink.gif │ │ ├── icon_clock.gif │ │ ├── icon_deletelink.gif │ │ ├── icon_error.gif │ │ ├── icon_searchbox.png │ │ ├── icon_success.gif │ │ ├── inline-delete-8bit.png │ │ ├── inline-delete.png │ │ ├── inline-restore-8bit.png │ │ ├── inline-restore.png │ │ ├── inline-splitter-bg.gif │ │ ├── nav-bg-grabber.gif │ │ ├── nav-bg-reverse.gif │ │ ├── nav-bg-selected.gif │ │ ├── nav-bg.gif │ │ ├── selector-icons.gif │ │ ├── selector-search.gif │ │ ├── sorting-icons.gif │ │ ├── tool-left.gif │ │ ├── tool-left_over.gif │ │ ├── tool-right.gif │ │ ├── tool-right_over.gif │ │ ├── tooltag-add.gif │ │ ├── tooltag-add_over.gif │ │ ├── tooltag-arrowright.gif │ │ └── tooltag-arrowright_over.gif │ └── js │ │ ├── LICENSE-JQUERY.txt │ │ ├── SelectBox.js │ │ ├── SelectFilter2.js │ │ ├── actions.js │ │ ├── actions.min.js │ │ ├── admin │ │ ├── DateTimeShortcuts.js │ │ └── RelatedObjectLookups.js │ │ ├── calendar.js │ │ ├── collapse.js │ │ ├── collapse.min.js │ │ ├── core.js │ │ ├── inlines.js │ │ ├── inlines.min.js │ │ ├── jquery.init.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── prepopulate.js │ │ ├── prepopulate.min.js │ │ ├── timeparse.js │ │ └── urlify.js ├── css │ ├── amazeui.css │ ├── blue.png │ ├── blue@2x.png │ ├── bootstrap-datetimepicker.css │ ├── bootstrap.css │ └── icheck_blue.css ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── js │ ├── amazeui.min.js │ ├── amazeui.widgets.helper.min.js │ ├── avalon.min.js │ ├── bootstrap-datetimepicker.js │ ├── bootstrap-datetimepicker.zh-CN.js │ ├── chart.js │ ├── common.js │ ├── handlebars-v2.0.0.js │ ├── icheck.min.js │ ├── jquery.min.js │ ├── pingpp_pay.js │ └── upload.js └── xadmin │ ├── component.json │ ├── css │ ├── themes │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.min.css │ │ └── bootstrap-xadmin.css │ ├── xadmin.form.css │ ├── xadmin.main.css │ ├── xadmin.mobile.css │ ├── xadmin.page.dashboard.css │ ├── xadmin.plugin.aggregation.css │ ├── xadmin.plugin.formset.css │ ├── xadmin.plugin.quickfilter.css │ ├── xadmin.plugins.css │ ├── xadmin.responsive.css │ ├── xadmin.widget.editable.css │ └── xadmin.widget.select-transfer.css │ ├── js │ ├── xadmin.main.js │ ├── xadmin.page.dashboard.js │ ├── xadmin.page.form.js │ ├── xadmin.page.list.js │ ├── xadmin.plugin.actions.js │ ├── xadmin.plugin.batch.js │ ├── xadmin.plugin.bookmark.js │ ├── xadmin.plugin.charts.js │ ├── xadmin.plugin.details.js │ ├── xadmin.plugin.editable.js │ ├── xadmin.plugin.filters.js │ ├── xadmin.plugin.formset.js │ ├── xadmin.plugin.portal.js │ ├── xadmin.plugin.quick-form.js │ ├── xadmin.plugin.quickfilter.js │ ├── xadmin.plugin.refresh.js │ ├── xadmin.plugin.revision.js │ ├── xadmin.plugin.sortable.js │ ├── xadmin.plugin.themes.js │ ├── xadmin.responsive.js │ ├── xadmin.widget.datetime.js │ ├── xadmin.widget.multiselect.js │ ├── xadmin.widget.select-transfer.js │ └── xadmin.widget.select.js │ └── vendor │ ├── autotype │ └── index.js │ ├── bootstrap-datepicker │ ├── css │ │ └── datepicker.css │ └── js │ │ ├── bootstrap-datepicker.js │ │ └── locales │ │ ├── bootstrap-datepicker.bg.js │ │ ├── bootstrap-datepicker.ca.js │ │ ├── bootstrap-datepicker.cs.js │ │ ├── bootstrap-datepicker.da.js │ │ ├── bootstrap-datepicker.de.js │ │ ├── bootstrap-datepicker.el.js │ │ ├── bootstrap-datepicker.es.js │ │ ├── bootstrap-datepicker.fi.js │ │ ├── bootstrap-datepicker.fr.js │ │ ├── bootstrap-datepicker.he.js │ │ ├── bootstrap-datepicker.hr.js │ │ ├── bootstrap-datepicker.hu.js │ │ ├── bootstrap-datepicker.id.js │ │ ├── bootstrap-datepicker.is.js │ │ ├── bootstrap-datepicker.it.js │ │ ├── bootstrap-datepicker.ja.js │ │ ├── bootstrap-datepicker.kr.js │ │ ├── bootstrap-datepicker.lt.js │ │ ├── bootstrap-datepicker.lv.js │ │ ├── bootstrap-datepicker.ms.js │ │ ├── bootstrap-datepicker.nb.js │ │ ├── bootstrap-datepicker.nl.js │ │ ├── bootstrap-datepicker.pl.js │ │ ├── bootstrap-datepicker.pt-BR.js │ │ ├── bootstrap-datepicker.pt.js │ │ ├── bootstrap-datepicker.ro.js │ │ ├── bootstrap-datepicker.rs-latin.js │ │ ├── bootstrap-datepicker.rs.js │ │ ├── bootstrap-datepicker.ru.js │ │ ├── bootstrap-datepicker.sk.js │ │ ├── bootstrap-datepicker.sl.js │ │ ├── bootstrap-datepicker.sv.js │ │ ├── bootstrap-datepicker.sw.js │ │ ├── bootstrap-datepicker.th.js │ │ ├── bootstrap-datepicker.tr.js │ │ ├── bootstrap-datepicker.uk.js │ │ ├── bootstrap-datepicker.zh-CN.js │ │ └── bootstrap-datepicker.zh-TW.js │ ├── bootstrap-image-gallery │ ├── css │ │ ├── bootstrap-image-gallery.css │ │ └── bootstrap-image-gallery.min.css │ ├── img │ │ └── loading.gif │ └── js │ │ ├── bootstrap-image-gallery.js │ │ └── bootstrap-image-gallery.min.js │ ├── bootstrap-modal │ ├── css │ │ └── bootstrap-modal.css │ ├── img │ │ └── ajax-loader.gif │ └── js │ │ ├── bootstrap-modal.js │ │ └── bootstrap-modalmanager.js │ ├── bootstrap-multiselect │ ├── css │ │ └── bootstrap-multiselect.css │ └── js │ │ └── bootstrap-multiselect.js │ ├── bootstrap-timepicker │ ├── css │ │ ├── bootstrap-timepicker.css │ │ └── bootstrap-timepicker.min.css │ └── js │ │ ├── bootstrap-timepicker.js │ │ └── bootstrap-timepicker.min.js │ ├── bootstrap │ ├── css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── flot │ ├── excanvas.js │ ├── excanvas.min.js │ ├── jquery.colorhelpers.js │ ├── jquery.flot.aggregate.js │ ├── jquery.flot.canvas.js │ ├── jquery.flot.categories.js │ ├── jquery.flot.crosshair.js │ ├── jquery.flot.errorbars.js │ ├── jquery.flot.fillbetween.js │ ├── jquery.flot.image.js │ ├── jquery.flot.js │ ├── jquery.flot.navigate.js │ ├── jquery.flot.pie.js │ ├── jquery.flot.resize.js │ ├── jquery.flot.selection.js │ ├── jquery.flot.stack.js │ ├── jquery.flot.symbol.js │ ├── jquery.flot.threshold.js │ └── jquery.flot.time.js │ ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ └── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── jquery-ui │ ├── jquery.ui.core.js │ ├── jquery.ui.core.min.js │ ├── jquery.ui.effect.js │ ├── jquery.ui.effect.min.js │ ├── jquery.ui.mouse.js │ ├── jquery.ui.mouse.min.js │ ├── jquery.ui.sortable.js │ ├── jquery.ui.sortable.min.js │ ├── jquery.ui.widget.js │ └── jquery.ui.widget.min.js │ ├── jquery │ ├── jquery.js │ └── jquery.min.js │ ├── load-image │ ├── load-image.js │ └── load-image.min.js │ ├── select2 │ ├── select2-spinner.gif │ ├── select2.css │ ├── select2.js │ ├── select2.min.js │ ├── select2.png │ ├── select2_locale_de.js │ ├── select2_locale_es.js │ ├── select2_locale_eu.js │ ├── select2_locale_fr.js │ ├── select2_locale_hr.js │ ├── select2_locale_hu.js │ ├── select2_locale_it.js │ ├── select2_locale_nl.js │ ├── select2_locale_pt-BR.js │ ├── select2_locale_pt-PT.js │ ├── select2_locale_ro.js │ ├── select2_locale_ru.js │ ├── select2_locale_sk.js │ ├── select2_locale_sv.js │ ├── select2_locale_tr.js │ ├── select2_locale_ua.js │ ├── select2_locale_zh-CN.js │ └── select2x2.png │ ├── selectize │ ├── selectize.bootstrap3.css │ ├── selectize.css │ ├── selectize.default.css │ ├── selectize.js │ ├── selectize.legacy.css │ └── selectize.min.js │ └── snapjs │ ├── snap.css │ ├── snap.js │ └── snap.min.js ├── template ├── base.html └── vote │ ├── activity_chart.html │ ├── error.html │ ├── show.html │ ├── signup.html │ └── voter_chart.html ├── vote ├── __init__.py ├── adminx.py ├── models.py ├── tests.py ├── upload_file.py └── views.py ├── weixin ├── __init__.py ├── adminx.py ├── message.py ├── models.py ├── tests.py └── views.py └── weixin_vote ├── __init__.py ├── config.py ├── fake_data.py ├── local_settings.py ├── server_settings.py ├── settings.py ├── urls.py └── wsgi.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | bin/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | eggs/ 16 | lib/ 17 | lib64/ 18 | parts/ 19 | sdist/ 20 | var/ 21 | *.egg-info/ 22 | .installed.cfg 23 | *.egg 24 | 25 | # Installer logs 26 | pip-log.txt 27 | pip-delete-this-directory.txt 28 | 29 | # Unit test / coverage reports 30 | htmlcov/ 31 | .tox/ 32 | .coverage 33 | .cache 34 | nosetests.xml 35 | coverage.xml 36 | 37 | # Translations 38 | *.mo 39 | 40 | # Mr Developer 41 | .mr.developer.cfg 42 | .project 43 | .pydevproject 44 | 45 | # Rope 46 | .ropeproject 47 | .idea/ 48 | # Django stuff: 49 | *.log 50 | *.pot 51 | 52 | # Sphinx documentation 53 | docs/_build/ 54 | 55 | # Back up file 56 | *~ 57 | 58 | #db file 59 | db.db 60 | #vim cache 61 | *swp 62 | *swo 63 | 64 | #redis dump 65 | *.rdb 66 | 67 | db.sqlite3 -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from fabric.api import local, abort, settings, env, cd, run 3 | from fabric.colors import * 4 | from fabric.contrib.console import confirm 5 | 6 | env.hosts = ["root@**.com"] 7 | env.password = "***" 8 | 9 | 10 | def deploy(): 11 | with cd("/mnt/source/weixin_vote"): 12 | print green("将在远程仓库下载代码") 13 | run("git pull origin master") 14 | print red("重建数据库?") 15 | r = raw_input() 16 | if r == "yes": 17 | run("sh restore.sh") 18 | # del pyc 19 | # run('find /mnt/source/tm/ -name "*.pyc" | xargs rm -rf') 20 | 21 | print green("代码部署成功!!!") 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "weixin_vote.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /readme: -------------------------------------------------------------------------------- 1 | 微信投票系统 2 | 3 | 基于django 和 django xadmin 4 | 5 | 用户可以自己提交信息和上传图片,然后微信回复编号投票。 6 | 7 | 后台可以管理公众号信息,投票活动,选手信息,投票记录,变化曲线等等。 8 | -------------------------------------------------------------------------------- /restore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rm db.sqlite3 3 | echo "no\n" | python manage.py syncdb 4 | echo "from weixin_vote.fake_data import *" | python manage.py shell 5 | 6 | echo "成功创建数据" -------------------------------------------------------------------------------- /static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | } 25 | 26 | ul.actionlist li { 27 | overflow: hidden; 28 | text-overflow: ellipsis; 29 | -o-text-overflow: ellipsis; 30 | } 31 | -------------------------------------------------------------------------------- /static/admin/css/ie.css: -------------------------------------------------------------------------------- 1 | /* IE 6 & 7 */ 2 | 3 | /* Proper fixed width for dashboard in IE6 */ 4 | 5 | .dashboard #content { 6 | *width: 768px; 7 | } 8 | 9 | .dashboard #content-main { 10 | *width: 535px; 11 | } 12 | 13 | /* IE 6 ONLY */ 14 | 15 | /* Keep header from flowing off the page */ 16 | 17 | #container { 18 | _position: static; 19 | } 20 | 21 | /* Put the right sidebars back on the page */ 22 | 23 | .colMS #content-related { 24 | _margin-right: 0; 25 | _margin-left: 10px; 26 | _position: static; 27 | } 28 | 29 | /* Put the left sidebars back on the page */ 30 | 31 | .colSM #content-related { 32 | _margin-right: 10px; 33 | _margin-left: -115px; 34 | _position: static; 35 | } 36 | 37 | .form-row { 38 | _height: 1%; 39 | } 40 | 41 | /* Fix right margin for changelist filters in IE6 */ 42 | 43 | #changelist-filter ul { 44 | _margin-right: -10px; 45 | } 46 | 47 | /* IE ignores min-height, but treats height as if it were min-height */ 48 | 49 | .change-list .filtered { 50 | _height: 400px; 51 | } 52 | 53 | /* IE doesn't know alpha transparency in PNGs */ 54 | 55 | .inline-deletelink { 56 | background: transparent url(../img/inline-delete-8bit.png) no-repeat; 57 | } 58 | 59 | /* IE7 doesn't support inline-block */ 60 | .change-list ul.toplinks li { 61 | zoom: 1; 62 | *display: inline; 63 | } -------------------------------------------------------------------------------- /static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #eee; 5 | } 6 | 7 | .login #container { 8 | background: white; 9 | border: 1px solid #ccc; 10 | width: 28em; 11 | min-width: 300px; 12 | margin-left: auto; 13 | margin-right: auto; 14 | margin-top: 100px; 15 | } 16 | 17 | .login #content-main { 18 | width: 100%; 19 | } 20 | 21 | .login form { 22 | margin-top: 1em; 23 | } 24 | 25 | .login .form-row { 26 | padding: 4px 0; 27 | float: left; 28 | width: 100%; 29 | } 30 | 31 | .login .form-row label { 32 | padding-right: 0.5em; 33 | line-height: 2em; 34 | font-size: 1em; 35 | clear: both; 36 | color: #333; 37 | } 38 | 39 | .login .form-row #id_username, .login .form-row #id_password { 40 | clear: both; 41 | padding: 6px; 42 | width: 100%; 43 | -webkit-box-sizing: border-box; 44 | -moz-box-sizing: border-box; 45 | box-sizing: border-box; 46 | } 47 | 48 | .login span.help { 49 | font-size: 10px; 50 | display: block; 51 | } 52 | 53 | .login .submit-row { 54 | clear: both; 55 | padding: 1em 0 0 9.4em; 56 | } 57 | 58 | .login .password-reset-link { 59 | text-align: center; 60 | } 61 | -------------------------------------------------------------------------------- /static/admin/img/changelist-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/changelist-bg.gif -------------------------------------------------------------------------------- /static/admin/img/changelist-bg_rtl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/changelist-bg_rtl.gif -------------------------------------------------------------------------------- /static/admin/img/chooser-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/chooser-bg.gif -------------------------------------------------------------------------------- /static/admin/img/chooser_stacked-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/chooser_stacked-bg.gif -------------------------------------------------------------------------------- /static/admin/img/default-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/default-bg-reverse.gif -------------------------------------------------------------------------------- /static/admin/img/default-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/default-bg.gif -------------------------------------------------------------------------------- /static/admin/img/deleted-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/deleted-overlay.gif -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/gis/move_vertex_off.png -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/gis/move_vertex_on.png -------------------------------------------------------------------------------- /static/admin/img/icon-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon-no.gif -------------------------------------------------------------------------------- /static/admin/img/icon-unknown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon-unknown.gif -------------------------------------------------------------------------------- /static/admin/img/icon-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon-yes.gif -------------------------------------------------------------------------------- /static/admin/img/icon_addlink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_addlink.gif -------------------------------------------------------------------------------- /static/admin/img/icon_alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_alert.gif -------------------------------------------------------------------------------- /static/admin/img/icon_calendar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_calendar.gif -------------------------------------------------------------------------------- /static/admin/img/icon_changelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_changelink.gif -------------------------------------------------------------------------------- /static/admin/img/icon_clock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_clock.gif -------------------------------------------------------------------------------- /static/admin/img/icon_deletelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_deletelink.gif -------------------------------------------------------------------------------- /static/admin/img/icon_error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_error.gif -------------------------------------------------------------------------------- /static/admin/img/icon_searchbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_searchbox.png -------------------------------------------------------------------------------- /static/admin/img/icon_success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/icon_success.gif -------------------------------------------------------------------------------- /static/admin/img/inline-delete-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/inline-delete-8bit.png -------------------------------------------------------------------------------- /static/admin/img/inline-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/inline-delete.png -------------------------------------------------------------------------------- /static/admin/img/inline-restore-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/inline-restore-8bit.png -------------------------------------------------------------------------------- /static/admin/img/inline-restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/inline-restore.png -------------------------------------------------------------------------------- /static/admin/img/inline-splitter-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/inline-splitter-bg.gif -------------------------------------------------------------------------------- /static/admin/img/nav-bg-grabber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/nav-bg-grabber.gif -------------------------------------------------------------------------------- /static/admin/img/nav-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/nav-bg-reverse.gif -------------------------------------------------------------------------------- /static/admin/img/nav-bg-selected.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/nav-bg-selected.gif -------------------------------------------------------------------------------- /static/admin/img/nav-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/nav-bg.gif -------------------------------------------------------------------------------- /static/admin/img/selector-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/selector-icons.gif -------------------------------------------------------------------------------- /static/admin/img/selector-search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/selector-search.gif -------------------------------------------------------------------------------- /static/admin/img/sorting-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/sorting-icons.gif -------------------------------------------------------------------------------- /static/admin/img/tool-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tool-left.gif -------------------------------------------------------------------------------- /static/admin/img/tool-left_over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tool-left_over.gif -------------------------------------------------------------------------------- /static/admin/img/tool-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tool-right.gif -------------------------------------------------------------------------------- /static/admin/img/tool-right_over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tool-right_over.gif -------------------------------------------------------------------------------- /static/admin/img/tooltag-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tooltag-add.gif -------------------------------------------------------------------------------- /static/admin/img/tooltag-add_over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tooltag-add_over.gif -------------------------------------------------------------------------------- /static/admin/img/tooltag-arrowright.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tooltag-arrowright.gif -------------------------------------------------------------------------------- /static/admin/img/tooltag-arrowright_over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/admin/img/tooltag-arrowright_over.gif -------------------------------------------------------------------------------- /static/admin/js/LICENSE-JQUERY.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010 John Resig, http://jquery.com/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /static/admin/js/SelectBox.js: -------------------------------------------------------------------------------- 1 | var SelectBox = { 2 | cache: new Object(), 3 | init: function(id) { 4 | var box = document.getElementById(id); 5 | var node; 6 | SelectBox.cache[id] = new Array(); 7 | var cache = SelectBox.cache[id]; 8 | for (var i = 0; (node = box.options[i]); i++) { 9 | cache.push({value: node.value, text: node.text, displayed: 1}); 10 | } 11 | }, 12 | redisplay: function(id) { 13 | // Repopulate HTML select box from cache 14 | var box = document.getElementById(id); 15 | box.options.length = 0; // clear all options 16 | for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) { 17 | var node = SelectBox.cache[id][i]; 18 | if (node.displayed) { 19 | box.options[box.options.length] = new Option(node.text, node.value, false, false); 20 | } 21 | } 22 | }, 23 | filter: function(id, text) { 24 | // Redisplay the HTML select box, displaying only the choices containing ALL 25 | // the words in text. (It's an AND search.) 26 | var tokens = text.toLowerCase().split(/\s+/); 27 | var node, token; 28 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 29 | node.displayed = 1; 30 | for (var j = 0; (token = tokens[j]); j++) { 31 | if (node.text.toLowerCase().indexOf(token) == -1) { 32 | node.displayed = 0; 33 | } 34 | } 35 | } 36 | SelectBox.redisplay(id); 37 | }, 38 | delete_from_cache: function(id, value) { 39 | var node, delete_index = null; 40 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 41 | if (node.value == value) { 42 | delete_index = i; 43 | break; 44 | } 45 | } 46 | var j = SelectBox.cache[id].length - 1; 47 | for (var i = delete_index; i < j; i++) { 48 | SelectBox.cache[id][i] = SelectBox.cache[id][i+1]; 49 | } 50 | SelectBox.cache[id].length--; 51 | }, 52 | add_to_cache: function(id, option) { 53 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); 54 | }, 55 | cache_contains: function(id, value) { 56 | // Check if an item is contained in the cache 57 | var node; 58 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 59 | if (node.value == value) { 60 | return true; 61 | } 62 | } 63 | return false; 64 | }, 65 | move: function(from, to) { 66 | var from_box = document.getElementById(from); 67 | var to_box = document.getElementById(to); 68 | var option; 69 | for (var i = 0; (option = from_box.options[i]); i++) { 70 | if (option.selected && SelectBox.cache_contains(from, option.value)) { 71 | SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); 72 | SelectBox.delete_from_cache(from, option.value); 73 | } 74 | } 75 | SelectBox.redisplay(from); 76 | SelectBox.redisplay(to); 77 | }, 78 | move_all: function(from, to) { 79 | var from_box = document.getElementById(from); 80 | var to_box = document.getElementById(to); 81 | var option; 82 | for (var i = 0; (option = from_box.options[i]); i++) { 83 | if (SelectBox.cache_contains(from, option.value)) { 84 | SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); 85 | SelectBox.delete_from_cache(from, option.value); 86 | } 87 | } 88 | SelectBox.redisplay(from); 89 | SelectBox.redisplay(to); 90 | }, 91 | sort: function(id) { 92 | SelectBox.cache[id].sort( function(a, b) { 93 | a = a.text.toLowerCase(); 94 | b = b.text.toLowerCase(); 95 | try { 96 | if (a > b) return 1; 97 | if (a < b) return -1; 98 | } 99 | catch (e) { 100 | // silently fail on IE 'unknown' exception 101 | } 102 | return 0; 103 | } ); 104 | }, 105 | select_all: function(id) { 106 | var box = document.getElementById(id); 107 | for (var i = 0; i < box.options.length; i++) { 108 | box.options[i].selected = 'selected'; 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /static/admin/js/actions.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a.fn.actions=function(n){var b=a.extend({},a.fn.actions.defaults,n),e=a(this),g=false,k=function(c){c?i():j();a(e).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},f=function(){var c=a(e).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},true));a(b.allToggle).prop("checked",function(){if(c==e.length){value=true;i()}else{value=false;l()}return value})},i= 2 | function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},j=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},l=function(){j();a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)};a(b.counterContainer).show(); 3 | a(this).filter(":checked").each(function(){a(this).parent().parent().toggleClass(b.selectedClass);f();a(b.acrossInput).val()==1&&m()});a(b.allToggle).show().click(function(){k(a(this).prop("checked"));f()});a("div.actions span.question a").click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("div.actions span.clear a").click(function(c){c.preventDefault();a(b.allToggle).prop("checked",false);l();k(0);f()});lastChecked=null;a(e).click(function(c){if(!c)c=window.event;var d=c.target? 4 | c.target:c.srcElement;if(lastChecked&&a.data(lastChecked)!=a.data(d)&&c.shiftKey===true){var h=false;a(lastChecked).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(e).each(function(){if(a.data(this)==a.data(lastChecked)||a.data(this)==a.data(d))h=h?false:true;h&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);lastChecked=d;f()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){g= 5 | true});a('form#changelist-form button[name="index"]').click(function(){if(g)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});a('form#changelist-form input[name="_save"]').click(function(){var c=false;a("div.actions select option:selected").each(function(){if(a(this).val())c=true});if(c)return g?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")): 6 | confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery); 7 | -------------------------------------------------------------------------------- /static/admin/js/admin/RelatedObjectLookups.js: -------------------------------------------------------------------------------- 1 | // Handles related-objects functionality: lookup link for raw_id_fields 2 | // and Add Another links. 3 | 4 | function html_unescape(text) { 5 | // Unescape a string that was escaped using django.utils.html.escape. 6 | text = text.replace(/</g, '<'); 7 | text = text.replace(/>/g, '>'); 8 | text = text.replace(/"/g, '"'); 9 | text = text.replace(/'/g, "'"); 10 | text = text.replace(/&/g, '&'); 11 | return text; 12 | } 13 | 14 | // IE doesn't accept periods or dashes in the window name, but the element IDs 15 | // we use to generate popup window names may contain them, therefore we map them 16 | // to allowed characters in a reversible way so that we can locate the correct 17 | // element when the popup window is dismissed. 18 | function id_to_windowname(text) { 19 | text = text.replace(/\./g, '__dot__'); 20 | text = text.replace(/\-/g, '__dash__'); 21 | return text; 22 | } 23 | 24 | function windowname_to_id(text) { 25 | text = text.replace(/__dot__/g, '.'); 26 | text = text.replace(/__dash__/g, '-'); 27 | return text; 28 | } 29 | 30 | function showRelatedObjectLookupPopup(triggeringLink) { 31 | var name = triggeringLink.id.replace(/^lookup_/, ''); 32 | name = id_to_windowname(name); 33 | var href; 34 | if (triggeringLink.href.search(/\?/) >= 0) { 35 | href = triggeringLink.href + '&_popup=1'; 36 | } else { 37 | href = triggeringLink.href + '?_popup=1'; 38 | } 39 | var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 40 | win.focus(); 41 | return false; 42 | } 43 | 44 | function dismissRelatedLookupPopup(win, chosenId) { 45 | var name = windowname_to_id(win.name); 46 | var elem = document.getElementById(name); 47 | if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 48 | elem.value += ',' + chosenId; 49 | } else { 50 | document.getElementById(name).value = chosenId; 51 | } 52 | win.close(); 53 | } 54 | 55 | function showAddAnotherPopup(triggeringLink) { 56 | var name = triggeringLink.id.replace(/^add_/, ''); 57 | name = id_to_windowname(name); 58 | href = triggeringLink.href 59 | if (href.indexOf('?') == -1) { 60 | href += '?_popup=1'; 61 | } else { 62 | href += '&_popup=1'; 63 | } 64 | var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 65 | win.focus(); 66 | return false; 67 | } 68 | 69 | function dismissAddAnotherPopup(win, newId, newRepr) { 70 | // newId and newRepr are expected to have previously been escaped by 71 | // django.utils.html.escape. 72 | newId = html_unescape(newId); 73 | newRepr = html_unescape(newRepr); 74 | var name = windowname_to_id(win.name); 75 | var elem = document.getElementById(name); 76 | if (elem) { 77 | var elemName = elem.nodeName.toUpperCase(); 78 | if (elemName == 'SELECT') { 79 | var o = new Option(newRepr, newId); 80 | elem.options[elem.options.length] = o; 81 | o.selected = true; 82 | } else if (elemName == 'INPUT') { 83 | if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 84 | elem.value += ',' + newId; 85 | } else { 86 | elem.value = newId; 87 | } 88 | } 89 | } else { 90 | var toId = name + "_to"; 91 | elem = document.getElementById(toId); 92 | var o = new Option(newRepr, newId); 93 | SelectBox.add_to_cache(toId, o); 94 | SelectBox.redisplay(toId); 95 | } 96 | win.close(); 97 | } 98 | -------------------------------------------------------------------------------- /static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $(document).ready(function() { 3 | // Add anchor tag for Show/Hide link 4 | $("fieldset.collapse").each(function(i, elem) { 5 | // Don't hide if fields in this fieldset have errors 6 | if ($(elem).find("div.errors").length == 0) { 7 | $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + 9 | ')'); 10 | } 11 | }); 12 | // Add toggle to anchor tag 13 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 14 | if ($(this).closest("fieldset").hasClass("collapsed")) { 15 | // Show 16 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 17 | } else { 18 | // Hide 19 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 20 | } 21 | return false; 22 | }); 23 | }); 24 | })(django.jQuery); 25 | -------------------------------------------------------------------------------- /static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a(document).ready(function(){a("fieldset.collapse").each(function(c,b){0==a(b).find("div.errors").length&&a(b).addClass("collapsed").find("h2").first().append(' ('+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 2 | [a(this).attr("id")]);return!1})})})(django.jQuery); 3 | -------------------------------------------------------------------------------- /static/admin/js/inlines.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.fn.formset=function(d){var a=b.extend({},b.fn.formset.defaults,d),c=b(this),d=c.parent(),i=function(a,e,g){var d=RegExp("("+e+"-(\\d+|__prefix__))"),e=e+"-"+g;b(a).prop("for")&&b(a).prop("for",b(a).prop("for").replace(d,e));a.id&&(a.id=a.id.replace(d,e));a.name&&(a.name=a.name.replace(d,e))},f=b("#id_"+a.prefix+"-TOTAL_FORMS").prop("autocomplete","off"),g=parseInt(f.val(),10),e=b("#id_"+a.prefix+"-MAX_NUM_FORMS").prop("autocomplete","off"),f=""===e.val()||0'+a.addText+""),h=d.find("tr:last a")):(c.filter(":last").after('
'+a.addText+"
"),h=c.filter(":last").next().find("a"));h.click(function(d){d.preventDefault();var f=b("#id_"+a.prefix+"-TOTAL_FORMS"),d=b("#"+a.prefix+ 3 | "-empty"),c=d.clone(true);c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+g);c.is("tr")?c.children(":last").append('
'+a.deleteText+"
"):c.is("ul")||c.is("ol")?c.append('
  • '+a.deleteText+"
  • "):c.children(":first").append(''+a.deleteText+"");c.find("*").each(function(){i(this, 4 | a.prefix,f.val())});c.insertBefore(b(d));b(f).val(parseInt(f.val(),10)+1);g=g+1;e.val()!==""&&e.val()-f.val()<=0&&h.parent().hide();c.find("a."+a.deleteCssClass).click(function(d){d.preventDefault();d=b(this).parents("."+a.formCssClass);d.remove();g=g-1;a.removed&&a.removed(d);d=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(d.length);(e.val()===""||e.val()-d.length>0)&&h.parent().show();for(var c=0,f=d.length;c 0) { 25 | values.push($(field).val()); 26 | } 27 | }) 28 | field.val(URLify(values.join(' '), maxLength)); 29 | }; 30 | 31 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 32 | }); 33 | }; 34 | })(django.jQuery); 35 | -------------------------------------------------------------------------------- /static/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a.fn.prepopulate=function(d,g){return this.each(function(){var b=a(this);b.data("_changed",false);b.change(function(){b.data("_changed",true)});var c=function(){if(b.data("_changed")!=true){var e=[];a.each(d,function(h,f){a(f).val().length>0&&e.push(a(f).val())});b.val(URLify(e.join(" "),g))}};a(d.join(",")).keyup(c).change(c).focus(c)})}})(django.jQuery); 2 | -------------------------------------------------------------------------------- /static/admin/js/timeparse.js: -------------------------------------------------------------------------------- 1 | var timeParsePatterns = [ 2 | // 9 3 | { re: /^\d{1,2}$/i, 4 | handler: function(bits) { 5 | if (bits[0].length == 1) { 6 | return '0' + bits[0] + ':00'; 7 | } else { 8 | return bits[0] + ':00'; 9 | } 10 | } 11 | }, 12 | // 13:00 13 | { re: /^\d{2}[:.]\d{2}$/i, 14 | handler: function(bits) { 15 | return bits[0].replace('.', ':'); 16 | } 17 | }, 18 | // 9:00 19 | { re: /^\d[:.]\d{2}$/i, 20 | handler: function(bits) { 21 | return '0' + bits[0].replace('.', ':'); 22 | } 23 | }, 24 | // 3 am / 3 a.m. / 3am 25 | { re: /^(\d+)\s*([ap])(?:.?m.?)?$/i, 26 | handler: function(bits) { 27 | var hour = parseInt(bits[1]); 28 | if (hour == 12) { 29 | hour = 0; 30 | } 31 | if (bits[2].toLowerCase() == 'p') { 32 | if (hour == 12) { 33 | hour = 0; 34 | } 35 | return (hour + 12) + ':00'; 36 | } else { 37 | if (hour < 10) { 38 | return '0' + hour + ':00'; 39 | } else { 40 | return hour + ':00'; 41 | } 42 | } 43 | } 44 | }, 45 | // 3.30 am / 3:15 a.m. / 3.00am 46 | { re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i, 47 | handler: function(bits) { 48 | var hour = parseInt(bits[1]); 49 | var mins = parseInt(bits[2]); 50 | if (mins < 10) { 51 | mins = '0' + mins; 52 | } 53 | if (hour == 12) { 54 | hour = 0; 55 | } 56 | if (bits[3].toLowerCase() == 'p') { 57 | if (hour == 12) { 58 | hour = 0; 59 | } 60 | return (hour + 12) + ':' + mins; 61 | } else { 62 | if (hour < 10) { 63 | return '0' + hour + ':' + mins; 64 | } else { 65 | return hour + ':' + mins; 66 | } 67 | } 68 | } 69 | }, 70 | // noon 71 | { re: /^no/i, 72 | handler: function(bits) { 73 | return '12:00'; 74 | } 75 | }, 76 | // midnight 77 | { re: /^mid/i, 78 | handler: function(bits) { 79 | return '00:00'; 80 | } 81 | } 82 | ]; 83 | 84 | function parseTimeString(s) { 85 | for (var i = 0; i < timeParsePatterns.length; i++) { 86 | var re = timeParsePatterns[i].re; 87 | var handler = timeParsePatterns[i].handler; 88 | var bits = re.exec(s); 89 | if (bits) { 90 | return handler(bits); 91 | } 92 | } 93 | return s; 94 | } 95 | -------------------------------------------------------------------------------- /static/css/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/css/blue.png -------------------------------------------------------------------------------- /static/css/blue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/css/blue@2x.png -------------------------------------------------------------------------------- /static/css/icheck_blue.css: -------------------------------------------------------------------------------- 1 | /* iCheck plugin Square skin, blue 2 | ----------------------------------- */ 3 | .icheckbox_square-blue, 4 | .iradio_square-blue { 5 | display: inline-block; 6 | *display: inline; 7 | vertical-align: middle; 8 | margin: 0; 9 | padding: 0; 10 | width: 22px; 11 | height: 22px; 12 | background: url(blue.png) no-repeat; 13 | border: none; 14 | cursor: pointer; 15 | } 16 | 17 | .icheckbox_square-blue { 18 | background-position: 0 0; 19 | } 20 | .icheckbox_square-blue.hover { 21 | background-position: -24px 0; 22 | } 23 | .icheckbox_square-blue.checked { 24 | background-position: -48px 0; 25 | } 26 | .icheckbox_square-blue.disabled { 27 | background-position: -72px 0; 28 | cursor: default; 29 | } 30 | .icheckbox_square-blue.checked.disabled { 31 | background-position: -96px 0; 32 | } 33 | 34 | .iradio_square-blue { 35 | background-position: -120px 0; 36 | } 37 | .iradio_square-blue.hover { 38 | background-position: -144px 0; 39 | } 40 | .iradio_square-blue.checked { 41 | background-position: -168px 0; 42 | } 43 | .iradio_square-blue.disabled { 44 | background-position: -192px 0; 45 | cursor: default; 46 | } 47 | .iradio_square-blue.checked.disabled { 48 | background-position: -216px 0; 49 | } 50 | 51 | /* HiDPI support */ 52 | @media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { 53 | .icheckbox_square-blue, 54 | .iradio_square-blue { 55 | background-image: url(blue@2x.png); 56 | -webkit-background-size: 240px 24px; 57 | background-size: 240px 24px; 58 | } 59 | } -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/js/bootstrap-datetimepicker.zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Simplified Chinese translation for bootstrap-datetimepicker 3 | * Yuan Cheung 4 | */ 5 | ;(function($){ 6 | $.fn.datetimepicker.dates['zh-CN'] = { 7 | days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], 8 | daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], 9 | daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], 10 | months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 11 | monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 12 | today: "今天", 13 | suffix: [], 14 | meridiem: ["上午", "下午"] 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/js/common.js: -------------------------------------------------------------------------------- 1 | function get_cookie(cookie_name) { 2 | var name = cookie_name + "="; 3 | var ca = document.cookie.split(';'); 4 | for (var i = 0; i < ca.length; i++) { 5 | var c = ca[i]; 6 | while (c.charAt(0) == ' ') c = c.substring(1); 7 | if (c.indexOf(name) != -1) return c.substring(name.length, c.length); 8 | } 9 | return ""; 10 | } 11 | 12 | function csrf_token() { 13 | return get_cookie("csrftoken") 14 | } 15 | 16 | function set_cookie(c_name, value) { 17 | expiredays = 1000; 18 | var exdate = new Date(); 19 | exdate.setDate(exdate.getDate() + expiredays) 20 | document.cookie = c_name + "=" + escape(value) + 21 | ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()) 22 | } 23 | 24 | function shake_cart() { 25 | $("#shopping_cart_icon").attr("class", "am-icon-shopping-cart am-animation-shake"); 26 | setTimeout(function () { 27 | $("#shopping_cart_icon").attr("class", "am-icon-shopping-cart"); 28 | }, 300); 29 | } 30 | 31 | //除法函数,用来得到精确的除法结果 32 | //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 33 | //调用:accDiv(arg1,arg2) 34 | //返回值:arg1除以arg2的精确结果 35 | function accDiv(arg1, arg2) { 36 | var t1 = 0, t2 = 0, r1, r2; 37 | try { 38 | t1 = arg1.toString().split(".")[1].length 39 | } catch (e) { 40 | } 41 | try { 42 | t2 = arg2.toString().split(".")[1].length 43 | } catch (e) { 44 | } 45 | with (Math) { 46 | r1 = Number(arg1.toString().replace(".", "")); 47 | r2 = Number(arg2.toString().replace(".", "")); 48 | return (r1 / r2) * pow(10, t2 - t1); 49 | } 50 | } 51 | 52 | //给Number类型增加一个div方法,调用起来更加方便。 53 | Number.prototype.div = function (arg) { 54 | return accDiv(this, arg); 55 | }; 56 | 57 | //乘法函数,用来得到精确的乘法结果 58 | //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 59 | //调用:accMul(arg1,arg2) 60 | //返回值:arg1乘以arg2的精确结果 61 | function accMul(arg1, arg2) { 62 | var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); 63 | try { 64 | m += s1.split(".")[1].length 65 | } catch (e) { 66 | } 67 | try { 68 | m += s2.split(".")[1].length 69 | } catch (e) { 70 | } 71 | return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); 72 | } 73 | 74 | //给Number类型增加一个mul方法,调用起来更加方便。 75 | Number.prototype.mul = function (arg) { 76 | return accMul(arg, this); 77 | }; 78 | 79 | //加法函数,用来得到精确的加法结果 80 | //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 81 | //调用:accAdd(arg1,arg2) 82 | //返回值:arg1加上arg2的精确结果 83 | function accAdd(arg1, arg2) { 84 | var r1, r2, m; 85 | try { 86 | r1 = arg1.toString().split(".")[1].length 87 | } catch (e) { 88 | r1 = 0 89 | } 90 | try { 91 | r2 = arg2.toString().split(".")[1].length 92 | } catch (e) { 93 | r2 = 0 94 | } 95 | m = Math.pow(10, Math.max(r1, r2)); 96 | return (arg1 * m + arg2 * m) / m; 97 | } 98 | //给Number类型增加一个add方法,调用起来更加方便。 99 | Number.prototype.add = function (arg) { 100 | return accAdd(arg, this); 101 | }; 102 | 103 | //减法函数 104 | function accSub(arg1, arg2) { 105 | var r1, r2, m, n; 106 | try { 107 | r1 = arg1.toString().split(".")[1].length 108 | } catch (e) { 109 | r1 = 0 110 | } 111 | try { 112 | r2 = arg2.toString().split(".")[1].length 113 | } catch (e) { 114 | r2 = 0 115 | } 116 | m = Math.pow(10, Math.max(r1, r2)); 117 | //last modify by deeka 118 | //动态控制精度长度 119 | n = (r1 >= r2) ? r1 : r2; 120 | return ((arg2 * m - arg1 * m) / m).toFixed(n); 121 | } 122 | 123 | ///给number类增加一个sub方法,调用起来更加方便 124 | Number.prototype.sub = function (arg) { 125 | return accSub(arg, this); 126 | }; 127 | 128 | 129 | function getUrlParam(name) { 130 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 131 | var r = window.location.search.substr(1).match(reg); //匹配目标参数 132 | if (r != null) return unescape(r[2]); 133 | return null; //返回参数值 134 | } -------------------------------------------------------------------------------- /static/xadmin/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xadmin", 3 | "version": "0.1.0", 4 | "dependencies": { 5 | "jquery": ">=1.8.3", 6 | "jquery-ui": ">=1.10.0", 7 | "bootstrap": "http://twitter.github.io/bootstrap/assets/bootstrap.zip", 8 | "bootstrap-timepicker": ">=0.2.3", 9 | "bootstrap-datepicker": ">=1.0.0", 10 | "bootstrap-modal": ">=2.1", 11 | "flot": ">=0.8", 12 | "font-awesome": ">=3.0.2", 13 | "load-image": "blueimp/JavaScript-Load-Image", 14 | "bootstrap-image-gallery": "blueimp/Bootstrap-Image-Gallery", 15 | "select2": ">=3.3.2", 16 | "selectize": ">=0.8.4", 17 | "datejs": "datejs/Datejs", 18 | "bootstrap-multiselect": "davidstutz/bootstrap-multiselect" 19 | } 20 | } -------------------------------------------------------------------------------- /static/xadmin/css/themes/bootstrap-xadmin.css: -------------------------------------------------------------------------------- 1 | 2 | /* results table */ 3 | .table th { 4 | background-color: #FAFAFA; 5 | background-image: -moz-linear-gradient(top, white, #F2F2F2); 6 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), to(#F2F2F2)); 7 | background-image: -webkit-linear-gradient(top, white, #F2F2F2); 8 | background-image: -o-linear-gradient(top, white, #F2F2F2); 9 | background-image: linear-gradient(to bottom, white, #F2F2F2); 10 | background-repeat: repeat-x; 11 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); 12 | -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); 13 | -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); 14 | box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); 15 | border-bottom-width: 1px !important; 16 | } 17 | 18 | /** panel **/ 19 | .panel-default { 20 | border-radius: 2px; 21 | } 22 | .panel-default > .panel-heading { 23 | background-color: #F8F8F8; 24 | background-image: -moz-linear-gradient(top, #FDFDFD, #F6F6F6); 25 | background-image: -ms-linear-gradient(top, #FDFDFD, #F6F6F6); 26 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#FDFDFD), to(#F6F6F6)); 27 | background-image: -webkit-linear-gradient(top, #FDFDFD, #F6F6F6); 28 | background-image: -o-linear-gradient(top, #FDFDFD, #F6F6F6); 29 | background-image: linear-gradient(top, #FDFDFD, #F6F6F6); 30 | } 31 | 32 | .form-group { 33 | border-bottom: 1px solid #EEE; 34 | background-color: #FBFBFB; 35 | margin-top: 0px !important; 36 | margin-bottom: 0px !important; 37 | } 38 | .controls { 39 | background-color: white; 40 | padding: 15px !important; 41 | } 42 | .control-label { 43 | margin-bottom: 0px !important; 44 | } 45 | .fieldset .panel-body { 46 | padding-top: 0px !important; 47 | padding-bottom: 0px !important; 48 | } 49 | .form-inline .form-group { 50 | background: transparent; 51 | border: none; 52 | } 53 | 54 | /** fieldset **/ 55 | @media (min-width: 768px) { 56 | .form-horizontal .controls{ 57 | border-left: 1px solid #EEE; 58 | } 59 | .form-horizontal .control-label { 60 | padding-top: 22px !important; 61 | } 62 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.form.css: -------------------------------------------------------------------------------- 1 | 2 | /* CUSTOM FORM FIELDS */ 3 | select.selectmultiple { 4 | width: 100%; 5 | height: 120px; 6 | } 7 | .select2-container{ 8 | width: 100%; 9 | } 10 | .select2-container.form-control{ 11 | padding: 0px; 12 | border: 0px; 13 | } 14 | .select2-container .select2-choice { 15 | height: 35px; 16 | padding-top: 3px; 17 | } 18 | 19 | /* form css */ 20 | .form-container .column{ 21 | min-height: 60px; 22 | } 23 | .form-group { 24 | margin-right: -15px; 25 | margin-left: -15px; 26 | } 27 | .control-label { 28 | padding: 7px 10px; 29 | font-weight: bold; 30 | } 31 | .form-horizontal .control-label { 32 | margin-bottom: 5px; 33 | } 34 | .controls { 35 | padding: 0px 15px 0px 15px; 36 | } 37 | .controls:before, 38 | .controls:after { 39 | display: table; 40 | content: " "; 41 | } 42 | .controls:after { 43 | clear: both; 44 | } 45 | .control-wrap { 46 | display: block; 47 | width: 100%; 48 | padding-right: 45px; 49 | } 50 | .asteriskField, .asterisk-field { 51 | color: red; 52 | } 53 | .controls > .radio:first-child, 54 | .controls > .checkbox:first-child, 55 | .control-wrap > .radio:first-child, 56 | .control-wrap > .checkbox:first-child { 57 | margin-top: -7px; 58 | } 59 | .controls > span { 60 | padding: 5px 0; 61 | display: inline-block; 62 | } 63 | 64 | .help-block { 65 | margin-bottom: 0px; 66 | } 67 | 68 | .form-row .row { 69 | margin: 0px !important; 70 | } 71 | 72 | .fieldset .panel-body { 73 | padding-bottom: 0px; 74 | } 75 | 76 | @media (min-width: 768px) { 77 | 78 | .text-field, 79 | .textinput, 80 | .url-field, 81 | select, 82 | .input-group ~ .text-field, 83 | .input-group ~ .textinput, 84 | .input-group ~ .url-field 85 | { 86 | max-width: 300px; 87 | } 88 | .input-group.date{ max-width: 220px;} 89 | .input-group.time{ max-width: 180px;} 90 | .int-field { 91 | max-width: 100px; 92 | } 93 | .datetime > .input-group { 94 | float: left; 95 | margin-right: 5px; 96 | } 97 | .datetime > .input-group:last-child { 98 | margin-right: 0px; 99 | } 100 | select.selectmultiple { 101 | max-width: 350px; 102 | } 103 | .select2-container, .selectize-control{ 104 | max-width: 300px; 105 | } 106 | 107 | .form-actions.fixed{ 108 | position:fixed; 109 | _position:absolute; 110 | bottom:0px; 111 | z-index:295; 112 | margin-left: -10px; 113 | -webkit-box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); 114 | -moz-box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); 115 | box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); 116 | right: 10px; 117 | } 118 | 119 | .form-actions.fixed .pull-right{ 120 | float: none !important; 121 | margin-left: 10px; 122 | } 123 | 124 | .form-horizontal .control-label { 125 | width: 170px; 126 | float: left; 127 | } 128 | .form-horizontal .controls { 129 | margin-left: 175px; 130 | } 131 | .form-horizontal.short_label .control-label, 132 | .form-horizontal .short_label .control-label { 133 | width: 120px; 134 | } 135 | .form-horizontal.short_label .controls, 136 | .form-horizontal .short_label .controls { 137 | margin-left: 120px; 138 | } 139 | .form-horizontal .form-group { 140 | margin-bottom: 24px; 141 | } 142 | .form-horizontal .form-inline .form-group { 143 | margin: 0px; 144 | padding-left: 0px; 145 | padding-right: 0px; 146 | } 147 | .form-horizontal .fieldset .panel-body { 148 | padding-top: 24px; 149 | } 150 | } 151 | @media (min-width: 768px) and (max-width: 991px) { 152 | .form-horizontal .control-label { 153 | width: 150px; 154 | } 155 | .form-horizontal .controls { 156 | margin-left: 155px; 157 | } 158 | .form-horizontal.short_label .control-label, 159 | .form-horizontal .short_label .control-label { 160 | width: 100px; 161 | } 162 | .form-horizontal.short_label .controls, 163 | .form-horizontal .short_label .controls { 164 | margin-left: 100px; 165 | } 166 | } 167 | @media (max-width: 767px) { 168 | .btn-toolbar.top-toolbar { 169 | margin: 0 10px 10px; 170 | text-align: right; 171 | } 172 | } 173 | 174 | /** detail page **/ 175 | img.field_img { 176 | max-height: 100px; 177 | } 178 | 179 | /** revision form **/ 180 | .diff_field .control-label { 181 | color: #FF8040; 182 | } 183 | .diff_field .controls{ 184 | background-color: #FCF8E3; 185 | } 186 | 187 | /** tabs **/ 188 | .nav.nav-tabs { 189 | margin-bottom: 15px; 190 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.mobile.css: -------------------------------------------------------------------------------- 1 | #body-content { 2 | margin-top: 50px; 3 | padding-top: 10px; 4 | } 5 | #top-nav, #footer, .breadcrumb { 6 | display: none; 7 | } 8 | 9 | #top-nav .breadcrumb { 10 | margin-top: 20px; 11 | } 12 | #left-side { 13 | min-height: 0px; 14 | position: fixed; 15 | padding: 0px; 16 | top: 50px; 17 | left: 0px; 18 | right: 0px; 19 | bottom: 0px; 20 | background: #FFF; 21 | z-index: 999; 22 | overflow: auto; 23 | } 24 | #left-side .well { 25 | border: 0px; 26 | } 27 | #changelist-form { 28 | clear: both; 29 | } 30 | .navbar-brand { 31 | max-width: 300px; 32 | } 33 | 34 | .panel-content.nopadding { 35 | margin: -15px; 36 | } 37 | 38 | .panel-content.nopadding .table { 39 | margin-bottom: 0; 40 | } 41 | 42 | .col { 43 | padding-right: 10px; 44 | padding-left: 10px; 45 | } 46 | .row { 47 | margin-right: -10px; 48 | margin-left: -10px; 49 | } 50 | 51 | .results { 52 | width: 100%; 53 | overflow-x: auto; 54 | } 55 | 56 | .form-actions { 57 | margin-bottom: 0px; 58 | padding: 10px; 59 | position:fixed; 60 | bottom:0px; 61 | z-index:295; 62 | width: 100%; 63 | margin-right: -10px; 64 | margin-left: -10px; 65 | } 66 | .form-actions .more-btns input:first-child{ 67 | margin-top: 10px; 68 | } 69 | .change-form #body-content { 70 | padding-bottom: 60px; 71 | } 72 | .model_ul { 73 | margin-left: 0px; 74 | margin-right: 0px; 75 | } 76 | 77 | .navbar-inverse .navbar-toggle{ 78 | color: white; 79 | top: 7px; 80 | padding: 7px 12px; 81 | } 82 | .navbar.tools-navbar { 83 | height: 50px; 84 | margin-top: -10px; 85 | text-align: right; 86 | } 87 | .navbar-btns .btn span{ 88 | display: none; 89 | } 90 | .navbar-btns { 91 | position: absolute; 92 | top: 1px; 93 | right: 10px; 94 | } 95 | .nav-back { 96 | left: 10px; 97 | right: auto; 98 | } 99 | 100 | .layout-btns { 101 | display: none; 102 | } 103 | .pagination.pagination-small{ 104 | display: none; 105 | } 106 | 107 | -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.page.dashboard.css: -------------------------------------------------------------------------------- 1 | 2 | .dashboard.container-fluid { 3 | padding-left: 0px; 4 | } 5 | .dashboard .column{ 6 | min-height: 60px; 7 | } 8 | 9 | .widget { 10 | position: relative; 11 | } 12 | .widget_options { 13 | overflow: visible; 14 | position: absolute; 15 | } 16 | 17 | /* Quick Buttons 18 | =================================================================== */ 19 | .qbutton .panel-body { 20 | padding-top: 5px; 21 | } 22 | .btn-quick { 23 | margin-top: 10px; 24 | padding: 20px 0px 0px 0px; 25 | font-size: 15px; 26 | display:block; 27 | text-align: center; 28 | cursor: pointer; 29 | position: relative; 30 | } 31 | .btn-quick i { 32 | font-size: 32px; 33 | } 34 | 35 | /* Quick Buttons Small 36 | =================================================================== */ 37 | 38 | .btn-quick-small { 39 | border-radius: 3px; 40 | padding: 15px 0px 0px 0px; 41 | font-size: 10px; 42 | display:block; 43 | text-align: center; 44 | cursor: pointer; 45 | position: relative; 46 | } 47 | 48 | .btn-quick-small i { 49 | font-size: 20px; 50 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.plugin.aggregation.css: -------------------------------------------------------------------------------- 1 | td.aggregate { 2 | font-weight: bold; 3 | } 4 | td.aggregate span.aggregate_title { 5 | float: right; 6 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.plugin.formset.css: -------------------------------------------------------------------------------- 1 | 2 | .empty-form { 3 | display: none; 4 | } 5 | .formset:not(.one) > .panel-body { 6 | padding-top: 0px !important; 7 | } 8 | .formset .row-deleted{ 9 | background: #fff0f0 !important; 10 | } 11 | .formset .row-added { 12 | background: #d1ffdd !important; 13 | } 14 | .formset .formset-heading{ 15 | padding: 10px; 16 | border-bottom: 1px solid #EEE; 17 | } 18 | .formset .row-deleted .formset-form { 19 | display: none; 20 | } 21 | .formset .box-content.accordion { 22 | margin: 0px; 23 | padding: 5px 5px 3px; 24 | } 25 | .formset .formset-form { 26 | padding-left: 15px; 27 | padding-right: 15px; 28 | } 29 | .formset .accordion-heading .delete-row { 30 | float: right; 31 | margin: 8px; 32 | } 33 | .formset .nav{ 34 | margin-bottom: 5px; 35 | } 36 | .formset .nav.nav-tabs{ 37 | padding: 10px 10px 0px; 38 | } 39 | .formset .panel-body.tabs { 40 | padding-left: 0px; 41 | padding-right: 0px; 42 | } 43 | .formset .box-content.tabs{ 44 | padding: 5px 0px 0px; 45 | } 46 | .formset .tabs .tab-content{ 47 | overflow: hidden; 48 | } 49 | .formset .tabs .delete-row{ 50 | float: right; 51 | margin: 8px 8px; 52 | } 53 | .formset .table{ 54 | margin-bottom: 0px; 55 | } 56 | .formset .table td{ 57 | padding: 4px; 58 | } 59 | 60 | .formset .table td .delete-row{ 61 | margin-top: 4px; 62 | display: block; 63 | } 64 | -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.plugin.quickfilter.css: -------------------------------------------------------------------------------- 1 | .nav-quickfilter .filter-item { 2 | white-space: nowrap; 3 | overflow: hidden; 4 | padding: 5px; 5 | } 6 | 7 | .nav-quickfilter .filter-col-1 { 8 | margin: 3px 2px 0 -2px; 9 | float: left; 10 | } 11 | 12 | .nav-quickfilter .filter-col-2 { 13 | } 14 | 15 | .nav-quickfilter .nav-expand { 16 | z-index:100; 17 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.plugins.css: -------------------------------------------------------------------------------- 1 | /** Action **/ 2 | .action-checkbox-column { 3 | width: 14px; 4 | } 5 | 6 | /** quick-form **/ 7 | .quick-form .modal-body { 8 | padding-bottom: 0px; 9 | } 10 | .quick-form .modal-footer { 11 | margin-top: 0px; 12 | } -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.widget.editable.css: -------------------------------------------------------------------------------- 1 | .editable-handler .popover{ 2 | width: auto; 3 | } 4 | .editable .popover-title{ 5 | white-space:nowrap; 6 | } 7 | .editable .popover-title .close { 8 | margin: -4px 0px 0px 10px; 9 | } 10 | .editable form .btn-ajax{ 11 | display: none; 12 | } 13 | .editable form .control-wrap{ 14 | padding-right: 0px; 15 | } 16 | .editable form{ 17 | margin-bottom: 0px; 18 | } 19 | .editable form .controls{ 20 | margin: 0px; 21 | padding: 0px !important; 22 | border: 0px; 23 | } 24 | .editable form .form-group { 25 | margin: 0px 0px 10px !important; 26 | } 27 | .editable form .control-label{ 28 | display: none; 29 | } 30 | .editable form .controls label { 31 | white-space:nowrap; 32 | } 33 | 34 | @media (min-width: 768px) { 35 | .editable form .text-field, 36 | .editable form .textinput { 37 | width: 200px; 38 | } 39 | .editable form .int-field { 40 | width: 150px; 41 | } 42 | .editable form .textarea-field{ 43 | width: 250px; 44 | height: 50px; 45 | } 46 | 47 | .editable form select, 48 | .editable form .select2-container { 49 | max-width: 200px; 50 | min-width: 100px; 51 | width: 100%; 52 | } 53 | } 54 | @media (max-width: 767px) { 55 | .popover.editpop{ 56 | position: fixed; 57 | top: 30px !important; 58 | left: 10px !important; 59 | right: 10px !important; 60 | z-index: 1040; 61 | max-width: none; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /static/xadmin/css/xadmin.widget.select-transfer.css: -------------------------------------------------------------------------------- 1 | 2 | .selector { 3 | position: relative; 4 | float: left; 5 | overflow: hidden; 6 | width: 100%; 7 | } 8 | .selector-available, .selector-chosen { 9 | float: left; 10 | width: 45%; 11 | } 12 | .selector.stacked .selector-available, .selector.stacked .selector-chosen { 13 | width: 756px; 14 | } 15 | .selector p.title { 16 | padding: 7px 5px 0px 7px; 17 | font-size: 14px; 18 | line-height: 13px; 19 | font-weight: bold; 20 | } 21 | 22 | .selector .selector-filter { 23 | width: 100%; 24 | } 25 | .selector .selector-available .selector-filter { 26 | } 27 | .selector .selector-chosen .selector-filter { 28 | } 29 | .selector.stacked .selector-filter input[type=text] { 30 | width: 716px !important; 31 | max-width: 716px !important; 32 | } 33 | .selector select[multiple=multiple] { 34 | margin: 0; 35 | padding-left: 3px; 36 | width: 100%; 37 | height: 200px; 38 | display: block; 39 | max-width: none !important; 40 | } 41 | .selector .selector-chosen select[multiple=multiple] { 42 | height: 230px; 43 | } 44 | .selector.stacked select[multiple=multiple] { 45 | width: 757px !important; 46 | max-width: 757px !important; 47 | } 48 | .selector ul.selector-chooser { 49 | float: left; 50 | margin: 100px 2px 0; 51 | padding: 0; 52 | width: 31px; 53 | list-style: none; 54 | } 55 | .selector ul.selector-chooser li { 56 | margin-top: 10px; 57 | } 58 | .selector.stacked ul.selector-chooser { 59 | margin: 4px 0 0 356px; 60 | width: 36px; 61 | } 62 | .selector.stacked ul.selector-chooser li { 63 | float: left; 64 | } 65 | a.selector-chooseall, a.selector-clearall { 66 | display: block; 67 | margin: 0; 68 | padding: 2px 7px; 69 | font-size: 11px; 70 | line-height: 20px; 71 | font-weight: bold; 72 | } 73 | .selector-available, .selector-chosen { 74 | border: 1px solid #ddd; 75 | border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; 76 | background: #eee; 77 | } 78 | .selector h3, .inline-group .selector h3, 79 | .inline-related fieldset .selector-available h3, .inline-related fieldset .selector-chosen h3 { 80 | border: 0; 81 | border-bottom: 1px solid #d0d0d0; 82 | background: transparent; 83 | } 84 | .selector select[multiple=multiple] { 85 | border-left: 0; 86 | border-top: 1px solid #d0d0d0; 87 | border-bottom: 1px solid #d0d0d0; 88 | border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0; 89 | } 90 | 91 | a.selector-chooseall, a.selector-clearall { 92 | border-top: 1px solid #e4e4e4; 93 | } 94 | 95 | .selector h3 + select { 96 | border-top: 0; 97 | } 98 | 99 | a.selector-chooseall, a.selector-clearall { 100 | border-top: 1px solid #e4e4e4; 101 | } 102 | -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.main.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | 3 | $.fn.exform = function(){ 4 | this.each(function () { 5 | var form = $(this); 6 | for (var i = $.fn.exform.renders.length - 1; i >= 0; i--) { 7 | $.fn.exform.renders[i](form) 8 | }; 9 | form.addClass('rended'); 10 | }) 11 | } 12 | $.fn.exform.renders = []; 13 | $(function() { 14 | $('.exform:not(.rended)').exform(); 15 | }); 16 | 17 | $.getCookie = function(name) { 18 | var cookieValue = null; 19 | if (document.cookie && document.cookie != '') { 20 | var cookies = document.cookie.split(';'); 21 | for (var i = 0; i < cookies.length; i++) { 22 | var cookie = jQuery.trim(cookies[i]); 23 | // Does this cookie string begin with the name we want? 24 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 25 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 26 | break; 27 | } 28 | } 29 | } 30 | return cookieValue; 31 | } 32 | 33 | //dropdown submenu plugin 34 | $(document) 35 | .on('click.xa.dropdown.data-api touchstart.xa.dropdown.data-api', '.dropdown-submenu', function (e) { e.stopPropagation(); }) 36 | .on('click.xa.dropdown.data-api', function(e){ 37 | $('.dropdown-submenu.open').removeClass('open'); 38 | }); 39 | 40 | if ('ontouchstart' in document.documentElement) { 41 | $('.dropdown-submenu a').on('click.xa.dropdown.data-api', function(e){ 42 | $(this).parent().toggleClass('open'); 43 | }); 44 | } else{ 45 | $('.dropdown-submenu').on('click.xa.dropdown.data-api mouseover.xa.dropdown.data-api', function(e){ 46 | $(this).parent().find('>.dropdown-submenu.open').removeClass('open'); 47 | $(this).addClass('open'); 48 | }); 49 | } 50 | 51 | //toggle class button 52 | $('body').on('click.xa.togglebtn.data-api', '[data-toggle=class]', function (e) { 53 | var $this = $(this), href 54 | var target = $this.attr('data-target') 55 | || e.preventDefault() 56 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 57 | var className = $this.attr('data-class-name') 58 | $(target).toggleClass(className) 59 | }) 60 | 61 | // loading btn 62 | // $('.btn.btn-loading,.btn[type=submit]') 63 | // .click(function () { 64 | // var btn = $(this) 65 | // btn.button('loading') 66 | // }) 67 | 68 | //.nav-content bar nav-menu 69 | $('.navbar-xs .navbar-nav > li') 70 | .on('shown.bs.dropdown', function(e){ 71 | $(this).find('>.dropdown-menu').css('max-height', $(window).height()-120); 72 | $(this).parent().find('>li').addClass('hidden-xs'); 73 | $(this).removeClass('hidden-xs'); 74 | }) 75 | .on('hidden.bs.dropdown', function(e){ 76 | $(this).parent().find('>li').removeClass('hidden-xs'); 77 | }); 78 | 79 | // dashboard widget 80 | $('.widget-form').each(function(e){ 81 | var el = $(this); 82 | el.find('.btn-remove').click(function(){ 83 | el.find('input[name=_delete]').val('on'); 84 | return true; 85 | }); 86 | }); 87 | 88 | // g-search 89 | $('#g-search .dropdown-menu a').click(function(){ 90 | $('#g-search').attr('action', $(this).data('action')).submit(); 91 | }) 92 | 93 | // save settings 94 | $.save_user_settings = function(key, value, success, error){ 95 | var csrftoken = $.getCookie('csrftoken'); 96 | $.ajax({ 97 | type: 'POST', 98 | url: window.__admin_path_prefix__ + 'settings/user', 99 | data: {'key': key, 'value': value}, 100 | success: success, 101 | error: error, 102 | beforeSend: function(xhr, settings) { 103 | xhr.setRequestHeader("X-CSRFToken", csrftoken); 104 | } 105 | }); 106 | } 107 | 108 | })(jQuery) -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.page.dashboard.js: -------------------------------------------------------------------------------- 1 | jQuery(function() { 2 | $( ".btn-quick-form" ).click(function(){ 3 | var btn = $(this), 4 | form_url; 5 | if(btn.is('a')){ 6 | form_url = btn.attr('href'); 7 | } 8 | if(form_url == undefined){ 9 | form_url = btn.data('form-url'); 10 | } 11 | if(!btn.data('form-modal')){ 12 | var modal = $(''); 16 | $('body').append(modal); 17 | btn.data('form-modal', modal); 18 | modal.find('.modal-body').load(form_url, function(form_html, status, xhr){ 19 | var form = $(this).find('form'); 20 | form.exform(); 21 | modal.find('.btn-submit').click(function(){ 22 | var csrftoken = $.getCookie('csrftoken'); 23 | //clean form errors 24 | form.find('.text-error,.help-inline.error').remove(); 25 | form.find('.control-group').removeClass('error'); 26 | $.ajax({ 27 | type: 'POST', 28 | url: form.attr('action'), 29 | data: form.serialize(), 30 | success: function(data){ 31 | if(data['result'] != 'success' && data['errors']){ 32 | var non_fields_errors = []; 33 | for (var i = data['errors'].length - 1; i >= 0; i--) { 34 | var e = data['errors'][i]; 35 | var errdiv = form.find('#div_' + e['id']); 36 | if(errdiv.length){ 37 | errdiv.addClass('error'); 38 | var err_html = []; 39 | for (var i = e['errors'].length - 1; i >= 0; i--) { 40 | err_html.push(''+e['errors'][i]+''); 41 | }; 42 | errdiv.find('.controls').append(err_html.join('\n')); 43 | } else { 44 | non_fields_errors = non_fields_errors.concat(e['errors']); 45 | } 46 | }; 47 | if(non_fields_errors.length){ 48 | var err_html = []; 49 | for (var i = non_fields_errors.length - 1; i >= 0; i--) { 50 | err_html.push('

    '+e['errors'][i]+'

    '); 51 | }; 52 | form.prepend(err_html.join('\n')); 53 | } 54 | } else { 55 | btn.trigger('post-success'); 56 | } 57 | }, 58 | dataType: 'json', 59 | beforeSend: function(xhr, settings) { 60 | xhr.setRequestHeader("X-CSRFToken", csrftoken); 61 | } 62 | }); 63 | }) 64 | }); 65 | } 66 | btn.data('form-modal').modal().css( 67 | { 68 | 'margin-top': function () { 69 | return window.pageYOffset; 70 | } 71 | }); 72 | return false; 73 | }); 74 | 75 | $('.btn-quick-form').on('post-success', function(e){ 76 | window.location.reload(); 77 | }); 78 | }); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.page.form.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | $(function() { 3 | var action_bar = $('.form-actions'); 4 | if(action_bar.length){ 5 | var height=action_bar[0].offsetTop + action_bar.outerHeight(); 6 | var onchange = function(){ 7 | var s=(document.body.scrollTop||document.documentElement.scrollTop) + window.innerHeight; 8 | if(s 0){ 28 | var first_activated = false; 29 | exform.find('.error').each(function(){ 30 | if (!first_activated){ 31 | var parent = $(this); 32 | while (!(parent.html() == exform.html())){ 33 | if (parent.hasClass('tab-pane')){ 34 | parent.addClass('active'); 35 | parent.siblings().removeClass('active'); 36 | var menu_tab = $('a[href="#' + parent.attr('id') + '"]'); 37 | menu_tab.parent().addClass('active'); 38 | menu_tab.parent().siblings().removeClass('active'); 39 | first_activated = true; 40 | 41 | } 42 | if (parent.hasClass('box-content')){ 43 | parent.show(); 44 | } 45 | parent = parent.parent(); 46 | } 47 | } 48 | }); 49 | } 50 | })(jQuery) 51 | 52 | -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.page.list.js: -------------------------------------------------------------------------------- 1 | jQuery(function($){ 2 | //full screen btn 3 | $('.layout-btns .layout-full').click(function(e){ 4 | var icon = $(this).find('i') 5 | if($(this).hasClass('active')){ 6 | // reset 7 | $('#left-side, ul.breadcrumb').show('fast'); 8 | $('#content-block').removeClass('col-md-12 col-sm-12 full-content').addClass('col-sm-11 col-md-10'); 9 | icon.removeClass('fa-compress').addClass('fa-expand'); 10 | $(window).trigger('resize'); 11 | } else { 12 | // full screen 13 | $('#left-side, ul.breadcrumb').hide('fast', function(){ 14 | $('#content-block').removeClass('col-sm-11 col-md-10').addClass('col-md-12 col-sm-12 full-content'); 15 | icon.removeClass('fa-expand').addClass('fa-compress'); 16 | $(window).trigger('resize'); 17 | }); 18 | } 19 | }); 20 | 21 | $('.layout-btns .layout-normal').click(function(e){ 22 | $('.results table').removeClass('table-condensed'); 23 | }); 24 | 25 | $('.layout-btns .layout-condensed').click(function(e){ 26 | $('.results table').addClass('table-condensed'); 27 | }); 28 | 29 | }); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.actions.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.fn.actions = function(opts) { 4 | var options = $.extend({}, $.fn.actions.defaults, opts); 5 | var actionCheckboxes = $(this); 6 | 7 | updateCounter = function() { 8 | var sel = $(actionCheckboxes).filter(":checked").length; 9 | 10 | $(options.counterContainer).html(interpolate( 11 | ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { 12 | sel: sel, 13 | cnt: _actions_icnt 14 | }, true)); 15 | 16 | if (sel == actionCheckboxes.length) { 17 | showQuestion(); 18 | $(options.allToggle).prop('checked', true); 19 | } else { 20 | clearAcross(); 21 | $(options.allToggle).prop('checked', false); 22 | } 23 | } 24 | showQuestion = function() { 25 | $(options.acrossClears).hide(); 26 | $(options.acrossQuestions).show(); 27 | $(options.allContainer).hide(); 28 | } 29 | showClear = function() { 30 | $(options.acrossClears).show(); 31 | $(options.acrossQuestions).hide(); 32 | $(options.allContainer).show(); 33 | $(options.counterContainer).hide(); 34 | } 35 | reset = function() { 36 | $(options.acrossClears).hide(); 37 | $(options.acrossQuestions).hide(); 38 | $(options.allContainer).hide(); 39 | $(options.counterContainer).show(); 40 | } 41 | clearAcross = function() { 42 | reset(); 43 | $(options.acrossInput).val(0); 44 | } 45 | 46 | // Show counter by default 47 | $(options.counterContainer).show(); 48 | $(options.allToggle).show().click(function() { 49 | $(actionCheckboxes).trigger('checker', $(this).is(":checked")); 50 | }); 51 | 52 | $("div.form-actions .question").click(function(event) { 53 | event.preventDefault(); 54 | $(options.acrossInput).val(1); 55 | showClear(); 56 | }); 57 | $("div.form-actions .clear").click(function(event) { 58 | event.preventDefault(); 59 | $(options.allToggle).prop("checked", false); 60 | $(actionCheckboxes).trigger('checker', false); 61 | clearAcross(); 62 | }); 63 | 64 | $(actionCheckboxes).bind('checker', function(e, checked){ 65 | $(this).prop("checked", checked) 66 | .parentsUntil('.grid-item').parent().toggleClass(options.selectedClass, checked); 67 | updateCounter(); 68 | }); 69 | 70 | lastChecked = null; 71 | $(actionCheckboxes).click(function(event) { 72 | if (!event) { var event = window.event; } 73 | var target = event.target ? event.target : event.srcElement; 74 | 75 | if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey == true) { 76 | var inrange = false; 77 | $(lastChecked).trigger('checker', target.checked); 78 | $(actionCheckboxes).each(function() { 79 | if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) { 80 | inrange = (inrange) ? false : true; 81 | } 82 | if (inrange) { 83 | $(this).trigger('checker', target.checked); 84 | } 85 | }); 86 | } 87 | 88 | $(target).trigger('checker', target.checked); 89 | lastChecked = target; 90 | }); 91 | 92 | // Check state of checkboxes and reinit state if needed 93 | $(this).filter(":checked").trigger('checker', true); 94 | updateCounter(); 95 | if ($(options.acrossInput).val() == 1) { 96 | showClear(); 97 | } 98 | } 99 | /* Setup plugin defaults */ 100 | $.fn.actions.defaults = { 101 | counterContainer: "div.form-actions .action-counter", 102 | allContainer: "div.form-actions .all", 103 | acrossInput: "div.form-actions #select-across", 104 | acrossQuestions: "div.form-actions .question", 105 | acrossClears: "div.form-actions .clear", 106 | allToggle: "#action-toggle", 107 | selectedClass: "warning" 108 | } 109 | 110 | $.do_action = function(name){ 111 | $('#action').val(name); 112 | $('#changelist-form').submit(); 113 | } 114 | 115 | $(document).ready(function($) { 116 | $(".results input.action-select").actions(); 117 | }); 118 | })(jQuery); 119 | -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.batch.js: -------------------------------------------------------------------------------- 1 | 2 | ;(function($){ 3 | 4 | $('.batch-field-checkbox').bind('click', function(event){ 5 | if (!event) { var event = window.event; } 6 | var target = event.target ? event.target : event.srcElement; 7 | 8 | var wrap = $(this).parent().parent().find('.control-wrap'); 9 | if(target.checked){ 10 | wrap.show('fast'); 11 | } else { 12 | wrap.hide('fast'); 13 | } 14 | }); 15 | 16 | })(jQuery) -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.bookmark.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $(function(){ 4 | $('#bookmark_form').each(function(){ 5 | var f = $(this); 6 | f.submit(function(e){ 7 | f.find('button[type=submit]').button('loading'); 8 | $.post(f.attr('action'), f.serialize(), function(data){ 9 | $('#bookmark-menu .add-bookmark').remove(); 10 | $('#bookmark-menu').append('
  • '+ data.title +'
  • '); 11 | }, 'json'); 12 | return false; 13 | }); 14 | }); 15 | }); 16 | 17 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.charts.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | 3 | function showTooltip(x, y, contents) { 4 | $('
    ' + contents + '
    ').css( { 5 | position: 'absolute', 6 | display: 'none', 7 | top: y + 5, 8 | left: x + 5 9 | }).appendTo("body").fadeIn(200); 10 | } 11 | 12 | $.fn.chart = function(){ 13 | $(this).each(function(){ 14 | var $chart = $(this); 15 | 16 | if($chart.data('chart-obj')) return; 17 | 18 | $chart.html(' Loading chart...'); 19 | 20 | $.getJSON($chart.data('chart-url'), function(data){ 21 | var chart = $.plot($chart, data.data, data.option); 22 | var previousPoint = null; 23 | $chart.bind("plothover", function (event, pos, item) { 24 | if (item) { 25 | if (previousPoint != item.dataIndex) { 26 | previousPoint = item.dataIndex; 27 | 28 | $("#chart-tooltip").remove(); 29 | var x = item.series.xaxis.tickFormatter(item.datapoint[0], item.series.xaxis), 30 | y = item.series.yaxis.tickFormatter(item.datapoint[1], item.series.yaxis); 31 | if (item.series.xaxis.options.mode=="categories") { 32 | x = item.series.data[item.dataIndex][0]; 33 | } 34 | if (item.series.yaxis.options.mode=="categories") { 35 | y = item.series.data[item.dataIndex][1]; 36 | } 37 | showTooltip(item.pageX, item.pageY, 38 | item.series.label + " :
    (" + x + " , " + y+")"); 39 | } 40 | } else { 41 | $("#chart-tooltip").remove(); 42 | previousPoint = null; 43 | } 44 | }); 45 | $chart.data('chart-obj', chart); 46 | }); 47 | }) 48 | } 49 | 50 | $('.chart-tab a').click(function(e){ 51 | e.preventDefault(); 52 | $(this).tab('show'); 53 | 54 | $($(this).attr('href')).chart(); 55 | }); 56 | $('.chart-tab a:first').click(); 57 | $('.chart.init').chart(); 58 | }); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.details.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | 3 | var DetailsPop = function(element){ 4 | this.$element = $(element); 5 | this.res_uri = this.$element.data('res-uri'); 6 | this.edit_uri = this.$element.data('edit-uri'); 7 | this.obj_data = null; 8 | 9 | this.$element.on('click', $.proxy(this.click, this)); 10 | }; 11 | 12 | DetailsPop.prototype = { 13 | constructor: DetailsPop, 14 | 15 | click: function(e){ 16 | e.stopPropagation(); 17 | e.preventDefault(); 18 | var modal = $('#detail-modal-id'); 19 | var el = this.$element; 20 | if(!modal.length){ 21 | modal = $(''); 26 | $('body').append(modal); 27 | } 28 | modal.find('.modal-title').html(el.attr('title')); 29 | modal.find('.edit-btn').attr('href', this.edit_uri); 30 | modal.find('.modal-body').html('

    '); 31 | modal.find('.modal-body').load(this.res_uri + '?_format=html', function(response, status, xhr) { 32 | if (status == "error") { 33 | var msg = "Sorry but there was an error: "; 34 | modal.find('.modal-body').html(msg + xhr.status + " " + (typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!')); 35 | } 36 | }); 37 | modal.modal(); 38 | } 39 | }; 40 | 41 | $.fn.details = function () { 42 | return this.each(function () { 43 | var $this = $(this), data = $this.data('details'); 44 | if (!data) { 45 | $this.data('details', (data = new DetailsPop(this))); 46 | } 47 | }); 48 | }; 49 | 50 | $(function(){ 51 | $('.details-handler').details(); 52 | }); 53 | 54 | })(jQuery); 55 | 56 | 57 | -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.filters.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $(function(){ 4 | 5 | // filter 6 | $('.filter-multiselect input[type=checkbox]').click(function(e){ 7 | window.location.href = $(this).parent().attr('href'); 8 | }); 9 | 10 | // menber filter 11 | $('.filter-number .remove').click(function(e){ 12 | $(this).parent().parent().find('input[type="number"]').val(''); 13 | }); 14 | 15 | $('.filter-number .toggle').click(function(e){ 16 | var new_name = $(this).hasClass('active') ? $(this).attr('data-off-name') : $(this).attr('data-on-name'); 17 | $(this).parent().parent().find('input[type="number"]').attr('name', new_name); 18 | }); 19 | 20 | $('#filter-menu form').submit(function(){ 21 | $(this).find('input[type="text"],input[type="number"]').each(function(e){ 22 | if(!$(this).val()) $(this).attr('name', ''); 23 | }); 24 | return true; 25 | }); 26 | 27 | $('.menu-date-range form').each(function(){ 28 | var el = $(this); 29 | var start_date = el.find('.calendar.date-start').datepicker({format: $.date_local.dateJSFormat, language: 'xadmin'}); 30 | var end_date = el.find('.calendar.date-end').datepicker({format: $.date_local.dateJSFormat, language: 'xadmin'}); 31 | 32 | var checkAvailable = function(){ 33 | if(start_date.data('datepicker').getDate().valueOf() <= end_date.data('datepicker').getDate().valueOf()){ 34 | el.find('button[type=submit]').removeAttr('disabled'); 35 | } else { 36 | el.find('button[type=submit]').attr('disabled', 'disabled'); 37 | } 38 | } 39 | 40 | start_date.on('changeDate', function(ev){ 41 | var startdate = start_date.data('date'); 42 | el.find('.start_input').val(startdate); 43 | end_date.data('datepicker').setStartDate(startdate); 44 | checkAvailable(); 45 | }); 46 | end_date.on('changeDate', function(ev){ 47 | var enddate = end_date.data('date'); 48 | el.find('.end_input').val(enddate); 49 | start_date.data('datepicker').setEndDate(enddate); 50 | checkAvailable(); 51 | }); 52 | 53 | checkAvailable(); 54 | }); 55 | }); 56 | 57 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.portal.js: -------------------------------------------------------------------------------- 1 | jQuery(function() { 2 | $( ".column" ).sortable({ 3 | connectWith: ".column", 4 | handle: '.panel-heading', 5 | forcePlaceholderSize: true, 6 | cursor: "move", 7 | cancel: ".unsort, .tab-content", 8 | stop: function( event, ui ) { 9 | var pos = []; 10 | $('.column').each(function(){ 11 | var col = []; 12 | $(this).find('.panel').each(function(){ 13 | col.push($(this).attr('id')); 14 | }); 15 | pos.push(col.join(',')); 16 | }); 17 | var pos_val = pos.join('|'); 18 | var key = $('#_portal_key').val(); 19 | $.save_user_settings(key, pos_val, function(){ 20 | //alert('success'); 21 | }); 22 | } 23 | }); 24 | 25 | $( ".panel-heading .icon.chevron" ).click(function() { 26 | $( this ).toggleClass( "fa fa-chevron-up" ).toggleClass( "fa fa-chevron-down" ); 27 | $( this ).parents( ".panel:first" ).find( ".panel-body" ).toggle('fast'); 28 | }); 29 | 30 | }); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.quickfilter.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | $('[data-toggle=tooltip]').tooltip(); 3 | var max=10; 4 | 5 | function addShowMore($,v){ 6 | $(v).nextUntil('li.nav-header').last().after( 7 | $('
  • Show more
  • ').click(function(e){ 8 | e.preventDefault(); 9 | e.stopPropagation(); 10 | $(v).nextUntil('li.nav-header').show(); 11 | $(v).nextUntil('li.nav-header').last().remove(); 12 | addShowLess($,v); 13 | }) 14 | ); 15 | $(v).nextUntil('li.nav-header').last().show(); 16 | } 17 | 18 | function addShowLess($,v){ 19 | $(v).nextUntil('li.nav-header').last().after( 20 | $('
  • Show less
  • ').click(function(e){ 21 | e.preventDefault(); 22 | e.stopPropagation(); 23 | $(v).nextUntil('li.nav-header').filter(function(i){return !$(this).find('input').is(':checked');}).slice(max).hide(); 24 | $(v).nextUntil('li.nav-header').last().remove(); 25 | $(v).scrollMinimal(3000); 26 | addShowMore($,v); 27 | }) 28 | ); 29 | $(v).nextUntil('li.nav-header').last().show(); 30 | } 31 | 32 | $.each($('.nav-quickfilter li.nav-header'),function(i,v){ 33 | if ($(v).nextUntil('li.nav-header').size()>max) { 34 | $(v).nextUntil('li.nav-header').filter(function(i){return !$(this).find('input').is(':checked');}).slice(max).hide(); 35 | addShowMore($,v); 36 | } 37 | }); 38 | 39 | $('.nav-quickfilter li.nav-header').on('click',function(e) { 40 | e.preventDefault(); 41 | e.stopPropagation(); 42 | $('.nav-quickfilter li.nav-header i').toggleClass('icon-chevron-right'); 43 | $('.nav-quickfilter li.nav-header i').toggleClass('icon-chevron-left'); 44 | $('#left-side').toggleClass('col-md-2'); 45 | $('#left-side').toggleClass('col-md-4'); 46 | $('#content-block').toggleClass('col-md-10'); 47 | $('#content-block').toggleClass('col-md-8'); 48 | }); 49 | })(jQuery) -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.refresh.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.dofresh = function(){ 4 | var refresh_el = $('#refresh_time'); 5 | var time = parseInt(refresh_el.text()); 6 | if(time == 1){ 7 | refresh_el.text(0); 8 | window.location.reload(); 9 | } else { 10 | refresh_el.text(time-1); 11 | setTimeout("$.dofresh()",1000) 12 | } 13 | }; 14 | 15 | $(function(){ 16 | var refresh_el = $('#refresh_time'); 17 | if(refresh_el){ 18 | setTimeout("$.dofresh()",1000) 19 | } 20 | }); 21 | 22 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.revision.js: -------------------------------------------------------------------------------- 1 | jQuery(function($){ 2 | $('.diff_field').each(function(){ 3 | var el = $(this); 4 | var textarea = el.find('textarea.org-data'); 5 | var title = el.data('org-data') || el.attr('title'); 6 | if(textarea.length){ 7 | title = textarea.val(); 8 | } 9 | el.find('.controls').tooltip({ 10 | title: title, 11 | html: true 12 | }) 13 | }); 14 | 15 | $('.formset-content .formset-row').each(function(){ 16 | var row = $(this); 17 | var del = row.find('input[id $= "-DELETE"]'); 18 | if(del.val() == 'on' || del.val() == 'True'){ 19 | row.addClass('row-deleted'); 20 | del.val('on'); 21 | } 22 | var idinput = row.find('input[id $= "-id"]'); 23 | if(idinput.val() == '' || idinput.val() == undefined){ 24 | row.addClass('row-added'); 25 | row.find('.formset-num').html(gettext('New Item')); 26 | } 27 | }); 28 | }); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.sortable.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $(function(){ 4 | $(".results table tbody").sortable({ 5 | axis: 'y', 6 | items: 'tr', 7 | //handle: 'a.sort_hand', 8 | cursor: 'move', 9 | opacity: 0.8, 10 | stop: function(event, ui) { 11 | //alert(0); 12 | } 13 | }); 14 | }); 15 | 16 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.plugin.themes.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.setCookie = function(name, value, options){ 4 | options = options || {}; 5 | if (value === null) { 6 | value = ''; 7 | options.expires = -1; 8 | } 9 | var expires = ''; 10 | if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { 11 | var date; 12 | if (typeof options.expires == 'number') { 13 | date = new Date(); 14 | date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 15 | } else { 16 | date = options.expires; 17 | } 18 | expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE 19 | } 20 | var path = options.path ? '; path=' + options.path : ''; 21 | var domain = options.domain ? '; domain=' + options.domain : ''; 22 | var secure = options.secure ? '; secure' : ''; 23 | document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 24 | } 25 | 26 | $(function(){ 27 | var top_nav = $('#top-nav'); 28 | $('#body-content').css('margin-top', (top_nav.height() + 15) + 'px'); 29 | 30 | if($("#g-theme-menu")){ 31 | $('#g-theme-menu li>a').click(function(){ 32 | var $el = $(this); 33 | var themeHref = $el.data('css-href'); 34 | 35 | var topmenu = $('#top-nav .navbar-collapse'); 36 | if(topmenu.data('bs.collapse')) topmenu.collapse('hide'); 37 | 38 | var modal = $(''); 40 | $('body').append(modal); 41 | 42 | modal.on('shown.bs.modal', function(){ 43 | $.save_user_settings("site-theme", themeHref, function(){ 44 | $.setCookie('_theme', themeHref); 45 | 46 | var iframe = document.createElement("IFRAME"); 47 | iframe.style.display = 'none'; 48 | document.body.appendChild(iframe); 49 | 50 | modal.on('hidden', function(e){ 51 | if(iframe){ 52 | $(iframe).unbind('load'); 53 | iframe.parentNode.removeChild(iframe); 54 | iframe = null; 55 | } 56 | modal.remove(); 57 | }); 58 | 59 | $(iframe).load(function () { 60 | $('#site-theme').attr('href', themeHref); 61 | 62 | setTimeout(function(){ 63 | var nav_height = $('#top-nav').height(); 64 | $('#body-content').animate({'margin-top': (nav_height + 15)}, 500, 'easeOutBounce'); 65 | }, 500); 66 | 67 | modal.modal('hide'); 68 | iframe.parentNode.removeChild(iframe); 69 | iframe = null; 70 | }) 71 | 72 | var ifmDoc = iframe.contentDocument || iframe.contentWindow.document; 73 | ifmDoc.open(); 74 | ifmDoc.write(''); 75 | ifmDoc.write(''); 76 | ifmDoc.write(''); 77 | ifmDoc.close(); 78 | 79 | 80 | $('#g-theme-menu li').removeClass('active'); 81 | $el.parent().addClass('active'); 82 | }); 83 | }) 84 | 85 | modal.modal().css( 86 | { 87 | 'margin-top': function () { 88 | return window.pageYOffset; 89 | } 90 | }); 91 | }) 92 | } 93 | }); 94 | 95 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.widget.datetime.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | $.convert_format = function(format){ 3 | var fields = { 4 | d: 'dd', 5 | H: 'hh', 6 | I: "HH", 7 | m: 'mm', 8 | M: 'MM', 9 | p: 'PM/AM', 10 | S: 'ss', 11 | w: 'w', 12 | y: 'yy', 13 | Y: 'yyyy', 14 | '%' : '%' 15 | }; 16 | var result = '', i = 0; 17 | while (i < format.length) { 18 | if (format.charAt(i) === '%') { 19 | if(f = fields[format.charAt(i + 1)]){ 20 | result = result + f; 21 | } 22 | ++i; 23 | } else { 24 | result = result + format.charAt(i); 25 | } 26 | ++i; 27 | } 28 | return result; 29 | } 30 | 31 | $.date_local = { 32 | days: gettext("Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday").split(' '), 33 | daysShort: gettext("Sun Mon Tue Wed Thu Fri Sat Sun").split(' '), 34 | daysMin: gettext("Su Mo Tu We Th Fr Sa Su").split(' '), 35 | months: gettext('January February March April May June July August September October November December').split(' '), 36 | monthsShort: gettext("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec").split(' '), 37 | today: gettext("Today"), 38 | date_string: gettext('%a %d %b %Y %T %Z'), 39 | ampm: gettext("AM PM").split(' '), 40 | ampmLower: gettext("am pm").split(' '), 41 | dateFormat: get_format('DATE_INPUT_FORMATS')[0], 42 | dateJSFormat: $.convert_format(get_format('DATE_INPUT_FORMATS')[0]), 43 | timeRepr: gettext('%T') 44 | } 45 | 46 | $.fn.datepicker.dates['xadmin'] = $.date_local; 47 | 48 | $.fn.exform.renders.push(function(f){ 49 | f.find('.input-group.date input').each(function(e){ 50 | var dp = $(this).datepicker({format: $.date_local.dateJSFormat, language: 'xadmin', todayBtn: "linked", autoclose: true}) 51 | .data('datepicker'); 52 | $(this).parent().find('button').click(function(e){ 53 | dp.update(new Date()); 54 | }) 55 | }) 56 | if($.fn.timepicker){ 57 | f.find('.input-group.time').each(function(e){ 58 | var el = $(this).find('input'); 59 | var value = el.val(); 60 | var tp = el.timepicker({ 61 | minuteStep: 1, 62 | showSeconds: true, 63 | showMeridian: false, 64 | defaultTime: false 65 | }).data('timepicker'); 66 | $(this).find('button').click(function(e){ 67 | tp.$element.val(""); 68 | tp.setDefaultTime('current'); 69 | tp.update(); 70 | }) 71 | }) 72 | } 73 | }); 74 | 75 | })(jQuery) 76 | -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.widget.multiselect.js: -------------------------------------------------------------------------------- 1 | 2 | ;(function($){ 3 | 4 | $.fn.exform.renders.push(function(f){ 5 | if($.fn.multiselect){ 6 | f.find('.selectmultiple.selectdropdown').multiselect({ 7 | 8 | }); 9 | } 10 | }); 11 | 12 | })(jQuery) -------------------------------------------------------------------------------- /static/xadmin/js/xadmin.widget.select.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | // add select2 render 3 | if(!window.__admin_ismobile__){ 4 | $.fn.exform.renders.push(function(f){ 5 | if($.fn.selectize){ 6 | f.find('select:not(.select-search):not([multiple=multiple])').selectize(); 7 | f.find('.select-search').each(function(){ 8 | var $el = $(this); 9 | $el.select2({ 10 | minimumInputLength: 1, 11 | initSelection: function(elem, callback){ 12 | callback({id: elem.val(), '__str__': $el.data('label')}); 13 | }, 14 | ajax: { 15 | url: $el.data('search-url')+$el.data('choices'), 16 | dataType: 'json', 17 | data: function (term, page) { 18 | return { 19 | '_q_' : term, 20 | '_cols': 'id.__str__', 21 | 'p': page - 1 22 | }; 23 | }, 24 | results: function (data, page) { 25 | return {results: data.objects, more: data.has_more}; 26 | } 27 | }, 28 | formatResult: function(item){return item['__str__']}, 29 | formatSelection: function(item){return item['__str__']} 30 | }); 31 | }) 32 | }}); 33 | } else { 34 | $.fn.exform.renders.push(function(f){ 35 | if($.fn.select2){ 36 | f.find('.select-search').each(function(){ 37 | var $el = $(this); 38 | $el.select2({ 39 | minimumInputLength: 1, 40 | initSelection: function(elem, callback){ 41 | callback({id: elem.val(), '__str__': $el.data('label')}); 42 | }, 43 | ajax: { 44 | url: $el.data('search-url')+$el.data('choices'), 45 | dataType: 'json', 46 | data: function (term, page) { 47 | return { 48 | '_q_' : term, 49 | '_cols': 'id.__str__', 50 | 'p': page - 1 51 | }; 52 | }, 53 | results: function (data, page) { 54 | return {results: data.objects, more: data.has_more}; 55 | } 56 | }, 57 | formatResult: function(item){return item['__str__']}, 58 | formatSelection: function(item){return item['__str__']} 59 | }); 60 | }) 61 | }}); 62 | } 63 | })(jQuery) 64 | 65 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.bg.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bulgarian translation for bootstrap-datepicker 3 | * Apostol Apostolov 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['bg'] = { 7 | days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя"], 8 | daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб", "Нед"], 9 | daysMin: ["Н", "П", "В", "С", "Ч", "П", "С", "Н"], 10 | months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"], 11 | monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"], 12 | today: "днес" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ca.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catalan translation for bootstrap-datepicker 3 | * J. Garcia 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['ca'] = { 7 | days: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte", "Diumenge"], 8 | daysShort: ["Diu", "Dil", "Dmt", "Dmc", "Dij", "Div", "Dis", "Diu"], 9 | daysMin: ["dg", "dl", "dt", "dc", "dj", "dv", "ds", "dg"], 10 | months: ["Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"], 11 | monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"], 12 | today: "Avui" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.cs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Czech translation for bootstrap-datepicker 3 | * Matěj Koubík 4 | * Fixes by Michal Remiš 5 | */ 6 | ;(function($){ 7 | $.fn.datepicker.dates['cs'] = { 8 | days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"], 9 | daysShort: ["Ned", "Pon", "Úte", "Stř", "Čtv", "Pát", "Sob", "Ned"], 10 | daysMin: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So", "Ne"], 11 | months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"], 12 | monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"], 13 | today: "Dnes" 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.da.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Danish translation for bootstrap-datepicker 3 | * Christian Pedersen 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['da'] = { 7 | days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], 8 | daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], 9 | daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], 10 | months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], 12 | today: "I Dag" 13 | }; 14 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.de.js: -------------------------------------------------------------------------------- 1 | /** 2 | * German translation for bootstrap-datepicker 3 | * Sam Zurcher 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['de'] = { 7 | days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"], 8 | daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son"], 9 | daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"], 10 | months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], 11 | monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], 12 | today: "Heute", 13 | weekStart: 1, 14 | format: "dd.mm.yyyy" 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.el.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Greek translation for bootstrap-datepicker 3 | */ 4 | ;(function($){ 5 | $.fn.datepicker.dates['el'] = { 6 | days: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο", "Κυριακή"], 7 | daysShort: ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"], 8 | daysMin: ["Κυ", "Δε", "Τρ", "Τε", "Πε", "Πα", "Σα", "Κυ"], 9 | months: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"], 10 | monthsShort: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"], 11 | today: "Σήμερα" 12 | }; 13 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.es.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Spanish translation for bootstrap-datepicker 3 | * Bruno Bonamin 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['es'] = { 7 | days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"], 8 | daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom"], 9 | daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"], 10 | months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], 11 | monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], 12 | today: "Hoy" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fi.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Finnish translation for bootstrap-datepicker 3 | * Jaakko Salonen 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['fi'] = { 7 | days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"], 8 | daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau", "sun"], 9 | daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la", "su"], 10 | months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"], 11 | monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou"], 12 | today: "tänään" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * French translation for bootstrap-datepicker 3 | * Nico Mollet 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['fr'] = { 7 | days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"], 8 | daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"], 9 | daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"], 10 | months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"], 11 | monthsShort: ["Jan", "Fev", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec"], 12 | today: "Aujourd'hui", 13 | weekStart: 1, 14 | format: "dd/mm/yyyy" 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.he.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Hebrew translation for bootstrap-datepicker 3 | * Sagie Maoz 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['he'] = { 7 | days: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"], 8 | daysShort: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], 9 | daysMin: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], 10 | months: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"], 11 | monthsShort: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"], 12 | today: "היום", 13 | rtl: true 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Croatian localisation 3 | */ 4 | ;(function($){ 5 | $.fn.datepicker.dates['hr'] = { 6 | days: ["Nedjelja", "Ponedjelja", "Utorak", "Srijeda", "Četrtak", "Petak", "Subota", "Nedjelja"], 7 | daysShort: ["Ned", "Pon", "Uto", "Srr", "Čet", "Pet", "Sub", "Ned"], 8 | daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su", "Ne"], 9 | months: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], 10 | monthsShort: ["Sije", "Velj", "Ožu", "Tra", "Svi", "Lip", "Jul", "Kol", "Ruj", "Lis", "Stu", "Pro"], 11 | today: "Danas" 12 | }; 13 | }(jQuery)); 14 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hu.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Hungarian translation for bootstrap-datepicker 3 | * Sotus László 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['hu'] = { 7 | days: ["Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"], 8 | daysShort: ["Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo", "Vas"], 9 | daysMin: ["Va", "Hé", "Ke", "Sz", "Cs", "Pé", "Sz", "Va"], 10 | months: ["Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"], 11 | monthsShort: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sze", "Okt", "Nov", "Dec"], 12 | today: "Ma", 13 | weekStart: 1, 14 | format: "yyyy.mm.dd" 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.id.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bahasa translation for bootstrap-datepicker 3 | * Azwar Akbar 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['id'] = { 7 | days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"], 8 | daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Mgu"], 9 | daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa", "Mg"], 10 | months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"] 12 | }; 13 | }(jQuery)); 14 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.is.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Icelandic translation for bootstrap-datepicker 3 | * Hinrik Örn Sigurðsson 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['is'] = { 7 | days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"], 8 | daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun"], 9 | daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La", "Su"], 10 | months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"], 12 | today: "Í Dag" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.it.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Italian translation for bootstrap-datepicker 3 | * Enrico Rubboli 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['it'] = { 7 | days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"], 8 | daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"], 9 | daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"], 10 | months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], 11 | monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"], 12 | today: "Oggi", 13 | weekStart: 1, 14 | format: "dd/mm/yyyy" 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ja.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Japanese translation for bootstrap-datepicker 3 | * Norio Suzuki 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['ja'] = { 7 | days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜"], 8 | daysShort: ["日", "月", "火", "水", "木", "金", "土", "日"], 9 | daysMin: ["日", "月", "火", "水", "木", "金", "土", "日"], 10 | months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], 11 | monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], 12 | today: "今日", 13 | format: "yyyy/mm/dd" 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.kr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Korean translation for bootstrap-datepicker 3 | * Gu Youn 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['kr'] = { 7 | days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"], 8 | daysShort: ["일", "월", "화", "수", "목", "금", "토", "일"], 9 | daysMin: ["일", "월", "화", "수", "목", "금", "토", "일"], 10 | months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], 11 | monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"] 12 | }; 13 | }(jQuery)); 14 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Lithuanian translation for bootstrap-datepicker 3 | * Šarūnas Gliebus 4 | */ 5 | 6 | ;(function($){ 7 | $.fn.datepicker.dates['lt'] = { 8 | days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis", "Sekmadienis"], 9 | daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š", "S"], 10 | daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št", "Sk"], 11 | months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"], 12 | monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"], 13 | today: "Šiandien", 14 | weekStart: 1 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Latvian translation for bootstrap-datepicker 3 | * Artis Avotins 4 | */ 5 | 6 | ;(function($){ 7 | $.fn.datepicker.dates['lv'] = { 8 | days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena", "Svētdiena"], 9 | daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S", "Sv"], 10 | daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "St", "Sv"], 11 | months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"], 12 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec."], 13 | today: "Šodien", 14 | weekStart: 1 15 | }; 16 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ms.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Malay translation for bootstrap-datepicker 3 | * Ateman Faiz 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['ms'] = { 7 | days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu", "Ahad"], 8 | daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab", "Aha"], 9 | daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa", "Ah"], 10 | months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], 12 | today: "Hari Ini" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nb.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Norwegian (bokmål) translation for bootstrap-datepicker 3 | * Fredrik Sundmyhr 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['nb'] = { 7 | days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], 8 | daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], 9 | daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], 10 | months: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], 12 | today: "I Dag" 13 | }; 14 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Dutch translation for bootstrap-datepicker 3 | * Reinier Goltstein 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['nl'] = { 7 | days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"], 8 | daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], 9 | daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], 10 | months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], 11 | monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], 12 | today: "Vandaag" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Polish translation for bootstrap-datepicker 3 | * Robert 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['pl'] = { 7 | days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], 8 | daysShort: ["Nie", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nie"], 9 | daysMin: ["N", "Pn", "Wt", "Śr", "Cz", "Pt", "So", "N"], 10 | months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], 11 | monthsShort: ["Sty", "Lu", "Mar", "Kw", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa", "Lis", "Gru"], 12 | today: "Dzisiaj", 13 | weekStart: 1 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt-BR.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Brazilian translation for bootstrap-datepicker 3 | * Cauan Cabral 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['pt-BR'] = { 7 | days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], 8 | daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], 9 | daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], 10 | months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], 11 | monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], 12 | today: "Hoje" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Portuguese translation for bootstrap-datepicker 3 | * Original code: Cauan Cabral 4 | * Tiago Melo 5 | */ 6 | ;(function($){ 7 | $.fn.datepicker.dates['pt'] = { 8 | days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], 9 | daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], 10 | daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], 11 | months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], 12 | monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"] 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ro.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Romanian translation for bootstrap-datepicker 3 | * Cristian Vasile 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['ro'] = { 7 | days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă", "Duminică"], 8 | daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"], 9 | daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ", "Du"], 10 | months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"], 11 | monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"], 12 | today: "Astăzi", 13 | weekStart: 1 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs-latin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Serbian latin translation for bootstrap-datepicker 3 | * Bojan Milosavlević 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['rs'] = { 7 | days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota", "Nedelja"], 8 | daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub", "Ned"], 9 | daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su", "N"], 10 | months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], 12 | today: "Danas" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Serbian cyrillic translation for bootstrap-datepicker 3 | * Bojan Milosavlević 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['rs'] = { 7 | days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота", "Недеља"], 8 | daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб", "Нед"], 9 | daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су", "Н"], 10 | months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"], 11 | monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"], 12 | today: "Данас" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ru.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Russian translation for bootstrap-datepicker 3 | * Victor Taranenko 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['ru'] = { 7 | days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"], 8 | daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Вск"], 9 | daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"], 10 | months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"], 11 | monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], 12 | today: "Сегодня" 13 | }; 14 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Slovak translation for bootstrap-datepicker 3 | * Marek Lichtner 4 | * Fixes by Michal Remiš 5 | */ 6 | ;(function($){ 7 | $.fn.datepicker.dates["sk"] = { 8 | days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota", "Nedeľa"], 9 | daysShort: ["Ned", "Pon", "Uto", "Str", "Štv", "Pia", "Sob", "Ned"], 10 | daysMin: ["Ne", "Po", "Ut", "St", "Št", "Pia", "So", "Ne"], 11 | months: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"], 12 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"], 13 | today: "Dnes" 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Slovene translation for bootstrap-datepicker 3 | * Gregor Rudolf 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['sl'] = { 7 | days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota", "Nedelja"], 8 | daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"], 9 | daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So", "Ne"], 10 | months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], 12 | today: "Danes" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Swedish translation for bootstrap-datepicker 3 | * Patrik Ragnarsson 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['sv'] = { 7 | days: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"], 8 | daysShort: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"], 9 | daysMin: ["Sö", "Må", "Ti", "On", "To", "Fr", "Lö", "Sö"], 10 | months: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], 11 | monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], 12 | today: "I Dag" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sw.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Swahili translation for bootstrap-datepicker 3 | * Edwin Mugendi 4 | * Source: http://scriptsource.org/cms/scripts/page.php?item_id=entry_detail&uid=xnfaqyzcku 5 | */ 6 | ;(function($){ 7 | $.fn.datepicker.dates['sw'] = { 8 | days: ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi", "Jumapili"], 9 | daysShort: ["J2", "J3", "J4", "J5", "Alh", "Ij", "J1", "J2"], 10 | daysMin: ["2", "3", "4", "5", "A", "I", "1", "2"], 11 | months: ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"], 12 | monthsShort: ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], 13 | today: "Leo" 14 | }; 15 | }(jQuery)); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.th.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Thai translation for bootstrap-datepicker 3 | * Suchau Jiraprapot 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['th'] = { 7 | days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"], 8 | daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], 9 | daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], 10 | months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"], 11 | monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."], 12 | today: "วันนี้" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.tr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Turkish translation for bootstrap-datepicker 3 | * Serkan Algur 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['tr'] = { 7 | days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"], 8 | daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts", "Pz"], 9 | daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct", "Pz"], 10 | months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], 11 | monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"], 12 | today: "Bugün" 13 | }; 14 | }(jQuery)); 15 | 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.uk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Ukrainian translation for bootstrap-datepicker 3 | * Andrey Vityuk 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['uk'] = { 7 | days: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота", "Неділя"], 8 | daysShort: ["Нед", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Нед"], 9 | daysMin: ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Нд"], 10 | months: ["Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"], 11 | monthsShort: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"], 12 | today: "Сьогодні" 13 | }; 14 | }(jQuery)); -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Simplified Chinese translation for bootstrap-datepicker 3 | * Yuan Cheung 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['zh-CN'] = { 7 | days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], 8 | daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], 9 | daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], 10 | months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 11 | monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 12 | today: "今日" 13 | }; 14 | }(jQuery)); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-TW.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Traditional Chinese translation for bootstrap-datepicker 3 | * Rung-Sheng Jang 4 | */ 5 | ;(function($){ 6 | $.fn.datepicker.dates['zh-TW'] = { 7 | days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], 8 | daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], 9 | daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], 10 | months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 11 | monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"] 12 | }; 13 | }(jQuery)); 14 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.css: -------------------------------------------------------------------------------- 1 | @charset 'UTF-8'; 2 | /* 3 | * Bootstrap Image Gallery CSS 2.5.3 4 | * https://github.com/blueimp/Bootstrap-Image-Gallery 5 | * 6 | * Copyright 2011, Sebastian Tschan 7 | * https://blueimp.net 8 | * 9 | * Licensed under the MIT license: 10 | * http://www.opensource.org/licenses/MIT 11 | */ 12 | 13 | .modal-gallery { 14 | } 15 | .modal-gallery.fade.in { 16 | } 17 | .modal-gallery .modal-body { 18 | } 19 | .modal-gallery .modal-title { 20 | } 21 | .modal-gallery .modal-image { 22 | position: relative; 23 | margin: auto; 24 | min-width: 128px; 25 | min-height: 128px; 26 | overflow: hidden; 27 | cursor: pointer; 28 | } 29 | .modal-gallery .modal-footer { 30 | margin-top: 0px; 31 | } 32 | .modal-gallery .modal-image:hover:before, 33 | .modal-gallery .modal-image:hover:after { 34 | content: '\2039'; 35 | position: absolute; 36 | top: 50%; 37 | left: 15px; 38 | width: 40px; 39 | height: 40px; 40 | margin-top: -20px; 41 | font-size: 60px; 42 | font-weight: 100; 43 | line-height: 24px; 44 | color: #ffffff; 45 | text-align: center; 46 | background: #222222; 47 | border: 3px solid #ffffff; 48 | -webkit-border-radius: 23px; 49 | -moz-border-radius: 23px; 50 | border-radius: 23px; 51 | opacity: 0.5; 52 | filter: alpha(opacity=50); 53 | z-index: 1; 54 | } 55 | .modal-gallery .modal-image:hover:after { 56 | content: '\203A'; 57 | left: auto; 58 | right: 15px; 59 | } 60 | .modal-single .modal-image:hover:before, 61 | .modal-single .modal-image:hover:after { 62 | display: none; 63 | } 64 | .modal-gallery.fade .modal-image, .modal-gallery.fade .modal-dialog { 65 | -webkit-transition: width 0.15s ease, height 0.15s ease; 66 | -moz-transition: width 0.15s ease, height 0.15s ease; 67 | -ms-transition: width 0.15s ease, height 0.15s ease; 68 | -o-transition: width 0.15s ease, height 0.15s ease; 69 | transition: width 0.15s ease, height 0.15s ease; 70 | } 71 | .modal-gallery .modal-image *:not(.loader) { 72 | position: absolute; 73 | top: 0; 74 | } 75 | .modal-gallery .modal-image *:not(.loader) { 76 | opacity: 0; 77 | filter: alpha(opacity=0); 78 | } 79 | .modal-gallery .modal-image h1.loader { 80 | height: 50%; 81 | width: 100%; 82 | text-align: center; 83 | font-size: 4em; 84 | display: none; 85 | } 86 | .modal-loading.modal-gallery .modal-image h1.loader { 87 | display: block; 88 | } 89 | .modal-gallery.fade .modal-image * { 90 | -webkit-transition: opacity 0.5s linear; 91 | -moz-transition: opacity 0.5s linear; 92 | -ms-transition: opacity 0.5s linear; 93 | -o-transition: opacity 0.5s linear; 94 | transition: opacity 0.5s linear; 95 | } 96 | .modal-gallery .modal-image *.in { 97 | opacity: 1; 98 | filter: alpha(opacity=100); 99 | } 100 | .modal-fullscreen { 101 | border: none; 102 | -webkit-border-radius: 0; 103 | -moz-border-radius: 0; 104 | border-radius: 0; 105 | background: transparent; 106 | overflow: hidden; 107 | } 108 | .modal-fullscreen.modal-loading { 109 | border: 0; 110 | -webkit-box-shadow: none; 111 | -moz-box-shadow: none; 112 | box-shadow: none; 113 | } 114 | .modal-fullscreen .modal-body { 115 | padding: 0; 116 | } 117 | .modal-fullscreen .modal-header, 118 | .modal-fullscreen .modal-footer { 119 | position: absolute; 120 | top: 0; 121 | right: 0; 122 | left: 0; 123 | background: transparent; 124 | border: 0; 125 | -webkit-box-shadow: none; 126 | -moz-box-shadow: none; 127 | box-shadow: none; 128 | opacity: 0; 129 | z-index: 2000; 130 | } 131 | .modal-fullscreen .modal-footer { 132 | top: auto; 133 | bottom: 0; 134 | } 135 | .modal-fullscreen .close, 136 | .modal-fullscreen .modal-title { 137 | color: #fff; 138 | text-shadow: 0 0 2px rgba(33, 33, 33, 0.8); 139 | } 140 | .modal-fullscreen .modal-header:hover, 141 | .modal-fullscreen .modal-footer:hover { 142 | opacity: 1; 143 | } 144 | 145 | @media (max-width: 767px) { 146 | .modal-gallery .btn span { 147 | display: none; 148 | } 149 | .modal-fullscreen { 150 | right: 0; 151 | left: 0; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.min.css: -------------------------------------------------------------------------------- 1 | @charset 'UTF-8'; 2 | .modal-gallery{width:auto;max-height:none;outline:none;} 3 | .modal-gallery.fade.in{top:50%;} 4 | .modal-gallery .modal-body{max-height:none;} 5 | .modal-gallery .modal-title{display:inline-block;max-height:54px;overflow:hidden;} 6 | .modal-gallery .modal-image{position:relative;margin:auto;min-width:128px;min-height:128px;overflow:hidden;cursor:pointer;} 7 | .modal-gallery .modal-image:hover:before,.modal-gallery .modal-image:hover:after{content:'\2039';position:absolute;top:50%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);z-index:1;} 8 | .modal-gallery .modal-image:hover:after{content:'\203A';left:auto;right:15px;} 9 | .modal-single .modal-image:hover:before,.modal-single .modal-image:hover:after{display:none;} 10 | .modal-loading .modal-image{background:url(../img/loading.gif) center no-repeat;} 11 | .modal-gallery.fade .modal-image{-webkit-transition:width 0.15s ease, height 0.15s ease;-moz-transition:width 0.15s ease, height 0.15s ease;-ms-transition:width 0.15s ease, height 0.15s ease;-o-transition:width 0.15s ease, height 0.15s ease;transition:width 0.15s ease, height 0.15s ease;} 12 | .modal-gallery .modal-image *{position:absolute;top:0;opacity:0;filter:alpha(opacity=0);} 13 | .modal-gallery.fade .modal-image *{-webkit-transition:opacity 0.5s linear;-moz-transition:opacity 0.5s linear;-ms-transition:opacity 0.5s linear;-o-transition:opacity 0.5s linear;transition:opacity 0.5s linear;} 14 | .modal-gallery .modal-image *.in{opacity:1;filter:alpha(opacity=100);} 15 | .modal-fullscreen{border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:transparent;overflow:hidden;} 16 | .modal-fullscreen.modal-loading{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 17 | .modal-fullscreen .modal-body{padding:0;} 18 | .modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{position:absolute;top:0;right:0;left:0;background:transparent;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:0;z-index:2000;} 19 | .modal-fullscreen .modal-footer{top:auto;bottom:0;} 20 | .modal-fullscreen .close,.modal-fullscreen .modal-title{color:#fff;text-shadow:0 0 2px rgba(33, 33, 33, 0.8);} 21 | .modal-fullscreen .modal-header:hover,.modal-fullscreen .modal-footer:hover{opacity:1;} 22 | @media (max-width:767px){.modal-gallery .btn span{display:none;} .modal-fullscreen{right:0;left:0;}} 23 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-image-gallery/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/bootstrap-image-gallery/img/loading.gif -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-modal/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/bootstrap-modal/img/ajax-loader.gif -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-multiselect/css/bootstrap-multiselect.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/bootstrap-multiselect/css/bootstrap-multiselect.css -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-timepicker/css/bootstrap-timepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | .bootstrap-timepicker { 12 | position: relative; 13 | } 14 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { 15 | left: auto; 16 | right: 0; 17 | } 18 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { 19 | left: auto; 20 | right: 12px; 21 | } 22 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { 23 | left: auto; 24 | right: 13px; 25 | } 26 | .bootstrap-timepicker .add-on { 27 | cursor: pointer; 28 | } 29 | .bootstrap-timepicker .add-on i { 30 | display: inline-block; 31 | width: 16px; 32 | height: 16px; 33 | } 34 | .bootstrap-timepicker-widget.dropdown-menu { 35 | padding: 2px 3px 2px 2px; 36 | } 37 | .bootstrap-timepicker-widget.dropdown-menu.open { 38 | display: inline-block; 39 | } 40 | .bootstrap-timepicker-widget.dropdown-menu:before { 41 | border-bottom: 7px solid rgba(0, 0, 0, 0.2); 42 | border-left: 7px solid transparent; 43 | border-right: 7px solid transparent; 44 | content: ""; 45 | display: inline-block; 46 | left: 9px; 47 | position: absolute; 48 | top: -7px; 49 | } 50 | .bootstrap-timepicker-widget.dropdown-menu:after { 51 | border-bottom: 6px solid #FFFFFF; 52 | border-left: 6px solid transparent; 53 | border-right: 6px solid transparent; 54 | content: ""; 55 | display: inline-block; 56 | left: 10px; 57 | position: absolute; 58 | top: -6px; 59 | } 60 | .bootstrap-timepicker-widget a.btn, 61 | .bootstrap-timepicker-widget input { 62 | border-radius: 4px; 63 | } 64 | .bootstrap-timepicker-widget table { 65 | width: 100%; 66 | margin: 0; 67 | } 68 | .bootstrap-timepicker-widget table td { 69 | text-align: center; 70 | height: 30px; 71 | margin: 0; 72 | padding: 2px; 73 | } 74 | .bootstrap-timepicker-widget table td:not(.separator) { 75 | min-width: 30px; 76 | } 77 | .bootstrap-timepicker-widget table td span { 78 | width: 100%; 79 | } 80 | .bootstrap-timepicker-widget table td a { 81 | border: 1px transparent solid; 82 | width: 100%; 83 | display: inline-block; 84 | margin: 0; 85 | padding: 8px 0; 86 | outline: 0; 87 | color: #333; 88 | } 89 | .bootstrap-timepicker-widget table td a:hover { 90 | text-decoration: none; 91 | background-color: #eee; 92 | -webkit-border-radius: 4px; 93 | -moz-border-radius: 4px; 94 | border-radius: 4px; 95 | border-color: #ddd; 96 | } 97 | .bootstrap-timepicker-widget table td a i { 98 | margin-top: 2px; 99 | } 100 | .bootstrap-timepicker-widget table td input { 101 | width: 25px; 102 | margin: 0; 103 | text-align: center; 104 | } 105 | .bootstrap-timepicker-widget .modal-content { 106 | padding: 4px; 107 | } 108 | @media (min-width: 767px) { 109 | .bootstrap-timepicker-widget.modal { 110 | width: 200px; 111 | margin-left: -100px; 112 | } 113 | } 114 | @media (max-width: 767px) { 115 | .bootstrap-timepicker { 116 | width: 100%; 117 | } 118 | .bootstrap-timepicker .dropdown-menu { 119 | width: 100%; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /static/xadmin/vendor/bootstrap-timepicker/css/bootstrap-timepicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:2px 3px 2px 2px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,0.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;left:9px;position:absolute;top:-7px}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #fff;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;left:10px;position:absolute;top:-6px}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media(min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media(max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}} -------------------------------------------------------------------------------- /static/xadmin/vendor/flot/jquery.flot.resize.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | 14 | /* Inline dependency: 15 | * jQuery resize event - v1.1 - 3/14/2010 16 | * http://benalman.com/projects/jquery-resize-plugin/ 17 | * 18 | * Copyright (c) 2010 "Cowboy" Ben Alman 19 | * Dual licensed under the MIT and GPL licenses. 20 | * http://benalman.com/about/license/ 21 | */ 22 | 23 | (function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); 24 | 25 | (function ($) { 26 | var options = { }; // no options 27 | 28 | function init(plot) { 29 | function onResize() { 30 | var placeholder = plot.getPlaceholder(); 31 | 32 | // somebody might have hidden us and we can't plot 33 | // when we don't have the dimensions 34 | if (placeholder.width() == 0 || placeholder.height() == 0) 35 | return; 36 | 37 | plot.resize(); 38 | plot.setupGrid(); 39 | plot.draw(); 40 | } 41 | 42 | function bindEvents(plot, eventHolder) { 43 | plot.getPlaceholder().resize(onResize); 44 | } 45 | 46 | function shutdown(plot, eventHolder) { 47 | plot.getPlaceholder().unbind("resize", onResize); 48 | } 49 | 50 | plot.hooks.bindEvents.push(bindEvents); 51 | plot.hooks.shutdown.push(shutdown); 52 | } 53 | 54 | $.plot.plugins.push({ 55 | init: init, 56 | options: options, 57 | name: 'resize', 58 | version: '1.0' 59 | }); 60 | })(jQuery); 61 | -------------------------------------------------------------------------------- /static/xadmin/vendor/flot/jquery.flot.symbol.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin that adds some extra symbols for plotting points. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | The symbols are accessed as strings through the standard symbol options: 7 | 8 | series: { 9 | points: { 10 | symbol: "square" // or "diamond", "triangle", "cross" 11 | } 12 | } 13 | 14 | */ 15 | 16 | (function ($) { 17 | function processRawData(plot, series, datapoints) { 18 | // we normalize the area of each symbol so it is approximately the 19 | // same as a circle of the given radius 20 | 21 | var handlers = { 22 | square: function (ctx, x, y, radius, shadow) { 23 | // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 24 | var size = radius * Math.sqrt(Math.PI) / 2; 25 | ctx.rect(x - size, y - size, size + size, size + size); 26 | }, 27 | diamond: function (ctx, x, y, radius, shadow) { 28 | // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) 29 | var size = radius * Math.sqrt(Math.PI / 2); 30 | ctx.moveTo(x - size, y); 31 | ctx.lineTo(x, y - size); 32 | ctx.lineTo(x + size, y); 33 | ctx.lineTo(x, y + size); 34 | ctx.lineTo(x - size, y); 35 | }, 36 | triangle: function (ctx, x, y, radius, shadow) { 37 | // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) 38 | var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); 39 | var height = size * Math.sin(Math.PI / 3); 40 | ctx.moveTo(x - size/2, y + height/2); 41 | ctx.lineTo(x + size/2, y + height/2); 42 | if (!shadow) { 43 | ctx.lineTo(x, y - height/2); 44 | ctx.lineTo(x - size/2, y + height/2); 45 | } 46 | }, 47 | cross: function (ctx, x, y, radius, shadow) { 48 | // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 49 | var size = radius * Math.sqrt(Math.PI) / 2; 50 | ctx.moveTo(x - size, y - size); 51 | ctx.lineTo(x + size, y + size); 52 | ctx.moveTo(x - size, y + size); 53 | ctx.lineTo(x + size, y - size); 54 | } 55 | }; 56 | 57 | var s = series.points.symbol; 58 | if (handlers[s]) 59 | series.points.symbol = handlers[s]; 60 | } 61 | 62 | function init(plot) { 63 | plot.hooks.processDatapoints.push(processRawData); 64 | } 65 | 66 | $.plot.plugins.push({ 67 | init: init, 68 | name: 'symbols', 69 | version: '1.0' 70 | }); 71 | })(jQuery); 72 | -------------------------------------------------------------------------------- /static/xadmin/vendor/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/xadmin/vendor/jquery-ui/jquery.ui.core.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.2 - 2013-03-14 2 | * http://jqueryui.com 3 | * Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ 4 | (function(e,t){function i(t,i){var a,n,r,o=t.nodeName.toLowerCase();return"area"===o?(a=t.parentNode,n=a.name,t.href&&n&&"map"===a.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var a=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,a,n=e(this[0]);n.length&&n[0]!==document;){if(s=n.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(a=parseInt(n.css("zIndex"),10),!isNaN(a)&&0!==a))return a;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),a=isNaN(s);return(a||s>=0)&&i(t,!a)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function a(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,a(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,a(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var a,n=e.ui[t].prototype;for(a in s)n.plugins[a]=n.plugins[a]||[],n.plugins[a].push([i,s[a]])},call:function(e,t,i){var s,a=e.plugins[t];if(a&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;a.length>s;s++)e.options[a[s][0]]&&a[s][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",a=!1;return t[s]>0?!0:(t[s]=1,a=t[s]>0,t[s]=0,a)}})})(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/jquery-ui/jquery.ui.mouse.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.2 - 2013-03-14 2 | * http://jqueryui.com 3 | * Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ 4 | (function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.10.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/load-image/load-image.min.js: -------------------------------------------------------------------------------- 1 | (function(e){"use strict";var t=function(e,a,n){var r,i,c=document.createElement("img");if(c.onerror=a,c.onload=function(){!i||n&&n.noRevoke||t.revokeObjectURL(i),a&&a(t.scale(c,n))},t.isInstanceOf("Blob",e)||t.isInstanceOf("File",e))r=i=t.createObjectURL(e),c._type=e.type;else{if("string"!=typeof e)return!1;r=e,n&&n.crossOrigin&&(c.crossOrigin=n.crossOrigin)}return r?(c.src=r,c):t.readFile(e,function(e){var t=e.target;t&&t.result?c.src=t.result:a&&a(e)})},a=window.createObjectURL&&window||window.URL&&URL.revokeObjectURL&&URL||window.webkitURL&&webkitURL;t.isInstanceOf=function(e,t){return Object.prototype.toString.call(t)==="[object "+e+"]"},t.detectSubsampling=function(e){var t,a,n=e.width,r=e.height;return n*r>1048576?(t=document.createElement("canvas"),t.width=t.height=1,a=t.getContext("2d"),a.drawImage(e,-n+1,0),0===a.getImageData(0,0,1,1).data[3]):!1},t.detectVerticalSquash=function(e,t){var a,n,r,i,c,o=document.createElement("canvas"),d=o.getContext("2d");for(o.width=1,o.height=t,d.drawImage(e,0,0),a=d.getImageData(0,0,1,t).data,n=0,r=t,i=t;i>n;)c=a[4*(i-1)+3],0===c?r=i:n=i,i=r+n>>1;return i/t||1},t.renderImageToCanvas=function(e,a,n,r){var i,c,o,d,g,h,s,u,l=e.width,m=e.height,f=a.getContext("2d"),w=1024,v=document.createElement("canvas");for(f.save(),t.detectSubsampling(e)&&(l/=2,m/=2),i=t.detectVerticalSquash(e,m),v.width=v.height=w,c=v.getContext("2d"),o=Math.ceil(w*n/l),d=Math.ceil(w*r/m/i),h=0,u=0;m>u;){for(g=0,s=0;l>s;)c.clearRect(0,0,w,w),c.drawImage(e,-s,-u),f.drawImage(v,0,0,w,w,g,h,o,d),s+=w,g+=o;u+=w,h+=d}f.restore(),v=c=null},t.scale=function(e,a){a=a||{};var n=document.createElement("canvas"),r=e.width,i=e.height,c=Math.max((a.minWidth||r)/r,(a.minHeight||i)/i);return c>1&&(r=Math.ceil(r*c),i=Math.ceil(i*c)),c=Math.min((a.maxWidth||r)/r,(a.maxHeight||i)/i),1>c&&(r=Math.ceil(r*c),i=Math.ceil(i*c)),e.getContext||a.canvas&&n.getContext?(n.width=r,n.height=i,"image/jpeg"===e._type?t.renderImageToCanvas(e,n,r,i):n.getContext("2d").drawImage(e,0,0,r,i),n):(e.width=r,e.height=i,e)},t.createObjectURL=function(e){return a?a.createObjectURL(e):!1},t.revokeObjectURL=function(e){return a?a.revokeObjectURL(e):!1},t.readFile=function(e,t){if(window.FileReader&&FileReader.prototype.readAsDataURL){var a=new FileReader;return a.onload=a.onerror=t,a.readAsDataURL(e),a}return!1},"function"==typeof define&&define.amd?define(function(){return t}):e.loadImage=t})(this); -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/select2/select2-spinner.gif -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/select2/select2.png -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_de.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 German translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; }, 11 | formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; }, 12 | formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse..."; }, 13 | formatSearching: function () { return "Suche..."; } 14 | }); 15 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_es.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Spanish translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "No se encontraron resultados"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor adicione " + n + " caracter" + (n == 1? "" : "es"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor elimine " + n + " caracter" + (n == 1? "" : "es"); }, 11 | formatSelectionTooBig: function (limit) { return "Solo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 12 | formatLoadMore: function (pageNumber) { return "Cargando más resultados..."; }, 13 | formatSearching: function () { return "Buscando..."; } 14 | }); 15 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_eu.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Basque translation. 3 | * 4 | * Author: Julen Ruiz Aizpuru 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.extend($.fn.select2.defaults, { 10 | formatNoMatches: function () { 11 | return "Ez da bat datorrenik aurkitu"; 12 | }, 13 | formatInputTooShort: function (input, min) { 14 | var n = min - input.length; 15 | if (n === 1) { 16 | return "Idatzi karaktere bat gehiago"; 17 | } else { 18 | return "Idatzi " + n + " karaktere gehiago"; 19 | } 20 | }, 21 | formatInputTooLong: function (input, max) { 22 | var n = input.length - max; 23 | if (n === 1) { 24 | return "Idatzi karaktere bat gutxiago"; 25 | } else { 26 | return "Idatzi " + n + " karaktere gutxiago"; 27 | } 28 | }, 29 | formatSelectionTooBig: function (limit) { 30 | if (limit === 1 ) { 31 | return "Elementu bakarra hauta dezakezu"; 32 | } else { 33 | return limit + " elementu hauta ditzakezu soilik"; 34 | } 35 | }, 36 | formatLoadMore: function (pageNumber) { 37 | return "Emaitza gehiago kargatzen..."; 38 | }, 39 | formatSearching: function () { 40 | return "Bilatzen..."; 41 | } 42 | }); 43 | })(jQuery); 44 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_fr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 French translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Aucun résultat trouvé"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Merci de saisir " + n + " caractère" + (n == 1? "" : "s") + " de plus"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Merci de saisir " + n + " caractère" + (n == 1? "" : "s") + " de moins"; }, 11 | formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); }, 12 | formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires..."; }, 13 | formatSearching: function () { return "Recherche en cours..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_hr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Croatian translation. 3 | * 4 | * Author: Edi Modrić 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | var specialNumbers = { 10 | 1: function(n) { return (n % 100 != 11 ? "znak" : "znakova"); }, 11 | 2: function(n) { return (n % 100 != 12 ? "znaka" : "znakova"); }, 12 | 3: function(n) { return (n % 100 != 13 ? "znaka" : "znakova"); }, 13 | 4: function(n) { return (n % 100 != 14 ? "znaka" : "znakova"); } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, { 17 | formatNoMatches: function () { return "Nema rezultata"; }, 18 | formatInputTooShort: function (input, min) { 19 | var n = min - input.length; 20 | var nMod10 = n % 10; 21 | 22 | if (nMod10 > 0 && nMod10 < 5) { 23 | return "Unesite još " + n + " " + specialNumbers[nMod10](n); 24 | } 25 | 26 | return "Unesite još " + n + " znakova"; 27 | }, 28 | formatInputTooLong: function (input, max) { 29 | var n = input.length - max; 30 | var nMod10 = n % 10; 31 | 32 | if (nMod10 > 0 && nMod10 < 5) { 33 | return "Unesite " + n + " " + specialNumbers[nMod10](n) + " manje"; 34 | } 35 | 36 | return "Unesite " + n + " znakova manje"; 37 | }, 38 | formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; }, 39 | formatLoadMore: function (pageNumber) { return "Učitavanje rezultata..."; }, 40 | formatSearching: function () { return "Pretraga..."; } 41 | }); 42 | })(jQuery); 43 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_hu.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Hungarian translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Nincs találat."; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " kerekterrel több mint kellene."; }, 11 | formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; }, 12 | formatLoadMore: function (pageNumber) { return "Töltés..."; }, 13 | formatSearching: function () { return "Keresés..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_it.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Italian translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Nessuna corrispondenza trovata"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; }, 11 | formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); }, 12 | formatLoadMore: function (pageNumber) { return "Caricamento in corso..."; }, 13 | formatSearching: function () { return "Ricerca..."; } 14 | }); 15 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_nl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Dutch translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Geen resultaten gevonden"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " meer in"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " minder in"; }, 11 | formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; }, 12 | formatLoadMore: function (pageNumber) { return "Meer resultaten laden..."; }, 13 | formatSearching: function () { return "Zoeken..."; }, 14 | }); 15 | })(jQuery); -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_pt-BR.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Brazilian Portuguese translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Nenhum resultado encontrado"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Informe " + n + " caracter" + (n == 1? "" : "es"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); }, 11 | formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 12 | formatLoadMore: function (pageNumber) { return "Carregando mais resultados..."; }, 13 | formatSearching: function () { return "Buscando..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_pt-PT.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Portuguese (Portugal) translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Nenhum resultado encontrado"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " caracter" + (n == 1 ? "" : "es"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1 ? "" : "es"); }, 11 | formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 12 | formatLoadMore: function (pageNumber) { return "A carregar mais resultados..."; }, 13 | formatSearching: function () { return "A pesquisar..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_ro.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Romanian translation. 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Nu a fost găsit nimic"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); }, 11 | formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); }, 12 | formatLoadMore: function (pageNumber) { return "Se încarcă..."; }, 13 | formatSearching: function () { return "Căutare..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_ru.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Russian translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.extend($.fn.select2.defaults, { 8 | formatNoMatches: function () { return "Совпадений не найдено"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Пожалуйста, введите еще " + n + " символ" + (n == 1 ? "" : ((n > 1)&&(n < 5) ? "а" : "ов")); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Пожалуйста, введите на " + n + " символ" + (n == 1 ? "" : ((n > 1)&&(n < 5)? "а" : "ов")) + " меньше"; }, 11 | formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit == 1 ? "" : ((limit > 1)&&(limit < 5)? "а" : "ов")); }, 12 | formatLoadMore: function (pageNumber) { return "Загрузка данных..."; }, 13 | formatSearching: function () { return "Поиск..."; } 14 | }); 15 | })(jQuery); 16 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_sk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Slovak translation. 3 | * 4 | * Author: David Vallner 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | // use text for the numbers 2 through 4 9 | var smallNumbers = { 10 | 2: function(masc) { return (masc ? "dva" : "dve"); }, 11 | 3: function() { return "tri"; }, 12 | 4: function() { return "štyri"; } 13 | } 14 | $.extend($.fn.select2.defaults, { 15 | formatNoMatches: function () { return "Nenašli sa žiadne položky"; }, 16 | formatInputTooShort: function (input, min) { 17 | var n = min - input.length; 18 | if (n == 1) { 19 | return "Prosím zadajte ešte jeden znak"; 20 | } else if (n <= 4) { 21 | return "Prosím zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; 22 | } else { 23 | return "Prosím zadajte ešte ďalších "+n+" znakov"; 24 | } 25 | }, 26 | formatInputTooLong: function (input, max) { 27 | var n = input.length - max; 28 | if (n == 1) { 29 | return "Prosím zadajte o jeden znak menej"; 30 | } else if (n <= 4) { 31 | return "Prosím zadajte o "+smallNumbers[n](true)+" znaky menej"; 32 | } else { 33 | return "Prosím zadajte o "+n+" znakov menej"; 34 | } 35 | }, 36 | formatSelectionTooBig: function (limit) { 37 | if (limit == 1) { 38 | return "Môžete zvoliť len jednu položku"; 39 | } else if (limit <= 4) { 40 | return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky"; 41 | } else { 42 | return "Môžete zvoliť najviac "+limit+" položiek"; 43 | } 44 | }, 45 | formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky..."; }, 46 | formatSearching: function () { return "Vyhľadávanie..."; } 47 | }); 48 | })(jQuery); 49 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_sv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Swedish translation. 3 | * 4 | * Author: Jens Rantil 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.extend($.fn.select2.defaults, { 10 | formatNoMatches: function () { return "Inga träffar"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; }, 13 | formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; }, 14 | formatLoadMore: function (pageNumber) { return "Laddar fler resultat..."; }, 15 | formatSearching: function () { return "Söker..."; } 16 | }); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_tr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Turkish translation. 3 | * 4 | * Author: Salim KAYABAŞI 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.extend($.fn.select2.defaults, { 10 | formatNoMatches: function () { return "Sonuç bulunamadı"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; }, 13 | formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; }, 14 | formatLoadMore: function (pageNumber) { return "Daha fazla ..."; }, 15 | formatSearching: function () { return "Aranıyor..."; } 16 | }); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_ua.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 translation. 3 | * 4 | * Author: bigmihail 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.extend($.fn.select2.defaults, { 10 | formatNoMatches: function () { return "Нічого не знайдено"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length, s = ["", "и", "ів"], p = [2,0,1,1,1,2]; return "Введіть буль ласка ще " + n + " символ" + s[ (n%100>4 && n%100<=20)? 2 : p[Math.min(n%10, 5)] ]; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max, s = ["", "и", "ів"], p = [2,0,1,1,1,2]; return "Введіть буль ласка на " + n + " символ" + s[ (n%100>4 && n%100<=20)? 2 : p[Math.min(n%10, 5)] ] + " менше"; }, 13 | formatSelectionTooBig: function (limit) {var s = ["", "и", "ів"], p = [2,0,1,1,1,2]; return "Ви можете вибрати лише " + limit + " елемент" + s[ (limit%100>4 && limit%100<=20)? 2 : p[Math.min(limit%10, 5)] ]; }, 14 | formatLoadMore: function (pageNumber) { return "Завантаження даних..."; }, 15 | formatSearching: function () { return "Пошук..."; } 16 | }); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2_locale_zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Chinese translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | $.extend($.fn.select2.defaults, { 7 | formatNoMatches: function () { return "没有找到匹配项"; }, 8 | formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";}, 9 | formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";}, 10 | formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; }, 11 | formatLoadMore: function (pageNumber) { return "加载结果中..."; }, 12 | formatSearching: function () { return "搜索中..."; } 13 | }); 14 | })(jQuery); 15 | -------------------------------------------------------------------------------- /static/xadmin/vendor/select2/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/static/xadmin/vendor/select2/select2x2.png -------------------------------------------------------------------------------- /static/xadmin/vendor/snapjs/snap.css: -------------------------------------------------------------------------------- 1 | 2 | .snap-content { 3 | position: absolute; 4 | top: 0; 5 | right: 0; 6 | bottom: 0; 7 | left: 0; 8 | width: auto; 9 | height: auto; 10 | z-index: 2; 11 | overflow: auto; 12 | -webkit-overflow-scrolling: touch; 13 | -webkit-transform: translate3d(0, 0, 0); 14 | -moz-transform: translate3d(0, 0, 0); 15 | -ms-transform: translate3d(0, 0, 0); 16 | -o-transform: translate3d(0, 0, 0); 17 | transform: translate3d(0, 0, 0); 18 | } 19 | 20 | .snap-drawers { 21 | position: absolute; 22 | top: 0; 23 | right: 0; 24 | bottom: 0; 25 | left: 0; 26 | width: auto; 27 | height: auto; 28 | } 29 | 30 | .snap-drawer { 31 | position: absolute; 32 | top: 0; 33 | right: auto; 34 | bottom: 0; 35 | left: auto; 36 | width: 265px; 37 | height: auto; 38 | overflow: auto; 39 | -webkit-overflow-scrolling: touch; 40 | -webkit-transition: width 0.3s ease; 41 | -moz-transition: width 0.3s ease; 42 | -ms-transition: width 0.3s ease; 43 | -o-transition: width 0.3s ease; 44 | transition: width 0.3s ease; 45 | } 46 | 47 | .snap-drawer-left { 48 | left: 0; 49 | z-index: 1; 50 | } 51 | 52 | .snap-drawer-right { 53 | right: 0; 54 | z-index: 1; 55 | } 56 | 57 | .snapjs-left .snap-drawer-right, 58 | .snapjs-right .snap-drawer-left { 59 | display: none; 60 | } 61 | 62 | .snapjs-expand-left .snap-drawer-left, 63 | .snapjs-expand-right .snap-drawer-right { 64 | width: 100%; 65 | } 66 | -------------------------------------------------------------------------------- /template/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | {% block title %}投票系统{% endblock %} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% block cssblock %} 21 | {% endblock %} 22 | {% block javascriptblock %} 23 | 24 | 25 | {% endblock %} 26 | 27 | 28 | 42 | {% block body %} 43 | {% endblock %} 44 | 45 |
    46 | 47 | 51 |
    52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /template/vote/activity_chart.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %} 3 | 4 | {% endblock %} 5 | {% block cssblock %} 6 | 7 | 8 | {% endblock %} 9 | {% block javascriptblock %} 10 | 11 | 12 | 13 | {% endblock %} 14 | 15 | {% block body %} 16 | 20 |

    {{activity.name}} {{voter_info.name}}投票统计

    21 | 开始时间: 22 | 23 | 结束时间; 24 | 25 | 时间间隔(分钟): 26 | 27 | 28 |
    29 | 30 | 31 |
    32 | 98 | {% endblock %} -------------------------------------------------------------------------------- /template/vote/error.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %} 3 | 4 | {% endblock %} 5 | 6 | {% block javascriptblock %} 7 | 8 | {% endblock %} 9 | 10 | {% block body %} 11 |




    12 |
    13 |
    14 | {{ error }} 15 |
    16 |
    17 | {% endblock %} -------------------------------------------------------------------------------- /template/vote/show.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %} 3 | 4 | {% endblock %} 5 | 6 | {% block javascriptblock %} 7 | 8 | {% endblock %} 9 | 10 | {% block body %} 11 |
    12 | 13 | 20 | 21 |

    排名

    22 | 23 |
    24 | 25 | 50 |
    51 | {% for item in vote_info %} 52 |
    53 |
    54 | 55 | 56 |
    57 |

    {{ item.name }}

    58 | 59 |

    编号:{{ item.vote_id }} 票数:{{ item.vote_number }}

    60 |
    61 |
    62 |
    63 | {% endfor %} 64 |
    65 | 66 | {% endblock %} -------------------------------------------------------------------------------- /template/vote/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %} 3 | 4 | {% endblock %} 5 | 6 | {% block javascriptblock %} 7 | 8 | {% endblock %} 9 | 10 | {% block body %} 11 |
    12 | 20 |

    报名页面

    21 | 22 | 28 |
    29 | {% verbatim %} 30 |
    31 | 32 |
    33 |
    34 |
    35 | 36 | 37 |
    38 |
    39 | 40 | 41 |
    42 |
    43 | 44 | 45 |
    46 |
    47 | 48 | 49 | 50 |

    请选择要上传的文件...

    51 |
    52 |

    53 | 54 |

    55 |
    56 |
    57 |
    58 | {% endverbatim %} 59 | 62 | {% verbatim %} 63 | 127 | {% endverbatim %} 128 | 129 | 130 | {% endblock %} -------------------------------------------------------------------------------- /template/vote/voter_chart.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /vote/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/vote/__init__.py -------------------------------------------------------------------------------- /vote/adminx.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import datetime 3 | from pytz import timezone 4 | 5 | import xadmin 6 | from xadmin import views 7 | 8 | from .models import VoterInfo, VoteLog, VoteActivity 9 | 10 | 11 | class MainDashboard(object): 12 | widgets = [ 13 | [ 14 | {"type": "html", "title": u"首页", "content": "

    投票管理系统

    "}, 15 | ], 16 | [ 17 | {"type": "qbutton", "title": u"快速查看", "btns": [{'model': VoterInfo}, {'model':VoteLog}]} 18 | ] 19 | ] 20 | xadmin.site.register(views.website.IndexView, MainDashboard) 21 | 22 | 23 | class BaseSetting(object): 24 | enable_themes = False 25 | use_bootswatch = True 26 | xadmin.site.register(views.BaseAdminView, BaseSetting) 27 | 28 | 29 | class GlobalSetting(object): 30 | global_search_models = [VoteLog, VoterInfo] 31 | global_models_icon = { 32 | VoteLog: 'fa fa-laptop', VoterInfo: 'fa fa-cloud' 33 | } 34 | menu_style = 'accordion' 35 | xadmin.site.register(views.CommAdminView, GlobalSetting) 36 | 37 | 38 | class VoteActivityAdmin(object): 39 | def result_link(self, instance): 40 | return '报名 排名 ' \ 41 | '图表 投票记录' % \ 42 | (str(instance.id), str(instance.id), str(instance.id), str(instance.id)) 43 | result_link.short_description = "结果" 44 | result_link.allow_tags = True 45 | result_link.is_column = True 46 | 47 | def status(self, instance): 48 | now = timezone("Asia/Shanghai").localize(datetime.datetime.now()) 49 | print now 50 | if instance.signup_start_time > now: 51 | return u"报名未开始" 52 | if instance.signup_start_time <= now and instance.vote_start_time > now: 53 | return u"正在报名" 54 | if instance.vote_start_time <= now and instance.vote_end_time > now: 55 | return u"正在投票" 56 | return u"活动结束" 57 | 58 | status.short_description = u"状态" 59 | status.is_column = True 60 | 61 | search_fields = ["name"] 62 | list_display = ["id", "name", "signup_start_time", "vote_start_time", "vote_end_time", "status", "result_link"] 63 | exclude = ["vote_id_start"] 64 | 65 | 66 | class VoterInfoAdmin(object): 67 | def my_log(self, instance): 68 | return "投票记录 图表" % (str(instance.id), str(instance.vote_activity.id), str(instance.id)) 69 | my_log.short_description = u"投票记录" 70 | my_log.allow_tags = True 71 | my_log.is_column = True 72 | 73 | list_display = ["id", "vote_activity", "name", "phone", "vote_number", "vote_id", "my_log"] 74 | list_filter = ["vote_activity"] 75 | search_fields = ["name", "phone", "address"] 76 | 77 | 78 | class VoteLogAdmin(object): 79 | list_filter = ["vote_activity", "voter_info"] 80 | list_display = ["id", "open_id", "vote_activity", "voter_info", "create_time"] 81 | search_fields = ["open_id"] 82 | 83 | 84 | xadmin.site.register(VoterInfo, VoterInfoAdmin) 85 | xadmin.site.register(VoteLog, VoteLogAdmin) 86 | xadmin.site.register(VoteActivity, VoteActivityAdmin) 87 | -------------------------------------------------------------------------------- /vote/models.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import datetime 3 | from django.db import models 4 | 5 | from weixin.models import WeixinConfig 6 | 7 | 8 | class VoteActivity(models.Model): 9 | weixin_config = models.ForeignKey(WeixinConfig, verbose_name=u"微信账号") 10 | name = models.CharField(u"活动名称", max_length=100) 11 | content = models.TextField(u"说明", blank=True, null=True) 12 | vote_id_prefix = models.CharField(u"选手编号前缀", max_length=10, blank=True, null=True) 13 | vote_id_start= models.IntegerField(default=1) 14 | signup_start_time = models.DateTimeField(u"报名开始时间") 15 | vote_start_time = models.DateTimeField(u"投票开始时间", help_text=u"也就是报名结束时间") 16 | vote_end_time = models.DateTimeField(u"投票结束时间") 17 | create_time = models.DateTimeField(u"创建时间", auto_now_add=True) 18 | 19 | class Meta: 20 | db_table = "VoteActivity" 21 | verbose_name = u"投票活动" 22 | verbose_name_plural = u"投票活动" 23 | 24 | def __unicode__(self): 25 | return self.name 26 | 27 | 28 | class VoterInfo(models.Model): 29 | vote_activity = models.ForeignKey(VoteActivity, verbose_name=u"投票活动") 30 | name = models.CharField(u"姓名", max_length=50, blank=True, null=True) 31 | phone = models.CharField(u"手机", max_length=11, blank=True, null=True) 32 | pic = models.CharField(u"图片地址", max_length=300, blank=True, null=True) 33 | address = models.CharField(u"地址", max_length=200, blank=True, null=True) 34 | 35 | vote_number = models.IntegerField(u"票数", default=0) 36 | 37 | vote_id = models.CharField(u"投票序号", help_text=u"正在进行的活动中不要有重复的", max_length=10, blank=True, null=True) 38 | is_valid = models.BooleanField(u"是否有效", help_text=u"反选代表删除,不能投票", default=True) 39 | create_time = models.DateTimeField(u"创建时间", auto_now_add=True) 40 | 41 | class Meta: 42 | db_table = "voter_info" 43 | verbose_name = u"选手信息" 44 | verbose_name_plural = u"选手信息" 45 | 46 | def __unicode__(self): 47 | return self.name 48 | 49 | def save(self, *args, **kwargs): 50 | if not self.pk: 51 | vote_id = str(self.vote_activity.vote_id_start) 52 | 53 | if self.vote_activity.vote_id_start <= 99: 54 | vote_id = "0" * (2 - len(vote_id)) + vote_id 55 | elif self.vote_activity.vote_id_start > 99 and self.activity.vote_id_start <= 9999: 56 | vote_id = "0" * (4 - len(vote_id)) + vote_id 57 | else: 58 | vote_id = "0" * (8 - len(vote_id)) + vote_id 59 | 60 | if self.vote_activity.vote_id_prefix: 61 | vote_id = self.vote_activity.vote_id_prefix + vote_id 62 | self.vote_id = vote_id 63 | self.vote_activity.vote_id_start += 1 64 | self.vote_activity.save() 65 | super(VoterInfo, self).save(*args, **kwargs) 66 | 67 | 68 | class VoteLog(models.Model): 69 | vote_activity = models.ForeignKey(VoteActivity, verbose_name=u"投票活动") 70 | create_time = models.DateTimeField(u"创建时间", default=datetime.datetime.now) 71 | open_id = models.CharField(u"openid", max_length=100) 72 | voter_info = models.ForeignKey(VoterInfo, verbose_name=u"选手信息") 73 | 74 | class Meta: 75 | db_table = "vote_log" 76 | verbose_name = u"投票记录" 77 | verbose_name_plural = u"投票记录" 78 | 79 | def __unicode__(self): 80 | return self.open_id 81 | -------------------------------------------------------------------------------- /vote/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /vote/upload_file.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import os 3 | import time 4 | import json 5 | import requests 6 | from django.http import HttpResponse 7 | from django.shortcuts import render 8 | from django.views.decorators.csrf import csrf_exempt 9 | 10 | 11 | class FileOperation(object): 12 | def __init__(self, file_content, dir_name="/", file_name=None, bucket_name="vote1"): 13 | self._file_content = file_content 14 | if not file_name: 15 | self._file_name = self._file_content.name 16 | else: 17 | self._file_name = file_name 18 | self._bucket_name = bucket_name 19 | self._dir_name = dir_name 20 | self._new_name = str(int(time.time())) + self._file_name 21 | self._upload_url = "https://v0.api.upyun.com/" + self._bucket_name \ 22 | + self._dir_name + self._new_name 23 | self._file_url = "http://" + self._bucket_name + ".b0.upaiyun.com" + self._dir_name + self._new_name 24 | 25 | def save(self): 26 | header = {"Mkdir": "true"} 27 | r = requests.put(self._upload_url, data=self._file_content, auth=('***', '***'), headers=header) 28 | print r.content, r.status_code 29 | return {"state": "SUCCESS", "type": "jpg", "original": self._file_name, 30 | "title": self._new_name, "url": self._file_url, "size": 1000} 31 | 32 | def get_storage_path(self): 33 | return self._dir_name + self._new_name 34 | 35 | def get_file_url(self): 36 | return self._file_url 37 | -------------------------------------------------------------------------------- /weixin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/weixin/__init__.py -------------------------------------------------------------------------------- /weixin/adminx.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import datetime 3 | from pytz import timezone 4 | 5 | import xadmin 6 | from xadmin import views 7 | 8 | from weixin_vote.config import domain 9 | from .models import WeixinConfig 10 | 11 | 12 | class WeixinConfigAdmin(object): 13 | def url(self, instance): 14 | return "http://" + domain + "/%s/" % (str(instance.id), ) 15 | url.short_description = "url" 16 | url.allow_tags = True 17 | url.is_column = True 18 | 19 | list_display = ["name", "url", "token"] 20 | save_as = True 21 | 22 | 23 | xadmin.site.register(WeixinConfig, WeixinConfigAdmin) -------------------------------------------------------------------------------- /weixin/message.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import time 3 | from .models import WeixinConfig 4 | 5 | 6 | class TextMessage(object): 7 | def __init__(self, open_id, weixin_config, text): 8 | weixin_id = WeixinConfig.objects.all()[0].weixin_id 9 | self.xml = u""" 10 | 11 | 12 | 13 | %s 14 | 15 | 16 | 17 | """ % (open_id, weixin_config.weixin_id, str(int(time.time())), text) 18 | 19 | @property 20 | def data(self): 21 | return self.xml 22 | 23 | 24 | class NewsMessage(object): 25 | def __init__(self, open_id, weixin_config, news): 26 | news_num = len(news) 27 | 28 | self.xml = u""" 29 | 30 | 31 | 32 | {2} 33 | 34 | {3} 35 | 36 | """.format(open_id, weixin_config.weixin_id, str(int(time.time())), news_num) 37 | 38 | for num in range(0, news_num): 39 | item_xml = u""" 40 | 41 | <![CDATA[{0}]]> 42 | 43 | 44 | 45 | 46 | """.format(news[num]["title"], news[num]["description"], news[num]["pic_url"], news[num]["url"]) 47 | self.xml += item_xml 48 | 49 | self.xml += u""" 50 | 51 | 52 | """ 53 | 54 | @property 55 | def data(self): 56 | return self.xml -------------------------------------------------------------------------------- /weixin/models.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import time 3 | import hashlib 4 | from django.db import models 5 | 6 | 7 | def get_token(): 8 | return hashlib.md5(str(time.time())).hexdigest()[:15] 9 | 10 | 11 | class WeixinConfig(models.Model): 12 | name = models.CharField(u"公众号名称", max_length=30) 13 | weixin_id = models.CharField(u"公众号id", max_length=30) 14 | token = models.CharField("token", default=get_token, max_length=30) 15 | forward = models.BooleanField(u"是否开启转发", help_text=u"如果开启转发,非投票编号的消息都会转发出去", default=False) 16 | forward_url = models.CharField(u"第三方平台的url", max_length=200, blank=True, null=True) 17 | forward_token = models.CharField(u"第三方平台token", max_length=100, blank=True, null=True) 18 | 19 | class Meta: 20 | db_table = "weixin_config" 21 | verbose_name = u"平台设置" 22 | verbose_name_plural = u"平台设置" 23 | 24 | def __unicode__(self): 25 | return self.name -------------------------------------------------------------------------------- /weixin/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /weixin_vote/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/virusdefender/weixin_vote/05e2fa641c8ddf6928b047966f549015ac0424c0/weixin_vote/__init__.py -------------------------------------------------------------------------------- /weixin_vote/config.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | domain = "test.tmqdu.com" -------------------------------------------------------------------------------- /weixin_vote/fake_data.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import datetime 3 | 4 | from vote.models import VoterInfo, VoteActivity 5 | from weixin.models import WeixinConfig 6 | 7 | from django.contrib.auth.models import User 8 | 9 | root = User.objects.create(username="root") 10 | root.set_password("root") 11 | root.is_superuser = True 12 | root.is_staff = True 13 | root.save() 14 | weixin_config = WeixinConfig.objects.create(name="account1", weixin_id='gh_18e1e6751caf', token="virusdefender") 15 | 16 | activity = VoteActivity.objects.create(weixin_config=weixin_config, name="test activity", 17 | signup_start_time=datetime.datetime.now() - datetime.timedelta(days=1), 18 | vote_start_time=datetime.datetime.now() + datetime.timedelta(days=1), 19 | vote_end_time=datetime.datetime.now() + datetime.timedelta(days=100)) 20 | 21 | VoterInfo.objects.create(vote_activity=activity, 22 | name="1", 23 | pic="http://vote1.b0.upaiyun.com/1423551952e7cd7b899e510fb36c1ec2d7da33c895d1430c6e.jpg") 24 | 25 | 26 | VoterInfo.objects.create(vote_activity=activity, 27 | name="2", 28 | pic="http://vote1.b0.upaiyun.com/1423551952e7cd7b899e510fb36c1ec2d7da33c895d1430c6e.jpg") -------------------------------------------------------------------------------- /weixin_vote/local_settings.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | LOG_PATH = "/Users/virusdefender/Desktop/" -------------------------------------------------------------------------------- /weixin_vote/server_settings.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | LOG_PATH = "/mnt/log/django/" -------------------------------------------------------------------------------- /weixin_vote/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import patterns, include, url 2 | 3 | import xadmin 4 | xadmin.autodiscover() 5 | 6 | urlpatterns = patterns('', 7 | # Examples: 8 | # url(r'^$', 'weixin_vote.views.home', name='home'), 9 | # url(r'^blog/', include('blog.urls')), 10 | 11 | # url(r'^admin/', include(admin.site.urls)), 12 | url(r'admin/', include(xadmin.site.urls)), 13 | 14 | url(r"^(?P\d+)/$", "weixin.views.weixin_main"), 15 | 16 | url(r"^signup/(?P\d+)/$", "vote.views.signup_page"), 17 | 18 | url(r"^show/(?P\d+)/$", "vote.views.show_page"), 19 | 20 | url(r"^upload/$", "vote.views.upload"), 21 | 22 | url(r"^chart/(?P\d+)/", "vote.views.activity_chart"), 23 | ) 24 | -------------------------------------------------------------------------------- /weixin_vote/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for weixin_vote project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "weixin_vote.settings") 12 | 13 | from django.core.wsgi import get_wsgi_application 14 | application = get_wsgi_application() 15 | --------------------------------------------------------------------------------