Team Members - Version 1.0.1

Version Description

  • SAFE UPDATE: No data loss for those upgrading from version 1.0 or higher
  • Preparing for PRO version
Download this release

Release Info

Developer spwebguy
Plugin Icon 128x128 Team Members
Version 1.0.1
Comparing to
See all releases

Version 1.0.1

Files changed (117) hide show
  1. css/tmm_custom_style.css +93 -0
  2. css/tmm_custom_style.min.css +1 -0
  3. drkfr/Gruntfile.js +39 -0
  4. drkfr/class.drkfr-meta-box.php +379 -0
  5. drkfr/classes.fields.php +1675 -0
  6. drkfr/css/dist/drkfr.css +63 -0
  7. drkfr/css/dist/drkfr.min.css +63 -0
  8. drkfr/css/legacy.css +319 -0
  9. drkfr/css/src/file.css +166 -0
  10. drkfr/css/src/generic.css +55 -0
  11. drkfr/css/src/group.css +82 -0
  12. drkfr/css/src/layout.css +57 -0
  13. drkfr/css/src/misc-fields.css +71 -0
  14. drkfr/css/src/repeatable.css +88 -0
  15. drkfr/css/src/sortable.css +40 -0
  16. drkfr/css/vendor/jquery-ui/images/animated-overlay.gif +0 -0
  17. drkfr/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  18. drkfr/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  19. drkfr/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  20. drkfr/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  21. drkfr/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  22. drkfr/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  23. drkfr/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  24. drkfr/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  25. drkfr/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  26. drkfr/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png +0 -0
  27. drkfr/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png +0 -0
  28. drkfr/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png +0 -0
  29. drkfr/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png +0 -0
  30. drkfr/css/vendor/jquery-ui/jquery-ui.css +1175 -0
  31. drkfr/css/vendor/jquery-ui/jquery-ui.min.css +5 -0
  32. drkfr/css/vendor/jquery-ui/jquery.ui.theme.css +406 -0
  33. drkfr/custom-meta-boxes.php +136 -0
  34. drkfr/fields-anywhere.php +92 -0
  35. drkfr/images/drkfr-icon-remove.png +0 -0
  36. drkfr/images/drkfr-icon-remove@2x.png +0 -0
  37. drkfr/images/wpspin-2x.gif +0 -0
  38. drkfr/images/wpspin.gif +0 -0
  39. drkfr/js/drkfr.js +315 -0
  40. drkfr/js/field-gmap.js +93 -0
  41. drkfr/js/field-wysiwyg.js +106 -0
  42. drkfr/js/field.colorpicker.js +18 -0
  43. drkfr/js/field.datetime.js +47 -0
  44. drkfr/js/field.select.js +29 -0
  45. drkfr/js/file-upload.js +129 -0
  46. drkfr/js/jquery.timePicker.min.js +20 -0
  47. drkfr/js/vendor/select2/.bower.json +25 -0
  48. drkfr/js/vendor/select2/.gitignore +2 -0
  49. drkfr/js/vendor/select2/LICENSE +18 -0
  50. drkfr/js/vendor/select2/README.md +99 -0
  51. drkfr/js/vendor/select2/bower.json +8 -0
  52. drkfr/js/vendor/select2/component.json +66 -0
  53. drkfr/js/vendor/select2/composer.json +29 -0
  54. drkfr/js/vendor/select2/package.json +20 -0
  55. drkfr/js/vendor/select2/release.sh +79 -0
  56. drkfr/js/vendor/select2/select2-bootstrap.css +87 -0
  57. drkfr/js/vendor/select2/select2-spinner.gif +0 -0
  58. drkfr/js/vendor/select2/select2.css +704 -0
  59. drkfr/js/vendor/select2/select2.jquery.json +36 -0
  60. drkfr/js/vendor/select2/select2.js +3508 -0
  61. drkfr/js/vendor/select2/select2.min.js +23 -0
  62. drkfr/js/vendor/select2/select2.png +0 -0
  63. drkfr/js/vendor/select2/select2_locale_ar.js +19 -0
  64. drkfr/js/vendor/select2/select2_locale_az.js +20 -0
  65. drkfr/js/vendor/select2/select2_locale_bg.js +20 -0
  66. drkfr/js/vendor/select2/select2_locale_ca.js +19 -0
  67. drkfr/js/vendor/select2/select2_locale_cs.js +51 -0
  68. drkfr/js/vendor/select2/select2_locale_da.js +19 -0
  69. drkfr/js/vendor/select2/select2_locale_de.js +18 -0
  70. drkfr/js/vendor/select2/select2_locale_el.js +19 -0
  71. drkfr/js/vendor/select2/select2_locale_en.js.template +20 -0
  72. drkfr/js/vendor/select2/select2_locale_es.js +17 -0
  73. drkfr/js/vendor/select2/select2_locale_et.js +19 -0
  74. drkfr/js/vendor/select2/select2_locale_eu.js +45 -0
  75. drkfr/js/vendor/select2/select2_locale_fa.js +21 -0
  76. drkfr/js/vendor/select2/select2_locale_fi.js +30 -0
  77. drkfr/js/vendor/select2/select2_locale_fr.js +18 -0
  78. drkfr/js/vendor/select2/select2_locale_gl.js +45 -0
  79. drkfr/js/vendor/select2/select2_locale_he.js +19 -0
  80. drkfr/js/vendor/select2/select2_locale_hr.js +24 -0
  81. drkfr/js/vendor/select2/select2_locale_hu.js +17 -0
  82. drkfr/js/vendor/select2/select2_locale_id.js +19 -0
  83. drkfr/js/vendor/select2/select2_locale_is.js +17 -0
  84. drkfr/js/vendor/select2/select2_locale_it.js +17 -0
  85. drkfr/js/vendor/select2/select2_locale_ja.js +17 -0
  86. drkfr/js/vendor/select2/select2_locale_ka.js +19 -0
  87. drkfr/js/vendor/select2/select2_locale_ko.js +19 -0
  88. drkfr/js/vendor/select2/select2_locale_lt.js +26 -0
  89. drkfr/js/vendor/select2/select2_locale_lv.js +19 -0
  90. drkfr/js/vendor/select2/select2_locale_mk.js +19 -0
  91. drkfr/js/vendor/select2/select2_locale_ms.js +19 -0
  92. drkfr/js/vendor/select2/select2_locale_nl.js +17 -0
  93. drkfr/js/vendor/select2/select2_locale_no.js +20 -0
  94. drkfr/js/vendor/select2/select2_locale_pl.js +25 -0
  95. drkfr/js/vendor/select2/select2_locale_pt-BR.js +17 -0
  96. drkfr/js/vendor/select2/select2_locale_pt-PT.js +17 -0
  97. drkfr/js/vendor/select2/select2_locale_ro.js +17 -0
  98. drkfr/js/vendor/select2/select2_locale_rs.js +19 -0
  99. drkfr/js/vendor/select2/select2_locale_ru.js +23 -0
  100. drkfr/js/vendor/select2/select2_locale_sk.js +50 -0
  101. drkfr/js/vendor/select2/select2_locale_sv.js +19 -0
  102. drkfr/js/vendor/select2/select2_locale_th.js +19 -0
  103. drkfr/js/vendor/select2/select2_locale_tr.js +19 -0
  104. drkfr/js/vendor/select2/select2_locale_ug-CN.js +16 -0
  105. drkfr/js/vendor/select2/select2_locale_uk.js +25 -0
  106. drkfr/js/vendor/select2/select2_locale_vi.js +20 -0
  107. drkfr/js/vendor/select2/select2_locale_zh-CN.js +16 -0
  108. drkfr/js/vendor/select2/select2_locale_zh-TW.js +16 -0
  109. drkfr/js/vendor/select2/select2x2.png +0 -0
  110. drkfr/phpunit.xml +14 -0
  111. img/links/customlink.png +0 -0
  112. img/links/facebook.png +0 -0
  113. img/links/googleplus.png +0 -0
  114. img/links/linkedin.png +0 -0
  115. img/links/twitter.png +0 -0
  116. readme.txt +76 -0
  117. tmm.php +305 -0
css/tmm_custom_style.css ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+ .tmm_wrap {width:100%; margin-bottom:30px; text-align:center;}
3
+ .clearer {clear:both;}
4
+
5
+ .tmm_member {
6
+ margin-top:100px;
7
+ height:auto;
8
+ float: left;
9
+ text-align:center;
10
+ border-bottom:1px solid whitesmoke;
11
+ -webkit-box-shadow: 1px 0px 5px 0px rgba(0,0,0,0.05);
12
+ -moz-box-shadow: 1px 0px 5px 0px rgba(0,0,0,0.05);
13
+ box-shadow: 1px 0px 5px 0px rgba(0,0,0,0.05);
14
+ border-top:5px solid lightgrey;
15
+ border-bottom:8px solid whitesmoke;
16
+ }
17
+
18
+ .tmm_three_entries {clear:both;}
19
+
20
+ .tmm_3_columns .tmm_member {width: 31%; margin-right:1%; margin-left:1%;}
21
+ .tmm_4_columns .tmm_member {width: 23%; margin-right:1%; margin-left:1%;}
22
+
23
+ .tmm_member > img {
24
+ width:150px;
25
+ height:150px;
26
+ border:none;
27
+ -webkit-box-shadow: 2px 0px 15px 0px rgba(0,0,0,0.15);
28
+ -moz-box-shadow: 2px 0px 15px 0px rgba(0,0,0,0.15);
29
+ box-shadow: 2px 0px 15px 0px rgba(0,0,0,0.15);
30
+ border-radius:60px !important;
31
+ margin-top:-80px;
32
+ border:10px solid whitesmoke;
33
+ }
34
+
35
+ .tmm_4_columns .tmm_member > img {
36
+ width:100px;
37
+ height:100px;
38
+ margin-top:-70px;
39
+ border-radius:40px !important;
40
+ border:6px solid whitesmoke;
41
+ }
42
+
43
+ .tmm_member .tmm_textblock .tmm_scblock {padding-top:10px;}
44
+ .tmm_member .tmm_textblock {padding:10px 20px;}
45
+ .tmm_member .tmm_textblock .tmm_sociallink {clear:both; margin-bottom:20px;}
46
+ .tmm_member .tmm_textblock .tmm_sociallink img {border:none; width:24px; height:24px; box-shadow: 0 0 0 0;margin:10px 5px;}
47
+ .tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img {width:21px; height:21px; margin:6px 3px;}
48
+ .tmm_member .tmm_textblock .tmm_sociallink img:hover {opacity:0.8;}
49
+
50
+ .tmm_names {font-size:22px; margin-bottom:8px; margin-top:10px; font-weight:300; line-height:24px;}
51
+ .tmm_4_columns .tmm_names {font-size:19px;}
52
+ .tmm_fname {display:inline;}
53
+ .tmm_lname {display:inline;}
54
+ .tmm_job {font-size:14px; color:#a2a5a4; text-transform:uppercase;}
55
+ .tmm_desc {padding:10px; margin-top:19px; margin-bottom:10px; font-size:14px;}
56
+ .tmm_4_columns .tmm_desc {padding:8px; margin-top:14px; margin-bottom:8px; font-size:13px;}
57
+
58
+ /* TABLETS */
59
+ @media only screen and (min-width: 40em) and (max-width: 64.063em) {
60
+ .tmm_4_columns .tmm_member {width: 40%; margin-left:5%; margin-right:5%;}
61
+ .tmm_names {font-size:17px; margin-bottom:8px; margin-top:10px; font-weight:300; line-height:24px;}
62
+ .tmm_job {font-size:13px; color:#a2a5a4; text-transform:uppercase;}
63
+ .tmm_desc {padding:10px; margin-top:19px; margin-bottom:10px; font-size:14px; line-height:23px;}
64
+ .tmm_4_columns .tmm_desc {font-size:15px; line-height:23px;}
65
+ .tmm_3_columns .tmm_member > img {
66
+ width:100px;
67
+ height:100px;
68
+ border-radius:40px !important;
69
+ border:9px solid whitesmoke;
70
+ }
71
+ .tmm_4_columns .tmm_member > img {
72
+ width:150px;
73
+ height:150px;
74
+ border-radius:60px !important;
75
+ border:9px solid whitesmoke;
76
+ }
77
+ .tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img {width:24px; height:24px; margin:10px 5px;}
78
+ }
79
+
80
+ /* MOBILE */
81
+ @media only screen and (max-width: 40em) {
82
+ .tmm_member {width: 96%; margin:0 2%; margin-top:120px;}
83
+ .tmm_3_columns .tmm_member, .tmm_4_columns .tmm_member {width: 96%; margin:0 2%; margin-top:120px;}
84
+ .tmm_4_columns .tmm_desc {font-size:15px;}
85
+ .tmm_4_columns .tmm_member > img {
86
+ width:150px;
87
+ height:150px;
88
+ border-radius:60px !important;
89
+ border:9px solid whitesmoke;
90
+ }
91
+ .tmm_4_columns .tmm_names {font-size:22px;}
92
+ .tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img {width:24px; height:24px; margin:10px 5px;}
93
+ }
css/tmm_custom_style.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @charset "UTF-8";.tmm_wrap{width:100%;margin-bottom:30px;text-align:center}.clearer{clear:both}.tmm_member{margin-top:100px;height:auto;float:left;text-align:center;-webkit-box-shadow:1px 0 5px 0 rgba(0,0,0,.05);-moz-box-shadow:1px 0 5px 0 rgba(0,0,0,.05);box-shadow:1px 0 5px 0 rgba(0,0,0,.05);border-top:5px solid lightgrey;border-bottom:8px solid #f5f5f5}.tmm_three_entries{clear:both}.tmm_3_columns .tmm_member{width:31%;margin-right:1%;margin-left:1%}.tmm_4_columns .tmm_member{width:23%;margin-right:1%;margin-left:1%}.tmm_member>img{width:150px;height:150px;-webkit-box-shadow:2px 0 15px 0 rgba(0,0,0,.15);-moz-box-shadow:2px 0 15px 0 rgba(0,0,0,.15);box-shadow:2px 0 15px 0 rgba(0,0,0,.15);border-radius:60px!important;margin-top:-80px;border:10px solid #f5f5f5}.tmm_4_columns .tmm_member>img{width:100px;height:100px;margin-top:-70px;border-radius:40px!important;border:6px solid #f5f5f5}.tmm_member .tmm_textblock .tmm_scblock{padding-top:10px}.tmm_member .tmm_textblock{padding:10px 20px}.tmm_member .tmm_textblock .tmm_sociallink{clear:both;margin-bottom:20px}.tmm_member .tmm_textblock .tmm_sociallink img{border:none;width:24px;height:24px;box-shadow:0 0;margin:10px 5px}.tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img{width:21px;height:21px;margin:6px 3px}.tmm_member .tmm_textblock .tmm_sociallink img:hover{opacity:.8}.tmm_names{font-size:22px;margin-bottom:8px;margin-top:10px;font-weight:300;line-height:24px}.tmm_4_columns .tmm_names{font-size:19px}.tmm_fname,.tmm_lname{display:inline}.tmm_job{font-size:14px;color:#a2a5a4;text-transform:uppercase}.tmm_desc{padding:10px;margin-top:19px;margin-bottom:10px;font-size:14px}.tmm_4_columns .tmm_desc{padding:8px;margin-top:14px;margin-bottom:8px;font-size:13px}@media only screen and (min-width:40em) and (max-width:64.063em){.tmm_4_columns .tmm_member{width:40%;margin-left:5%;margin-right:5%}.tmm_names{font-size:17px;margin-bottom:8px;margin-top:10px;font-weight:300;line-height:24px}.tmm_job{font-size:13px;color:#a2a5a4;text-transform:uppercase}.tmm_desc{padding:10px;margin-top:19px;margin-bottom:10px;font-size:14px;line-height:23px}.tmm_4_columns .tmm_desc{font-size:15px;line-height:23px}.tmm_3_columns .tmm_member>img{width:100px;height:100px;border-radius:40px!important;border:9px solid #f5f5f5}.tmm_4_columns .tmm_member>img{width:150px;height:150px;border-radius:60px!important;border:9px solid #f5f5f5}.tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img{width:24px;height:24px;margin:10px 5px}}@media only screen and (max-width:40em){.tmm_3_columns .tmm_member,.tmm_4_columns .tmm_member,.tmm_member{width:96%;margin:120px 2% 0}.tmm_4_columns .tmm_desc{font-size:15px}.tmm_4_columns .tmm_member>img{width:150px;height:150px;border-radius:60px!important;border:9px solid #f5f5f5}.tmm_4_columns .tmm_names{font-size:22px}.tmm_4_columns .tmm_member .tmm_textblock .tmm_sociallink img{width:24px;height:24px;margin:10px 5px}}
drkfr/Gruntfile.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*global module:false*/
2
+ module.exports = function(grunt) {
3
+
4
+ // Project configuration.
5
+ grunt.initConfig({
6
+ // Metadata.
7
+ pkg: grunt.file.readJSON('package.json'),
8
+ banner: '/**\n' +
9
+ ' * <%= pkg.title || pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +
10
+ '<%= pkg.homepage ? " * " + pkg.homepage + "\\n" : "" %>' +
11
+ ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>;' + ' License: <%= pkg.license %>\n' +
12
+ ' */',
13
+ cssmin: {
14
+ combine: {
15
+ options: {
16
+ banner: '<%= banner %>'
17
+ },
18
+ files: {
19
+ 'css/dist/DKTBS.min.css': [
20
+ 'css/src/layout.css',
21
+ 'css/src/generic.css',
22
+ 'css/src/repeatable.css',
23
+ 'css/src/sortable.css',
24
+ 'css/src/group.css',
25
+ 'css/src/file.css',
26
+ 'css/src/misc-fields.css'
27
+ ]
28
+ }
29
+ }
30
+ }
31
+ });
32
+
33
+ // These plugins provide necessary tasks.
34
+ grunt.loadNpmTasks('grunt-contrib-cssmin');
35
+
36
+ // Default task.
37
+ grunt.registerTask('default', [ 'cssmin' ] );
38
+
39
+ };
drkfr/class.drkfr-meta-box.php ADDED
@@ -0,0 +1,379 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Create meta boxes
5
+ */
6
+ class drkfr_Meta_Box {
7
+
8
+ protected $_meta_box;
9
+ private $fields = array();
10
+
11
+ function __construct( $meta_box ) {
12
+
13
+ $this->_meta_box = $meta_box;
14
+
15
+ if ( empty( $this->_meta_box['id'] ) )
16
+ $this->_meta_box['id'] = sanitize_title( $this->_meta_box['title'] );
17
+
18
+ add_action( 'dbx_post_advanced', array( &$this, 'init_fields_for_post' ) );
19
+ add_action( 'drkfr_init_fields', array( &$this, 'init_fields' ) );
20
+
21
+ global $pagenow;
22
+
23
+ add_action( 'admin_menu', array( &$this, 'add' ) );
24
+ add_action( 'save_post', array( &$this, 'save_for_post' ) );
25
+ add_action( 'edit_attachment', array( &$this, 'save_for_post' ) );
26
+ add_action( 'drkfr_save_fields', array( &$this, 'save' ) );
27
+
28
+ add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_scripts' ) );
29
+ add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_styles' ) );
30
+
31
+ }
32
+
33
+ public function init_fields( $post_id = 0 ) {
34
+
35
+ foreach ( $this->_meta_box['fields'] as $key => $field ) {
36
+
37
+ $values = array();
38
+
39
+ $args = $field;
40
+ unset( $args['id'] );
41
+ unset( $args['type'] );
42
+ unset( $args['name'] );
43
+
44
+ $class = _drkfr_field_class_for_type( $field['type'] );
45
+
46
+ // If we are on a post edit screen - get metadata value of the field for this post
47
+ if ( $post_id ) {
48
+ $values = (array) get_post_meta( $post_id, $field['id'], false );
49
+ }
50
+
51
+ if ( class_exists( $class ) ) {
52
+ $this->fields[] = new $class( $field['id'], $field['name'], (array) $values, $args );
53
+ }
54
+
55
+ }
56
+
57
+ }
58
+
59
+ public function init_fields_for_post() {
60
+
61
+ global $post, $temp_ID;
62
+
63
+ // Get the current ID
64
+ if( isset( $_GET['post'] ) )
65
+ $post_id = $_GET['post'];
66
+
67
+ elseif( isset( $_POST['post_ID'] ) )
68
+ $post_id = $_POST['post_ID'];
69
+
70
+ elseif ( ! empty( $post->ID ) )
71
+ $post_id = $post->ID;
72
+
73
+ if ( is_page() || ! isset( $post_id ) )
74
+ return false;
75
+
76
+ $this->init_fields( (int) $post_id );
77
+
78
+ }
79
+
80
+ function enqueue_scripts() {
81
+
82
+ wp_enqueue_script( 'drkfr-scripts', trailingslashit( drkfr_URL ) . 'js/drkfr.js', array( 'jquery' ) );
83
+
84
+ wp_localize_script( 'drkfr-scripts', 'drkfrData', array(
85
+ 'strings' => array(
86
+ 'confirmDeleteField' => __( 'Are you sure you want to delete this field?', 'drkfr' )
87
+ )
88
+ ) );
89
+
90
+ foreach ( $this->fields as $field )
91
+ $field->enqueue_scripts();
92
+
93
+ }
94
+
95
+ function enqueue_styles() {
96
+
97
+ $suffix = drkfr_DEV ? '' : '.min';
98
+
99
+ if ( version_compare( get_bloginfo( 'version' ), '3.8', '>=' ) )
100
+ wp_enqueue_style( 'drkfr-styles', trailingslashit( drkfr_URL ) . "css/dist/drkfr$suffix.css" );
101
+ else
102
+ wp_enqueue_style( 'drkfr-styles', trailingslashit( drkfr_URL ) . 'css/legacy.css' );
103
+
104
+ foreach ( $this->fields as $field )
105
+ $field->enqueue_styles();
106
+
107
+ }
108
+
109
+ // Add metabox
110
+ function add() {
111
+
112
+ $this->_meta_box['context'] = empty($this->_meta_box['context']) ? 'normal' : $this->_meta_box['context'];
113
+ $this->_meta_box['priority'] = empty($this->_meta_box['priority']) ? 'low' : $this->_meta_box['priority'];
114
+
115
+ // Backwards compatablilty.
116
+ if ( isset( $this->_meta_box['show_on']['key'] ) ) {
117
+ $this->_meta_box['show_on'][ $this->_meta_box['show_on']['key'] ] = $this->_meta_box['show_on']['value'];
118
+ unset( $this->_meta_box['show_on']['key'] );
119
+ unset( $this->_meta_box['show_on']['value'] );
120
+ }
121
+
122
+ foreach ( (array) $this->_meta_box['pages'] as $page ) {
123
+ if ( $this->is_metabox_displayed() ) {
124
+ add_meta_box( $this->_meta_box['id'], $this->_meta_box['title'], array(&$this, 'show'), $page, $this->_meta_box['context'], $this->_meta_box['priority'] ) ;
125
+ }
126
+ }
127
+
128
+ }
129
+
130
+ /**
131
+ * Handle 'Show On' and 'Hide On' Filters
132
+ */
133
+ function is_metabox_displayed() {
134
+ $display = true;
135
+ $display = $this->add_for_id( $display );
136
+ $display = $this->hide_for_id( $display );
137
+ $display = $this->add_for_page_template( $display );
138
+ $display = $this->hide_for_page_template( $display );
139
+ return $display;
140
+ }
141
+
142
+ // Add drkfr for ID
143
+ function add_for_id( $display ) {
144
+
145
+ if ( ! isset( $this->_meta_box['show_on']['id'] ) ) {
146
+ return $display;
147
+ }
148
+
149
+ // Don't show drkfr if we can't identify ID of a post
150
+ $post_id = $this->get_post_id();
151
+
152
+ if ( ! isset( $post_id ) ) {
153
+ return false;
154
+ }
155
+
156
+ // If value isn't an array, turn it into one
157
+ $this->_meta_box['show_on']['id'] = ! is_array( $this->_meta_box['show_on']['id'] ) ? array( $this->_meta_box['show_on']['id'] ) : $this->_meta_box['show_on']['id'];
158
+
159
+ return in_array( $post_id, $this->_meta_box['show_on']['id'] );
160
+
161
+ }
162
+
163
+ // Hide drkfr for ID
164
+ function hide_for_id( $display ) {
165
+
166
+ if ( ! isset( $this->_meta_box['hide_on']['id'] ) ) {
167
+ return $display;
168
+ }
169
+
170
+ // Return if we can't identify ID of a post
171
+ $post_id = $this->get_post_id();
172
+ if ( ! isset( $post_id ) ) {
173
+ return $display;
174
+ }
175
+
176
+ // If value isn't an array, turn it into one
177
+ $this->_meta_box['hide_on']['id'] = ! is_array( $this->_meta_box['hide_on']['id'] ) ? array( $this->_meta_box['hide_on']['id'] ) : $this->_meta_box['hide_on']['id'];
178
+
179
+ return ! in_array( $post_id, $this->_meta_box['hide_on']['id'] );
180
+
181
+ }
182
+
183
+ // Add drkfr for Page Template
184
+ function add_for_page_template( $display ) {
185
+
186
+ if ( ! isset( $this->_meta_box['show_on']['page-template'] ) ) {
187
+ return $display;
188
+ }
189
+
190
+ // Return false if we can't identify ID of a post
191
+ $post_id = $this->get_post_id();
192
+ if ( ! isset( $post_id ) ) {
193
+ return false;
194
+ }
195
+
196
+ // Get current template
197
+ $current_template = get_post_meta( $post_id, '_wp_page_template', true );
198
+
199
+ // If value isn't an array, turn it into one
200
+ $this->_meta_box['show_on']['page-template'] = ! is_array( $this->_meta_box['show_on']['page-template'] ) ? array( $this->_meta_box['show_on']['page-template'] ) : $this->_meta_box['show_on']['page-template'];
201
+
202
+ return in_array( $current_template, $this->_meta_box['show_on']['page-template'] );
203
+
204
+ }
205
+
206
+ // Hide drkfr for Page Template
207
+ function hide_for_page_template( $display ) {
208
+
209
+ if ( ! isset( $this->_meta_box['hide_on']['page-template'] ) ) {
210
+ return $display;
211
+ }
212
+
213
+ // Return $display if we can't identify ID of a post and hence its current template
214
+ $post_id = $this->get_post_id();
215
+
216
+ if ( ! isset( $post_id ) ) {
217
+ return $display;
218
+ }
219
+
220
+ // Get current template
221
+ $current_template = get_post_meta( $post_id, '_wp_page_template', true );
222
+
223
+ // If value isn't an array, turn it into one
224
+ $this->_meta_box['hide_on']['page-template'] = ! is_array( $this->_meta_box['hide_on']['page-template'] ) ? array( $this->_meta_box['hide_on']['page-template'] ) : $this->_meta_box['hide_on']['page-template'];
225
+
226
+ return ! in_array( $current_template, $this->_meta_box['hide_on']['page-template'] );
227
+
228
+ }
229
+
230
+ // display fields
231
+ function show() { ?>
232
+
233
+ <input type="hidden" name="wp_meta_box_nonce" value="<?php esc_attr_e( wp_create_nonce( basename(__FILE__) ) ); ?>" />
234
+
235
+ <?php self::layout_fields( $this->fields );
236
+
237
+ }
238
+
239
+ /**
240
+ * Layout an array of fields, depending on their 'cols' property.
241
+ *
242
+ * This is a static method so other fields can use it that rely on sub fields
243
+ *
244
+ * @param drkfr_Field[] $fields
245
+ */
246
+ static function layout_fields( array $fields ) { ?>
247
+
248
+ <div class="drkfr_metabox">
249
+
250
+ <?php $current_colspan = 0;
251
+
252
+ foreach ( $fields as $field ) :
253
+
254
+ if ( $current_colspan == 0 ) : ?>
255
+
256
+ <div class="drkfr-row">
257
+
258
+ <?php endif;
259
+
260
+ $current_colspan += $field->args['cols'];
261
+
262
+ $classes = array( 'field', get_class($field) );
263
+
264
+ if ( ! empty( $field->args['repeatable'] ) )
265
+ $classes[] = 'repeatable';
266
+
267
+ if ( ! empty( $field->args['sortable'] ) )
268
+ $classes[] = 'drkfr-sortable';
269
+
270
+ $attrs = array(
271
+ sprintf( 'id="%s"', sanitize_html_class( $field->id ) ),
272
+ sprintf( 'class="%s"', esc_attr( implode(' ', array_map( 'sanitize_html_class', $classes ) ) ) )
273
+ );
274
+
275
+ // Field Repeatable Max.
276
+ if ( isset( $field->args['repeatable_max'] ) )
277
+ $attrs[] = sprintf( 'data-rep-max="%s"', intval( $field->args['repeatable_max'] ) );
278
+
279
+ ?>
280
+
281
+ <div class="drkfr-cell-<?php echo intval( $field->args['cols'] ); ?>">
282
+
283
+ <div <?php echo implode( ' ', $attrs ); ?>>
284
+ <?php $field->display(); ?>
285
+ </div>
286
+
287
+ <input type="hidden" name="_drkfr_present_<?php esc_attr_e( $field->id ); ?>" value="1" />
288
+
289
+ </div>
290
+
291
+ <?php if ( $current_colspan == 12 || $field === end( $fields ) ) :
292
+
293
+ $current_colspan = 0; ?>
294
+
295
+ </div><!-- .drkfr-row -->
296
+
297
+ <?php endif; ?>
298
+
299
+ <?php endforeach; ?>
300
+
301
+ </div>
302
+
303
+ <?php }
304
+
305
+ function strip_repeatable( $values ) {
306
+
307
+ foreach ( $values as $key => $value ) {
308
+
309
+ if ( false !== strpos( $key, 'drkfr-group-x' ) || false !== strpos( $key, 'drkfr-field-x' ) )
310
+ unset( $values[$key] );
311
+
312
+ elseif ( is_array( $value ) )
313
+ $values[$key] = $this->strip_repeatable( $value );
314
+
315
+ }
316
+
317
+ return $values;
318
+ }
319
+
320
+ // Save data from metabox
321
+ function save( $post_id = 0 ) {
322
+
323
+ // Verify nonce
324
+ if ( ! isset( $_POST['wp_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['wp_meta_box_nonce'], basename( __FILE__ ) ) )
325
+ return $post_id;
326
+
327
+ foreach ( $this->_meta_box['fields'] as $field ) {
328
+
329
+ // Verify this meta box was shown on the page
330
+ if ( ! isset( $_POST['_drkfr_present_' . $field['id'] ] ) )
331
+ continue;
332
+
333
+ if ( isset( $_POST[ $field['id'] ] ) )
334
+ $value = (array) $_POST[ $field['id'] ];
335
+ else
336
+ $value = array();
337
+
338
+ $value = $this->strip_repeatable( $value );
339
+
340
+ if ( ! $class = _drkfr_field_class_for_type( $field['type'] ) ) {
341
+ do_action( 'drkfr_save_' . $field['type'], $field, $value );
342
+ }
343
+
344
+ $field_obj = new $class( $field['id'], $field['name'], $value, $field );
345
+
346
+ $field_obj->save( $post_id, $value );
347
+
348
+ }
349
+
350
+ // If we are not on a post, need to refresh the field objects to reflect new values, as we do not get a redirect
351
+ if ( ! $post_id ) {
352
+ $this->fields = array();
353
+ $this->init_fields();
354
+ }
355
+ }
356
+
357
+ // Save the on save_post hook
358
+ function save_for_post( $post_id ) {
359
+
360
+ // check autosave
361
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
362
+ return $post_id;
363
+
364
+ $this->save( $post_id );
365
+
366
+ }
367
+
368
+ function get_post_id() {
369
+
370
+ $post_id = isset( $_GET['post'] ) ? $_GET['post'] : null;
371
+
372
+ if ( ! $post_id && isset( $_POST['post_id'] ) ) {
373
+ $post_id = $_POST['post_id'];
374
+ }
375
+
376
+ return $post_id;
377
+
378
+ }
379
+ }
drkfr/classes.fields.php ADDED
@@ -0,0 +1,1675 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Abstract class for all fields.
5
+ * Subclasses need only override html()
6
+ *
7
+ * @abstract
8
+ */
9
+ abstract class drkfr_Field {
10
+
11
+ public $value;
12
+ public $field_index = 0;
13
+
14
+ public function __construct( $name, $title, array $values, $args = array() ) {
15
+
16
+ $this->id = $name;
17
+ $this->name = $name . '[]';
18
+ $this->title = $title;
19
+ $this->args = wp_parse_args( $args, $this->get_default_args() );
20
+
21
+ // Deprecated argument: 'std'
22
+ if ( ! empty( $this->args['std'] ) && empty( $this->args['default'] ) ) {
23
+ $this->args['default'] = $this->args['std'];
24
+ _deprecated_argument( 'drkfr_Field', '0.9', "field argument 'std' is deprecated, use 'default' instead" );
25
+ }
26
+
27
+ if ( ! empty( $this->args['options'] ) && is_array( reset( $this->args['options'] ) ) ) {
28
+ $re_format = array();
29
+ foreach ( $this->args['options'] as $option ) {
30
+ $re_format[$option['value']] = $option['name'];
31
+ }
32
+ $this->args['options'] = $re_format;
33
+ }
34
+
35
+ // If the field has a custom value populator callback
36
+ if ( ! empty( $args['values_callback'] ) )
37
+ $this->values = call_user_func( $args['values_callback'], get_the_id() );
38
+ else
39
+ $this->values = $values;
40
+
41
+ $this->value = reset( $this->values );
42
+
43
+ }
44
+
45
+ /**
46
+ * Get the default args for the abstract field.
47
+ * These args are available to all fields.
48
+ *
49
+ * @return array $args
50
+ */
51
+ public function get_default_args() {
52
+ return apply_filters(
53
+ 'drkfr_field_default_args',
54
+ array(
55
+ 'desc' => '',
56
+ 'repeatable' => false,
57
+ 'sortable' => false,
58
+ 'repeatable_max' => null,
59
+ 'show_label' => false,
60
+ 'readonly' => false,
61
+ 'disabled' => false,
62
+ 'default' => '',
63
+ 'cols' => '12',
64
+ 'style' => '',
65
+ 'class' => '',
66
+ 'data_delegate' => null,
67
+ 'save_callback' => null,
68
+ 'string-repeat-field' => __( 'Add New', 'drkfr' ),
69
+ 'string-delete-field' => __( 'Remove Field', 'drkfr' ),
70
+ ),
71
+ get_class( $this )
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Enqueue all scripts required by the field.
77
+ *
78
+ * @uses wp_enqueue_script()
79
+ */
80
+ public function enqueue_scripts() {
81
+
82
+ if ( isset( $this->args['sortable'] ) && $this->args['sortable'] )
83
+ wp_enqueue_script( 'jquery-ui-sortable' );
84
+
85
+ }
86
+
87
+ /**
88
+ * Enqueue all styles required by the field.
89
+ *
90
+ * @uses wp_enqueue_style()
91
+ */
92
+ public function enqueue_styles() {}
93
+
94
+ /**
95
+ * Output the field input ID attribute.
96
+ *
97
+ * If multiple inputs are required for a single field,
98
+ * use the append parameter to add unique identifier.
99
+ *
100
+ * @param string $append
101
+ * @return null
102
+ */
103
+ public function id_attr( $append = null ) {
104
+
105
+ printf( 'id="%s"', esc_attr( $this->get_the_id_attr( $append ) ) );
106
+
107
+ }
108
+
109
+ /**
110
+ * Output the for attribute for the field.
111
+ *
112
+ *
113
+ *
114
+ * If multiple inputs are required for a single field,
115
+ * use the append parameter to add unique identifier.
116
+ *
117
+ * @param string $append
118
+ * @return null
119
+ */
120
+ public function get_the_id_attr( $append = null ) {
121
+
122
+ $id = $this->id;
123
+
124
+ if ( isset( $this->parent ) ) {
125
+ $parent_id = preg_replace( '/drkfr\-field\-(\d+|x)/', 'drkfr-group-$1', $this->parent->get_the_id_attr() );
126
+ $id = $parent_id . '[' . $id . ']';
127
+ }
128
+
129
+ $id .= '-drkfr-field-' . $this->field_index;
130
+
131
+ if ( ! is_null( $append ) )
132
+ $id .= '-' . $append;
133
+
134
+ $id = str_replace( array( '[', ']', '--' ), '-', $id );
135
+
136
+ return $id;
137
+
138
+ }
139
+
140
+ /**
141
+ * Return the field input ID attribute value.
142
+ *
143
+ * If multiple inputs are required for a single field,
144
+ * use the append parameter to add unique identifier.
145
+ *
146
+ * @param string $append
147
+ * @return string id attribute value.
148
+ */
149
+ public function for_attr( $append = null ) {
150
+
151
+ printf( 'for="%s"', esc_attr( $this->get_the_id_attr( $append ) ) );
152
+
153
+ }
154
+
155
+ public function name_attr( $append = null ) {
156
+
157
+ printf( 'name="%s"', esc_attr( $this->get_the_name_attr( $append ) ) );
158
+
159
+ }
160
+
161
+ public function get_the_name_attr( $append = null ) {
162
+
163
+ $name = str_replace( '[]', '', $this->name );
164
+
165
+ if ( isset( $this->parent ) ) {
166
+ $parent_name = preg_replace( '/drkfr\-field\-(\d+|x)/', 'drkfr-group-$1', $this->parent->get_the_name_attr() );
167
+ $name = $parent_name . '[' . $name . ']';
168
+ }
169
+
170
+ $name .= "[drkfr-field-$this->field_index]";
171
+
172
+ if ( ! is_null( $append ) )
173
+ $name .= $append;
174
+
175
+ return $name;
176
+
177
+ }
178
+
179
+ public function class_attr( $classes = '' ) {
180
+
181
+ if ( $classes = implode( ' ', array_map( 'sanitize_html_class', array_filter( array_unique( explode( ' ', $classes . ' ' . $this->args['class'] ) ) ) ) ) ) { ?>
182
+
183
+ class="<?php echo esc_attr( $classes ); ?>"
184
+
185
+ <?php }
186
+
187
+ }
188
+
189
+ /**
190
+ * Get JS Safe ID.
191
+ *
192
+ * For use as a unique field identifier in javascript.
193
+ */
194
+ public function get_js_id() {
195
+
196
+ return str_replace( array( '-', '[', ']', '--' ),'_', $this->get_the_id_attr() ); // JS friendly ID
197
+
198
+ }
199
+
200
+ public function boolean_attr( $attrs = array() ) {
201
+
202
+ if ( $this->args['readonly'] )
203
+ $attrs[] = 'readonly';
204
+
205
+ if ( $this->args['disabled'] )
206
+ $attrs[] = 'disabled';
207
+
208
+ $attrs = array_filter( array_unique( $attrs ) );
209
+
210
+ foreach ( $attrs as $attr )
211
+ echo esc_html( $attr ) . '="' . esc_attr( $attr ) . '"';
212
+
213
+ }
214
+
215
+ /**
216
+ * Check if this field has a data delegate set
217
+ *
218
+ * @return boolean
219
+ */
220
+ public function has_data_delegate() {
221
+ return (bool) $this->args['data_delegate'];
222
+ }
223
+
224
+ /**
225
+ * Get the array of data from the data delegate
226
+ *
227
+ * @return array mixed
228
+ */
229
+ protected function get_delegate_data() {
230
+
231
+ if ( $this->args['data_delegate'] )
232
+ return call_user_func_array( $this->args['data_delegate'], array( $this ) );
233
+
234
+ return array();
235
+
236
+ }
237
+
238
+ public function get_value() {
239
+ return ( $this->value || $this->value === '0' ) ? $this->value : $this->args['default'];
240
+ }
241
+
242
+ public function &get_values() {
243
+ return $this->values;
244
+ }
245
+
246
+ public function set_values( array $values ) {
247
+
248
+ $this->values = $values;
249
+
250
+ unset( $this->value );
251
+
252
+ }
253
+
254
+ public function parse_save_values() {}
255
+
256
+ public function parse_save_value() {}
257
+
258
+ /**
259
+ * @todo this surely only works for posts
260
+ * @todo why do values need to be passed in, they can already be passed in on construct
261
+ */
262
+ public function save( $post_id, $values ) {
263
+
264
+ // Don't save readonly values.
265
+ if ( $this->args['readonly'] )
266
+ return;
267
+
268
+ $this->values = $values;
269
+ $this->parse_save_values();
270
+
271
+ // Allow override from args
272
+ if ( ! empty( $this->args['save_callback'] ) ) {
273
+
274
+ call_user_func( $this->args['save_callback'], $this->values, $post_id );
275
+
276
+ return;
277
+
278
+ }
279
+
280
+ // If we are not on a post edit screen
281
+ if ( ! $post_id )
282
+ return;
283
+
284
+ delete_post_meta( $post_id, $this->id );
285
+
286
+ foreach( $this->values as $v ) {
287
+
288
+ $this->value = $v;
289
+ $this->parse_save_value();
290
+
291
+ if ( $this->value || $this->value === '0' )
292
+ add_post_meta( $post_id, $this->id, $this->value );
293
+
294
+ }
295
+ }
296
+
297
+ public function title() {
298
+
299
+ if ( $this->title ) { ?>
300
+
301
+ <div class="field-title">
302
+ <label <?php $this->for_attr(); ?>>
303
+ <?php echo esc_html( $this->title ); ?>
304
+ </label>
305
+ </div>
306
+
307
+ <?php }
308
+
309
+ }
310
+
311
+ public function description() {
312
+
313
+ if ( ! empty( $this->args['desc'] ) ) { ?>
314
+
315
+ <div class="drkfr_metabox_description">
316
+ <?php echo wp_kses_post( $this->args['desc'] ); ?>
317
+ </div>
318
+
319
+ <?php }
320
+
321
+ }
322
+
323
+ public function display() {
324
+
325
+ // If there are no values and it's not repeateble, we want to do one with empty string
326
+ if ( ! $this->get_values() && ! $this->args['repeatable'] )
327
+ $values = array( '' );
328
+ else
329
+ $values = $this->get_values();
330
+
331
+ $this->title();
332
+
333
+ $this->description();
334
+
335
+ $i = 0;
336
+ foreach ( $values as $key => $value ) {
337
+
338
+ $this->field_index = $i;
339
+ $this->value = $value; ?>
340
+
341
+ <div class="field-item" data-class="<?php echo esc_attr( get_class( $this ) ); ?>" style="position: relative; <?php echo esc_attr( $this->args['style'] ); ?>">
342
+
343
+ <?php if ( $this->args['repeatable'] ) : ?>
344
+ <button class="drkfr-delete-field" title="<?php echo esc_attr( $this->args['string-delete-field'] ); ?>">
345
+ <span class="drkfr-delete-field-icon">&times;</span>
346
+ </button>
347
+ <?php endif; ?>
348
+
349
+ <?php $this->html(); ?>
350
+
351
+ </div>
352
+
353
+ <?php
354
+
355
+ $i++;
356
+
357
+ }
358
+
359
+ // Insert a hidden one if it's repeatable
360
+ if ( $this->args['repeatable'] ) {
361
+
362
+ $this->field_index = 'x'; // x used to distinguish hidden fields.
363
+ $this->value = ''; ?>
364
+
365
+ <div class="field-item hidden" data-class="<?php echo esc_attr( get_class( $this ) ); ?>" style="position: relative; <?php echo esc_attr( $this->args['style'] ); ?>">
366
+
367
+ <?php if ( $this->args['repeatable'] ) : ?>
368
+ <button class="drkfr-delete-field" title="<?php echo esc_attr( $this->args['string-delete-field'] ); ?>">
369
+ <span class="drkfr-delete-field-icon">&times;</span>
370
+ <?php echo esc_html( $this->args['string-delete-field'] ); ?>
371
+ </button>
372
+ <?php endif; ?>
373
+
374
+ <?php $this->html(); ?>
375
+
376
+ </div>
377
+
378
+ <button class="button repeat-field"><?php echo esc_html( $this->args['string-repeat-field'] ); ?></button>
379
+
380
+ <?php }
381
+
382
+ }
383
+
384
+ }
385
+
386
+ /**
387
+ * Standard text field.
388
+ *
389
+ * @extends drkfr_Field
390
+ */
391
+ class drkfr_Text_Field extends drkfr_Field {
392
+
393
+ public function html() { ?>
394
+
395
+ <input type="text" <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr(); ?> <?php $this->name_attr(); ?> value="<?php echo esc_attr( $this->get_value() ); ?>" />
396
+
397
+ <?php }
398
+ }
399
+
400
+ class drkfr_Text_Small_Field extends drkfr_Text_Field {
401
+
402
+ public function html() {
403
+
404
+ $this->args['class'] .= ' drkfr_text_small';
405
+
406
+ parent::html();
407
+
408
+ }
409
+ }
410
+
411
+ /**
412
+ * Field for image upload / file updoad.
413
+ *
414
+ * @todo ability to set image size (preview image) from caller
415
+ */
416
+ class drkfr_File_Field extends drkfr_Field {
417
+
418
+ /**
419
+ * Return the default args for the File field.
420
+ *
421
+ * @return array $args
422
+ */
423
+ public function get_default_args() {
424
+ return array_merge(
425
+ parent::get_default_args(),
426
+ array(
427
+ 'library-type' => array( 'video', 'audio', 'text', 'application' )
428
+ )
429
+ );
430
+ }
431
+
432
+ function enqueue_scripts() {
433
+
434
+ global $post_ID;
435
+ $post_ID = isset($post_ID) ? (int) $post_ID : 0;
436
+
437
+ parent::enqueue_scripts();
438
+
439
+ wp_enqueue_media( array( 'post' => $post_ID ));
440
+ wp_enqueue_script( 'drkfr-file-upload', trailingslashit( drkfr_URL ) . 'js/file-upload.js', array( 'jquery', 'drkfr-scripts' ) );
441
+
442
+ }
443
+
444
+ public function html() {
445
+
446
+ if ( $this->get_value() ) {
447
+ $src = wp_mime_type_icon( $this->get_value() );
448
+ $size = getimagesize( str_replace( site_url(), ABSPATH, $src ) );
449
+ $icon_img = '<img src="' . $src . '" ' . $size[3] . ' />';
450
+ }
451
+
452
+ $data_type = ( ! empty( $this->args['library-type'] ) ? implode( ',', $this->args['library-type'] ) : null );
453
+
454
+ ?>
455
+
456
+ <div class="drkfr-file-wrap" <?php echo 'data-type="' . esc_attr( $data_type ) . '"'; ?>>
457
+
458
+ <div class="drkfr-file-wrap-placeholder"></div>
459
+
460
+ <button class="button drkfr-file-upload <?php echo esc_attr( $this->get_value() ) ? 'hidden' : '' ?>">
461
+ <?php esc_html_e( 'Add File', 'drkfr' ); ?>
462
+ </button>
463
+
464
+ <div class="drkfr-file-holder type-file <?php echo $this->get_value() ? '' : 'hidden'; ?>">
465
+
466
+ <?php if ( $this->get_value() ) : ?>
467
+
468
+ <?php if ( isset( $icon_img ) ) echo $icon_img; ?>
469
+
470
+ <div class="drkfr-file-name">
471
+ <strong><?php echo esc_html( basename( get_attached_file( $this->get_value() ) ) ); ?></strong>
472
+ </div>
473
+
474
+ <?php endif; ?>
475
+
476
+ </div>
477
+
478
+ <button class="drkfr-remove-file button <?php echo $this->get_value() ? '' : 'hidden'; ?>">
479
+ <?php esc_html_e( 'Remove', 'drkfr' ); ?>
480
+ </button>
481
+
482
+ <input type="hidden"
483
+ <?php $this->class_attr( 'drkfr-file-upload-input' ); ?>
484
+ <?php $this->name_attr(); ?>
485
+ value="<?php echo esc_attr( $this->value ); ?>"
486
+ />
487
+
488
+ </div>
489
+
490
+ <?php }
491
+
492
+ }
493
+
494
+ class drkfr_Image_Field extends drkfr_File_Field {
495
+
496
+ /**
497
+ * Return the default args for the Image field.
498
+ *
499
+ * @return array $args
500
+ */
501
+ public function get_default_args() {
502
+ return array_merge(
503
+ parent::get_default_args(),
504
+ array(
505
+ 'size' => 'thumbnail',
506
+ 'library-type' => array( 'image' ),
507
+ 'show_size' => false
508
+ )
509
+ );
510
+ }
511
+
512
+ public function html() {
513
+
514
+ if ( $this->get_value() )
515
+ $image = wp_get_attachment_image_src( $this->get_value(), $this->args['size'], true );
516
+
517
+ // Convert size arg to array of width, height, crop
518
+ $size = $this->parse_image_size( $this->args['size'] );
519
+
520
+ // Inline styles
521
+ $styles = sprintf( 'width: %1$dpx; height: %2$dpx; line-height: %2$dpx', intval( $size['width'] ), intval( $size['height'] ) );
522
+ $placeholder_styles = sprintf( 'width: %dpx; height: %dpx;', intval( $size['width'] ) - 8, intval( $size['height'] ) - 8 );
523
+
524
+ $data_type = ( ! empty( $this->args['library-type'] ) ? implode( ',', $this->args['library-type'] ) : null );
525
+
526
+ ?>
527
+
528
+ <div class="drkfr-file-wrap" style="<?php echo esc_attr( $styles ); ?>" data-type="<?php echo esc_attr( $data_type ); ?>">
529
+
530
+ <div class="drkfr-file-wrap-placeholder" style="<?php echo esc_attr( $placeholder_styles ); ?>">
531
+
532
+ <?php if ( $this->args['show_size'] ) : ?>
533
+ <span class="dimensions">
534
+ <?php printf( '%dpx &times; %dpx', intval( $size['width'] ), intval( $size['height'] ) ); ?>
535
+ </span>
536
+ <?php endif; ?>
537
+
538
+ </div>
539
+
540
+ <button class="button drkfr-file-upload <?php echo esc_attr( $this->get_value() ) ? 'hidden' : '' ?>" data-nonce="<?php echo wp_create_nonce( 'drkfr-file-upload-nonce' ); ?>">
541
+ <?php esc_html_e( 'Add Image', 'drkfr' ); ?>
542
+ </button>
543
+
544
+ <div class="drkfr-file-holder type-img <?php echo $this->get_value() ? '' : 'hidden'; ?>" data-crop="<?php echo (bool) $size['crop']; ?>">
545
+
546
+ <?php if ( ! empty( $image ) ) : ?>
547
+ <img src="<?php echo esc_url( $image[0] ); ?>" width="<?php echo intval( $image[1] ); ?>" height="<?php echo intval( $image[2] ); ?>" />
548
+ <?php endif; ?>
549
+
550
+ </div>
551
+
552
+ <button class="drkfr-remove-file button <?php echo $this->get_value() ? '' : 'hidden'; ?>">
553
+ <?php esc_html_e( 'Remove', 'drkfr' ); ?>
554
+ </button>
555
+
556
+ <input type="hidden"
557
+ <?php $this->class_attr( 'drkfr-file-upload-input' ); ?>
558
+ <?php $this->name_attr(); ?>
559
+ value="<?php echo esc_attr( $this->value ); ?>"
560
+ />
561
+
562
+ </div>
563
+
564
+ <?php }
565
+
566
+ /**
567
+ * Parse the size argument to get pixel width, pixel height and crop information.
568
+ *
569
+ * @param string $size
570
+ * @return array width, height, crop
571
+ */
572
+ private function parse_image_size( $size ) {
573
+
574
+ // Handle string for built-in image sizes
575
+ if ( is_string( $size ) && in_array( $size, array( 'thumbnail', 'medium', 'large' ) ) ) {
576
+ return array(
577
+ 'width' => get_option( $size . '_size_w' ),
578
+ 'height' => get_option( $size . '_size_h' ),
579
+ 'crop' => get_option( $size . '_crop' )
580
+ );
581
+ }
582
+
583
+ // Handle string for additional image sizes
584
+ global $_wp_additional_image_sizes;
585
+ if ( is_string( $size ) && isset( $_wp_additional_image_sizes[$size] ) ) {
586
+ return array(
587
+ 'width' => $_wp_additional_image_sizes[$size]['width'],
588
+ 'height' => $_wp_additional_image_sizes[$size]['height'],
589
+ 'crop' => $_wp_additional_image_sizes[$size]['crop']
590
+ );
591
+ }
592
+
593
+ // Handle default WP size format.
594
+ if ( is_array( $size ) && isset( $size[0] ) && isset( $size[1] ) )
595
+ $size = array( 'width' => $size[0], 'height' => $size[1] );
596
+
597
+ return wp_parse_args( $size, array(
598
+ 'width' => get_option( 'thumbnail_size_w' ),
599
+ 'height' => get_option( 'thumbnail_size_h' ),
600
+ 'crop' => get_option( 'thumbnail_crop' )
601
+ ) );
602
+
603
+ }
604
+
605
+ /**
606
+ * Ajax callback for outputing an image src based on post data.
607
+ *
608
+ * @return null
609
+ */
610
+ static function request_image_ajax_callback() {
611
+
612
+ if ( ! ( isset( $_POST['nonce'] ) && wp_verify_nonce( $_POST['nonce'], 'drkfr-file-upload-nonce' ) ) )
613
+ return;
614
+
615
+ $id = intval( $_POST['id'] );
616
+
617
+ $size = array(
618
+ intval( $_POST['width'] ),
619
+ intval( $_POST['height'] ),
620
+ 'crop' => (bool) $_POST['crop']
621
+ );
622
+
623
+ $image = wp_get_attachment_image_src( $id, $size );
624
+ echo reset( $image );
625
+
626
+ die(); // this is required to return a proper result
627
+ }
628
+
629
+ }
630
+ add_action( 'wp_ajax_drkfr_request_image', array( 'drkfr_Image_Field', 'request_image_ajax_callback' ) );
631
+
632
+ /**
633
+ * Standard text meta box for a URL.
634
+ *
635
+ */
636
+ class drkfr_URL_Field extends drkfr_Field {
637
+
638
+ public function html() { ?>
639
+
640
+ <input type="text" <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_url code' ); ?> <?php $this->name_attr(); ?> value="<?php echo esc_attr( esc_url( $this->value ) ); ?>" />
641
+
642
+ <?php }
643
+ }
644
+
645
+ /**
646
+ * Date picker box.
647
+ *
648
+ */
649
+ class drkfr_Date_Field extends drkfr_Field {
650
+
651
+ public function enqueue_scripts() {
652
+
653
+ parent::enqueue_scripts();
654
+
655
+ wp_enqueue_style( 'drkfr-jquery-ui', trailingslashit( drkfr_URL ) . 'css/vendor/jquery-ui/jquery-ui.css', '1.10.3' );
656
+
657
+ wp_enqueue_script( 'drkfr-datetime', trailingslashit( drkfr_URL ) . 'js/field.datetime.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'drkfr-scripts' ) );
658
+ }
659
+
660
+ public function html() { ?>
661
+
662
+ <input <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_small drkfr_datepicker' ); ?> type="text" <?php $this->name_attr(); ?> value="<?php echo esc_attr( $this->value ); ?>" />
663
+
664
+ <?php }
665
+ }
666
+
667
+ class drkfr_Time_Field extends drkfr_Field {
668
+
669
+ public function enqueue_scripts() {
670
+
671
+ parent::enqueue_scripts();
672
+
673
+ wp_enqueue_style( 'drkfr-jquery-ui', trailingslashit( drkfr_URL ) . 'css/vendor/jquery-ui/jquery-ui.css', '1.10.3' );
674
+
675
+ wp_enqueue_script( 'drkfr-timepicker', trailingslashit( drkfr_URL ) . 'js/jquery.timePicker.min.js', array( 'jquery', 'drkfr-scripts' ) );
676
+ wp_enqueue_script( 'drkfr-datetime', trailingslashit( drkfr_URL ) . 'js/field.datetime.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'drkfr-scripts' ) );
677
+ }
678
+
679
+ public function html() { ?>
680
+
681
+ <input <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_small drkfr_timepicker' ); ?> type="text" <?php $this->name_attr(); ?> value="<?php echo esc_attr( $this->value ); ?>"/>
682
+
683
+ <?php }
684
+
685
+ }
686
+
687
+ /**
688
+ * Date picker for date only (not time) box.
689
+ *
690
+ */
691
+ class drkfr_Date_Timestamp_Field extends drkfr_Field {
692
+
693
+ public function enqueue_scripts() {
694
+
695
+ parent::enqueue_scripts();
696
+
697
+ wp_enqueue_style( 'drkfr-jquery-ui', trailingslashit( drkfr_URL ) . 'css/vendor/jquery-ui/jquery-ui.css', '1.10.3' );
698
+
699
+ wp_enqueue_script( 'drkfr-timepicker', trailingslashit( drkfr_URL ) . 'js/jquery.timePicker.min.js', array( 'jquery', 'drkfr-scripts' ) );
700
+ wp_enqueue_script( 'drkfr-datetime', trailingslashit( drkfr_URL ) . 'js/field.datetime.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'drkfr-scripts' ) );
701
+
702
+ }
703
+
704
+ public function html() { ?>
705
+
706
+ <input <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_small drkfr_datepicker' ); ?> type="text" <?php $this->name_attr(); ?> value="<?php echo $this->value ? esc_attr( date( 'm\/d\/Y', $this->value ) ) : '' ?>" />
707
+
708
+ <?php }
709
+
710
+ public function parse_save_values() {
711
+
712
+ foreach( $this->values as &$value )
713
+ $value = strtotime( $value );
714
+
715
+ sort( $this->values );
716
+
717
+ }
718
+
719
+ }
720
+
721
+ /**
722
+ * Date picker for date and time (seperate fields) box.
723
+ *
724
+ */
725
+ class drkfr_Datetime_Timestamp_Field extends drkfr_Field {
726
+
727
+ public function enqueue_scripts() {
728
+
729
+ parent::enqueue_scripts();
730
+
731
+ wp_enqueue_style( 'drkfr-jquery-ui', trailingslashit( drkfr_URL ) . 'css/vendor/jquery-ui/jquery-ui.css', '1.10.3' );
732
+
733
+ wp_enqueue_script( 'drkfr-timepicker', trailingslashit( drkfr_URL ) . 'js/jquery.timePicker.min.js', array( 'jquery', 'drkfr-scripts' ) );
734
+ wp_enqueue_script( 'drkfr-datetime', trailingslashit( drkfr_URL ) . 'js/field.datetime.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'drkfr-scripts' ) );
735
+ }
736
+
737
+ public function html() { ?>
738
+
739
+ <input <?php $this->id_attr('date'); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_small drkfr_datepicker' ); ?> type="text" <?php $this->name_attr( '[date]' ); ?> value="<?php echo $this->value ? esc_attr( date( 'm\/d\/Y', $this->value ) ) : '' ?>" />
740
+ <input <?php $this->id_attr('time'); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_text_small drkfr_timepicker' ); ?> type="text" <?php $this->name_attr( '[time]' ); ?> value="<?php echo $this->value ? esc_attr( date( 'h:i A', $this->value ) ) : '' ?>" />
741
+
742
+ <?php }
743
+
744
+ public function parse_save_values() {
745
+
746
+ // Convert all [date] and [time] values to a unix timestamp.
747
+ // If date is empty, assume delete. If time is empty, assume 00:00.
748
+ foreach( $this->values as $key => &$value ) {
749
+ if ( empty( $value['date'] ) )
750
+ unset( $this->values[$key] );
751
+ else
752
+ $value = strtotime( $value['date'] . ' ' . $value['time'] );
753
+ }
754
+
755
+ $this->values = array_filter( $this->values );
756
+ sort( $this->values );
757
+
758
+ parent::parse_save_values();
759
+
760
+ }
761
+
762
+ }
763
+
764
+ /**
765
+ * Standard text field.
766
+ *
767
+ * Args:
768
+ * - int "rows" - number of rows in the <textarea>
769
+ */
770
+ class drkfr_Textarea_Field extends drkfr_Field {
771
+
772
+ public function html() { ?>
773
+
774
+ <textarea <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr(); ?> rows="<?php echo ! empty( $this->args['rows'] ) ? esc_attr( $this->args['rows'] ) : 4; ?>" <?php $this->name_attr(); ?>><?php echo esc_html( $this->value ); ?></textarea>
775
+
776
+ <?php }
777
+
778
+ }
779
+
780
+ /**
781
+ * Code style text field.
782
+ *
783
+ * Args:
784
+ * - int "rows" - number of rows in the <textarea>
785
+ */
786
+ class drkfr_Textarea_Field_Code extends drkfr_Textarea_Field {
787
+
788
+ public function html() {
789
+
790
+ $this->args['class'] .= ' code';
791
+
792
+ parent::html();
793
+
794
+ }
795
+
796
+ }
797
+
798
+ /**
799
+ * Colour picker
800
+ *
801
+ */
802
+ class drkfr_Color_Picker extends drkfr_Field {
803
+
804
+ public function enqueue_scripts() {
805
+
806
+ parent::enqueue_scripts();
807
+
808
+ wp_enqueue_script( 'drkfr-colorpicker', trailingslashit( drkfr_URL ) . 'js/field.colorpicker.js', array( 'jquery', 'wp-color-picker', 'drkfr-scripts' ) );
809
+ wp_enqueue_style( 'wp-color-picker' );
810
+ }
811
+
812
+ public function html() { ?>
813
+
814
+ <input <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr( 'drkfr_colorpicker drkfr_text_small' ); ?> type="text" <?php $this->name_attr(); ?> value="<?php echo esc_attr( $this->get_value() ); ?>" />
815
+
816
+ <?php }
817
+
818
+ }
819
+
820
+ /**
821
+ * Standard radio field.
822
+ *
823
+ * Args:
824
+ * - bool "inline" - display the radio buttons inline
825
+ */
826
+ class drkfr_Radio_Field extends drkfr_Field {
827
+
828
+ /**
829
+ * Return the default args for the Radio input field.
830
+ *
831
+ * @return array $args
832
+ */
833
+ public function get_default_args() {
834
+ return array_merge(
835
+ parent::get_default_args(),
836
+ array(
837
+ 'options' => array(),
838
+ )
839
+ );
840
+ }
841
+
842
+ public function html() {
843
+
844
+ if ( $this->has_data_delegate() )
845
+ $this->args['options'] = $this->get_delegate_data(); ?>
846
+
847
+ <?php foreach ( $this->args['options'] as $key => $value ): ?>
848
+
849
+ <input <?php $this->id_attr( 'item-' . $key ); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr(); ?> type="radio" <?php $this->name_attr(); ?> value="<?php echo esc_attr( $key ); ?>" <?php checked( $key, $this->get_value() ); ?> />
850
+ <label <?php $this->for_attr( 'item-' . $key ); ?> style="margin-right: 20px;">
851
+ <?php echo esc_html( $value ); ?>
852
+ </label>
853
+
854
+ <?php endforeach; ?>
855
+
856
+ <?php }
857
+
858
+ }
859
+
860
+ /**
861
+ * Standard checkbox field.
862
+ *
863
+ */
864
+ class drkfr_Checkbox extends drkfr_Field {
865
+
866
+ public function title() {}
867
+
868
+ public function html() { ?>
869
+
870
+ <input <?php $this->id_attr(); ?> <?php $this->boolean_attr(); ?> <?php $this->class_attr(); ?> type="checkbox" <?php $this->name_attr(); ?> value="1" <?php checked( $this->get_value() ); ?> />
871
+ <label <?php $this->for_attr(); ?>><?php echo esc_html( $this->title ); ?></label>
872
+
873
+ <?php }
874
+
875
+ }
876
+
877
+
878
+ /**
879
+ * Standard title used as a splitter.
880
+ *
881
+ */
882
+ class drkfr_Title extends drkfr_Field {
883
+
884
+ public function title() {
885
+ ?>
886
+
887
+ <div class="field-title">
888
+ <h2 <?php $this->class_attr(); ?>>
889
+ <?php echo esc_html( $this->title ); ?>
890
+ </h2>
891
+ </div>
892
+
893
+ <?php
894
+
895
+ }
896
+
897
+ public function html() {}
898
+
899
+ }
900
+
901
+ /**
902
+ * wysiwyg field.
903
+ *
904
+ */
905
+ class drkfr_wysiwyg extends drkfr_Field {
906
+
907
+ /**
908
+ * Return the default args for the WYSIWYG field.
909
+ *
910
+ * @return array $args
911
+ */
912
+ public function get_default_args() {
913
+ return array_merge(
914
+ parent::get_default_args(),
915
+ array(
916
+ 'options' => array(),
917
+ )
918
+ );
919
+ }
920
+
921
+ function enqueue_scripts() {
922
+
923
+ parent::enqueue_scripts();
924
+
925
+ wp_enqueue_script( 'drkfr-wysiwyg', trailingslashit( drkfr_URL ) . 'js/field-wysiwyg.js', array( 'jquery', 'drkfr-scripts' ) );
926
+ }
927
+
928
+ public function html() {
929
+
930
+ $id = $this->get_the_id_attr();
931
+ $name = $this->get_the_name_attr();
932
+
933
+ $field_id = $this->get_js_id();
934
+
935
+ printf( '<div class="drkfr-wysiwyg" data-id="%s" data-name="%s" data-field-id="%s">', $id, $name, $field_id );
936
+
937
+ if ( $this->is_placeholder() ) {
938
+
939
+ // For placeholder, output the markup for the editor in a JS var.
940
+ ob_start();
941
+ $this->args['options']['textarea_name'] = 'drkfr-placeholder-name-' . $field_id;
942
+ wp_editor( '', 'drkfr-placeholder-id-' . $field_id, $this->args['options'] );
943
+ $editor = ob_get_clean();
944
+ $editor = str_replace( array( "\n", "\r" ), "", $editor );
945
+ $editor = str_replace( array( "'" ), '"', $editor );
946
+
947
+ ?>
948
+
949
+ <script>
950
+ if ( 'undefined' === typeof( drkfr_wysiwyg_editors ) )
951
+ var drkfr_wysiwyg_editors = {};
952
+ drkfr_wysiwyg_editors.<?php echo $field_id; ?> = '<?php echo $editor; ?>';
953
+ </script>
954
+
955
+ <?php
956
+
957
+ } else {
958
+
959
+ $this->args['options']['textarea_name'] = $name;
960
+ echo wp_editor( $this->get_value(), $id, $this->args['options'] );
961
+
962
+ }
963
+
964
+ echo '</div>';
965
+
966
+ }
967
+
968
+ /**
969
+ * Check if this is a placeholder field.
970
+ * Either the field itself, or because it is part of a repeatable group.
971
+ *
972
+ * @return bool
973
+ */
974
+ public function is_placeholder() {
975
+
976
+ if ( isset( $this->parent ) && ! is_int( $this->parent->field_index ) )
977
+ return true;
978
+
979
+ else return ! is_int( $this->field_index );
980
+
981
+ }
982
+
983
+ }
984
+
985
+ /**
986
+ * Standard select field.
987
+ *
988
+ * @supports "data_delegate"
989
+ * @args
990
+ * 'options' => array Array of options to show in the select, optionally use data_delegate instead
991
+ * 'allow_none' => bool Allow no option to be selected (will palce a "None" at the top of the select)
992
+ * 'multiple' => bool whether multiple can be selected
993
+ */
994
+ class drkfr_Select extends drkfr_Field {
995
+
996
+ public function __construct() {
997
+
998
+ $args = func_get_args();
999
+
1000
+ call_user_func_array( array( 'parent', '__construct' ), $args );
1001
+
1002
+ }
1003
+
1004
+ /**
1005
+ * Return the default args for the Select field.
1006
+ *
1007
+ * @return array $args
1008
+ */
1009
+ public function get_default_args() {
1010
+ return array_merge(
1011
+ parent::get_default_args(),
1012
+ array(
1013
+ 'options' => array(),
1014
+ 'multiple' => false,
1015
+ 'select2_options' => array(),
1016
+ )
1017
+ );
1018
+ }
1019
+
1020
+ public function parse_save_values(){
1021
+
1022
+ if ( isset( $this->parent ) && isset( $this->args['multiple'] ) && $this->args['multiple'] )
1023
+ $this->values = array( $this->values );
1024
+
1025
+ }
1026
+
1027
+ public function get_options() {
1028
+
1029
+ if ( $this->has_data_delegate() )
1030
+ $this->args['options'] = $this->get_delegate_data();
1031
+
1032
+ return $this->args['options'];
1033
+ }
1034
+
1035
+ public function enqueue_scripts() {
1036
+
1037
+ parent::enqueue_scripts();
1038
+
1039
+ wp_enqueue_script( 'select2', trailingslashit( drkfr_URL ) . 'js/vendor/select2/select2.js', array( 'jquery' ) );
1040
+ wp_enqueue_script( 'field-select', trailingslashit( drkfr_URL ) . 'js/field.select.js', array( 'jquery', 'select2', 'drkfr-scripts' ) );
1041
+ }
1042
+
1043
+ public function enqueue_styles() {
1044
+
1045
+ parent::enqueue_styles();
1046
+
1047
+ wp_enqueue_style( 'select2', trailingslashit( drkfr_URL ) . 'js/vendor/select2/select2.css' );
1048
+ }
1049
+
1050
+ public function html() {
1051
+
1052
+ if ( $this->has_data_delegate() )
1053
+ $this->args['options'] = $this->get_delegate_data();
1054
+
1055
+ $this->output_field();
1056
+
1057
+ $this->output_script();
1058
+
1059
+ }
1060
+
1061
+ public function output_field() {
1062
+
1063
+ $val = (array) $this->get_value();
1064
+
1065
+ $name = $this->get_the_name_attr();
1066
+ $name .= ! empty( $this->args['multiple'] ) ? '[]' : null;
1067
+
1068
+ ?>
1069
+
1070
+ <select
1071
+ <?php $this->id_attr(); ?>
1072
+ <?php $this->boolean_attr(); ?>
1073
+ <?php printf( 'name="%s"', esc_attr( $name ) ); ?>
1074
+ <?php printf( 'data-field-id="%s" ', esc_attr( $this->get_js_id() ) ); ?>
1075
+ <?php echo ! empty( $this->args['multiple'] ) ? 'multiple' : '' ?>
1076
+ <?php $this->class_attr( 'drkfr_select' ); ?>
1077
+ style="width: 100%"
1078
+ >
1079
+
1080
+ <?php if ( ! empty( $this->args['allow_none'] ) ) : ?>
1081
+ <option value=""></option>
1082
+ <?php endif; ?>
1083
+
1084
+ <?php foreach ( $this->args['options'] as $value => $name ): ?>
1085
+ <option <?php selected( in_array( $value, $val ) ) ?> value="<?php echo esc_attr( $value ); ?>"><?php echo esc_html( $name ); ?></option>
1086
+ <?php endforeach; ?>
1087
+
1088
+ </select>
1089
+
1090
+ <?php
1091
+ }
1092
+
1093
+ public function output_script() {
1094
+
1095
+ $options = wp_parse_args( $this->args['select2_options'], array(
1096
+ 'placeholder' => __( 'Type to search', 'drkfr' ),
1097
+ 'allowClear' => true,
1098
+ ) );
1099
+
1100
+ ?>
1101
+
1102
+ <script type="text/javascript">
1103
+
1104
+ (function($) {
1105
+
1106
+ var options = <?php echo json_encode( $options ); ?>
1107
+
1108
+ if ( 'undefined' === typeof( window.drkfr_select_fields ) )
1109
+ window.drkfr_select_fields = {};
1110
+
1111
+ var id = <?php echo json_encode( $this->get_js_id() ); ?>;
1112
+ window.drkfr_select_fields[id] = options;
1113
+
1114
+ })( jQuery );
1115
+
1116
+ </script>
1117
+
1118
+ <?php
1119
+ }
1120
+
1121
+ }
1122
+
1123
+ class drkfr_Taxonomy extends drkfr_Select {
1124
+
1125
+ /**
1126
+ * Return the default args for the Taxonomy select field.
1127
+ *
1128
+ * @return array $args
1129
+ */
1130
+ public function get_default_args() {
1131
+ return array_merge(
1132
+ parent::get_default_args(),
1133
+ array(
1134
+ 'taxonomy' => '',
1135
+ 'hide_empty' => false,
1136
+ )
1137
+ );
1138
+ }
1139
+
1140
+
1141
+ public function __construct() {
1142
+
1143
+ $args = func_get_args();
1144
+
1145
+ call_user_func_array( array( 'parent', '__construct' ), $args );
1146
+
1147
+ $this->args['data_delegate'] = array( $this, 'get_delegate_data' );
1148
+
1149
+ }
1150
+
1151
+ public function get_delegate_data() {
1152
+
1153
+ $terms = $this->get_terms();
1154
+
1155
+ if ( is_wp_error( $terms ) ) {
1156
+ return array();
1157
+ }
1158
+
1159
+ $term_options = array();
1160
+
1161
+ foreach ( $terms as $term )
1162
+ $term_options[$term->term_id] = $term->name;
1163
+
1164
+ return $term_options;
1165
+
1166
+ }
1167
+
1168
+ private function get_terms() {
1169
+
1170
+ return get_terms( $this->args['taxonomy'], array( 'hide_empty' => $this->args['hide_empty'] ) );
1171
+
1172
+ }
1173
+
1174
+ }
1175
+
1176
+ /**
1177
+ * Post Select field.
1178
+ *
1179
+ * @supports "data_delegate"
1180
+ * @args
1181
+ * 'options' => array Array of options to show in the select, optionally use data_delegate instead
1182
+ * 'allow_none' => bool Allow no option to be selected (will palce a "None" at the top of the select)
1183
+ * 'multiple' => bool whether multiple can be selected
1184
+ */
1185
+ class drkfr_Post_Select extends drkfr_Select {
1186
+
1187
+ public function __construct() {
1188
+
1189
+ $args = func_get_args();
1190
+
1191
+ call_user_func_array( array( 'parent', '__construct' ), $args );
1192
+
1193
+ if ( ! $this->args['use_ajax'] ) {
1194
+
1195
+ $this->args['data_delegate'] = array( $this, 'get_delegate_data' );
1196
+
1197
+ }
1198
+
1199
+ }
1200
+
1201
+ /**
1202
+ * Return the default args for the Post select field.
1203
+ *
1204
+ * @return array $args
1205
+ */
1206
+ public function get_default_args() {
1207
+ return array_merge(
1208
+ parent::get_default_args(),
1209
+ array(
1210
+ 'query' => array(),
1211
+ 'use_ajax' => false,
1212
+ 'multiple' => false,
1213
+ )
1214
+ );
1215
+ }
1216
+
1217
+ public function get_delegate_data() {
1218
+
1219
+ $data = array();
1220
+
1221
+ foreach ( $this->get_posts() as $post_id )
1222
+ $data[$post_id] = get_the_title( $post_id );
1223
+
1224
+ return $data;
1225
+
1226
+ }
1227
+
1228
+ private function get_posts() {
1229
+
1230
+ $this->args['query']['fields'] = 'ids';
1231
+ $query = new WP_Query( $this->args['query'] );
1232
+
1233
+ return isset( $query->posts ) ? $query->posts : array();
1234
+
1235
+ }
1236
+
1237
+ public function parse_save_value() {
1238
+
1239
+ // AJAX multi select2 data is submitted as a string of comma separated post IDs.
1240
+ // If empty, set to false instead of empty array to ensure the meta entry is deleted.
1241
+ if ( $this->args['use_ajax'] && $this->args['multiple'] ) {
1242
+ $this->value = ( ! empty( $this->value ) ) ? explode( ',', $this->value ) : false;
1243
+ }
1244
+
1245
+ }
1246
+
1247
+ public function output_field() {
1248
+
1249
+ // If AJAX, must use input type not standard select.
1250
+ if ( $this->args['use_ajax'] ) :
1251
+
1252
+ ?>
1253
+
1254
+ <input
1255
+ <?php $this->id_attr(); ?>
1256
+ <?php printf( 'value="%s" ', esc_attr( implode( ',' , (array) $this->value ) ) ); ?>
1257
+ <?php printf( 'name="%s"', esc_attr( $this->get_the_name_attr() ) ); ?>
1258
+ <?php printf( 'data-field-id="%s" ', esc_attr( $this->get_js_id() ) ); ?>
1259
+ <?php $this->boolean_attr(); ?>
1260
+ class="drkfr_select"
1261
+ style="width: 100%"
1262
+ />
1263
+
1264
+ <?php
1265
+
1266
+ else :
1267
+
1268
+ parent::output_field();
1269
+
1270
+ endif;
1271
+
1272
+ }
1273
+
1274
+ public function output_script() {
1275
+
1276
+ parent::output_script();
1277
+
1278
+ ?>
1279
+
1280
+ <script type="text/javascript">
1281
+
1282
+ (function($) {
1283
+
1284
+ if ( 'undefined' === typeof( window.drkfr_select_fields ) )
1285
+ return false;
1286
+
1287
+ // Get options for this field so we can modify it.
1288
+ var id = <?php echo json_encode( $this->get_js_id() ); ?>;
1289
+ var options = window.drkfr_select_fields[id];
1290
+
1291
+ <?php if ( $this->args['use_ajax'] && $this->args['multiple'] ) : ?>
1292
+ // The multiple setting is required when using ajax (because an input field is used instead of select)
1293
+ options.multiple = true;
1294
+ <?php endif; ?>
1295
+
1296
+ <?php if ( $this->args['use_ajax'] && ! empty( $this->value ) ) : ?>
1297
+
1298
+ options.initSelection = function( element, callback ) {
1299
+
1300
+ var data = [];
1301
+
1302
+ <?php if ( $this->args['multiple'] ) : ?>
1303
+
1304
+ <?php foreach ( (array) $this->value as $post_id ) : ?>
1305
+ data.push( <?php echo json_encode( array( 'id' => $post_id, 'text' => html_entity_decode( get_the_title( $post_id ) ) ) ); ?> );
1306
+ <?php endforeach; ?>
1307
+
1308
+ <?php else : ?>
1309
+
1310
+ data = <?php echo json_encode( array( 'id' => $this->value, 'text' => html_entity_decode( get_the_title( $this->get_value() ) ) ) ); ?>;
1311
+
1312
+ <?php endif; ?>
1313
+
1314
+ callback( data );
1315
+
1316
+ };
1317
+
1318
+ <?php endif; ?>
1319
+
1320
+ <?php if ( $this->args['use_ajax'] ) : ?>
1321
+
1322
+ var ajaxData = {
1323
+ action : 'drkfr_post_select',
1324
+ post_id : '<?php echo intval( get_the_id() ); ?>', // Used for user capabilty check.
1325
+ nonce : <?php echo json_encode( wp_create_nonce( 'drkfr_select_field' ) ); ?>,
1326
+ query : <?php echo json_encode( $this->args['query'] ); ?>
1327
+ };
1328
+
1329
+ options.ajax = {
1330
+ url: <?php echo json_encode( esc_url( admin_url( 'admin-ajax.php' ) ) ); ?>,
1331
+ type: 'POST',
1332
+ dataType: 'json',
1333
+ data: function( term, page ) {
1334
+ ajaxData.query.s = term;
1335
+ ajaxData.query.paged = page;
1336
+ return ajaxData;
1337
+ },
1338
+ results : function( results, page ) {
1339
+ var postsPerPage = ajaxData.query.posts_per_page = ( 'posts_per_page' in ajaxData.query ) ? ajaxData.query.posts_per_page : ( 'showposts' in ajaxData.query ) ? ajaxData.query.showposts : 10;
1340
+ var isMore = ( page * postsPerPage ) < results.total;
1341
+ return { results: results.posts, more: isMore };
1342
+ }
1343
+ }
1344
+
1345
+ <?php endif; ?>
1346
+
1347
+ })( jQuery );
1348
+
1349
+ </script>
1350
+
1351
+ <?php
1352
+ }
1353
+
1354
+ }
1355
+
1356
+ // TODO this should be in inside the class
1357
+ function drkfr_ajax_post_select() {
1358
+
1359
+ $post_id = ! empty( $_POST['post_id'] ) ? intval( $_POST['post_id'] ) : false;
1360
+ $nonce = ! empty( $_POST['nonce'] ) ? $_POST['nonce'] : false;
1361
+ $args = ! empty( $_POST['query'] ) ? $_POST['query'] : array();
1362
+
1363
+ if ( ! $nonce || ! wp_verify_nonce( $nonce, 'drkfr_select_field' ) || ! current_user_can( 'edit_post', $post_id ) ) {
1364
+ echo json_encode( array( 'total' => 0, 'posts' => array() ) );
1365
+ exit;
1366
+ }
1367
+
1368
+ $args['fields'] = 'ids'; // Only need to retrieve post IDs.
1369
+
1370
+ $query = new WP_Query( $args );
1371
+
1372
+ $json = array( 'total' => $query->found_posts, 'posts' => array() );
1373
+
1374
+ foreach ( $query->posts as $post_id ) {
1375
+ array_push( $json['posts'], array( 'id' => $post_id, 'text' => html_entity_decode( get_the_title( $post_id ) ) ) );
1376
+ }
1377
+
1378
+ echo json_encode( $json );
1379
+
1380
+ exit;
1381
+
1382
+ }
1383
+ add_action( 'wp_ajax_drkfr_post_select', 'drkfr_ajax_post_select' );
1384
+
1385
+ /**
1386
+ * Field to group child fieids
1387
+ * pass $args[fields] array for child fields
1388
+ * pass $args['repeatable'] for cloing all child fields (set)
1389
+ *
1390
+ * @todo remove global $post reference, somehow
1391
+ */
1392
+ class drkfr_Group_Field extends drkfr_Field {
1393
+
1394
+ static $added_js;
1395
+ private $fields = array();
1396
+
1397
+ function __construct() {
1398
+
1399
+ $args = func_get_args(); // you can't just put func_get_args() into a function as a parameter
1400
+ call_user_func_array( array( 'parent', '__construct' ), $args );
1401
+
1402
+ if ( ! empty( $this->args['fields'] ) ) {
1403
+ foreach ( $this->args['fields'] as $f ) {
1404
+
1405
+ $class = _drkfr_field_class_for_type( $f['type'] );
1406
+ $this->add_field( new $class( $f['id'], $f['name'], array(), $f ) );
1407
+
1408
+ }
1409
+ }
1410
+
1411
+ }
1412
+
1413
+ /**
1414
+ * Return the default args for the Group field.
1415
+ *
1416
+ * @return array $args
1417
+ */
1418
+ public function get_default_args() {
1419
+ return array_merge(
1420
+ parent::get_default_args(),
1421
+ array(
1422
+ 'fields' => array(),
1423
+ 'string-repeat-field' => __( 'Add Item', 'drkfr' ),
1424
+ 'string-delete-field' => __( 'Remove Item', 'drkfr' ),
1425
+ )
1426
+ );
1427
+ }
1428
+
1429
+ public function enqueue_scripts() {
1430
+
1431
+ parent::enqueue_scripts();
1432
+
1433
+ foreach ( $this->args['fields'] as $f ) {
1434
+ $class = _drkfr_field_class_for_type( $f['type'] );
1435
+ $field = new $class( '', '', array(), $f );
1436
+ $field->enqueue_scripts();
1437
+ }
1438
+
1439
+ }
1440
+
1441
+ public function enqueue_styles() {
1442
+
1443
+ parent::enqueue_styles();
1444
+
1445
+ foreach ( $this->args['fields'] as $f ) {
1446
+ $class = _drkfr_field_class_for_type( $f['type'] );
1447
+ $field = new $class( '', '', array(), $f );
1448
+ $field->enqueue_styles();
1449
+ }
1450
+
1451
+ }
1452
+
1453
+ public function display() {
1454
+
1455
+ global $post;
1456
+
1457
+ $field = $this->args;
1458
+ $values = $this->get_values();
1459
+
1460
+ $this->title();
1461
+ $this->description();
1462
+
1463
+ if ( ! $this->args['repeatable'] && empty( $values ) ) {
1464
+ $values = array( null );
1465
+ }
1466
+
1467
+ if ( $values ) {
1468
+
1469
+ $i = 0;
1470
+ foreach ( $values as $value ) {
1471
+
1472
+ $this->field_index = $i;
1473
+ $this->value = $value;
1474
+
1475
+ ?>
1476
+
1477
+ <div class="field-item" data-class="<?php echo esc_attr( get_class($this) ) ?>" style="<?php echo esc_attr( $this->args['style'] ); ?>">
1478
+ <?php $this->html(); ?>
1479
+ </div>
1480
+
1481
+ <?php
1482
+
1483
+ $i++;
1484
+
1485
+ }
1486
+
1487
+ }
1488
+
1489
+ if ( $this->args['repeatable'] ) {
1490
+
1491
+ $this->field_index = 'x'; // x used to distinguish hidden fields.
1492
+ $this->value = '';
1493
+
1494
+ ?>
1495
+
1496
+ <div class="field-item hidden" data-class="<?php echo esc_attr( get_class( $this ) ); ?>" style="<?php echo esc_attr( $this->args['style'] ); ?>">
1497
+ <?php $this->html(); ?>
1498
+ </div>
1499
+
1500
+ <button class="button repeat-field">
1501
+ <?php echo esc_html( $this->args['string-repeat-field'] ); ?>
1502
+ </button>
1503
+
1504
+ <?php }
1505
+
1506
+ }
1507
+
1508
+ public function html() {
1509
+
1510
+ $fields = &$this->get_fields();
1511
+ $value = $this->get_value();
1512
+
1513
+ // Reset all field values.
1514
+ foreach ( $fields as $field ) {
1515
+ $field->set_values( array() );
1516
+ }
1517
+
1518
+ // Set values for this field.
1519
+ if ( ! empty( $value ) ) {
1520
+ foreach ( $value as $field_id => $field_value ) {
1521
+ $field_value = ( ! empty( $field_value ) ) ? $field_value : array();
1522
+ if ( ! empty( $fields[$field_id] ) ) {
1523
+ $fields[$field_id]->set_values( (array) $field_value );
1524
+ }
1525
+ }
1526
+ }
1527
+
1528
+ ?>
1529
+
1530
+ <?php if ( $this->args['repeatable'] ) : ?>
1531
+ <button class="drkfr-delete-field">
1532
+ <span class="drkfr-delete-field-icon">&times;</span>
1533
+ <?php echo esc_html( $this->args['string-delete-field'] ); ?>
1534
+ </button>
1535
+ <?php endif; ?>
1536
+
1537
+ <?php drkfr_Meta_Box::layout_fields( $fields ); ?>
1538
+
1539
+ <?php }
1540
+
1541
+ public function parse_save_values() {
1542
+
1543
+ $fields = &$this->get_fields();
1544
+ $values = &$this->get_values();
1545
+
1546
+ foreach ( $values as &$group_value ) {
1547
+ foreach ( $group_value as $field_id => &$field_value ) {
1548
+
1549
+ if ( ! isset( $fields[$field_id] ) ) {
1550
+ $field_value = array();
1551
+ continue;
1552
+ }
1553
+
1554
+ $field = $fields[$field_id];
1555
+ $field->set_values( $field_value );
1556
+ $field->parse_save_values();
1557
+
1558
+ $field_value = $field->get_values();
1559
+
1560
+ // if the field is a repeatable field, store the whole array of them, if it's not repeatble,
1561
+ // just store the first (and only) one directly
1562
+ if ( ! $field->args['repeatable'] )
1563
+ $field_value = reset( $field_value );
1564
+ }
1565
+ }
1566
+
1567
+ }
1568
+
1569
+ public function add_field( drkfr_Field $field ) {
1570
+ $field->parent = $this;
1571
+ $this->fields[$field->id] = $field;
1572
+ }
1573
+
1574
+ public function &get_fields() {
1575
+ return $this->fields;
1576
+ }
1577
+
1578
+ public function set_values( array $values ) {
1579
+
1580
+ $fields = &$this->get_fields();
1581
+ $this->values = $values;
1582
+
1583
+ // Reset all field values.
1584
+ foreach ( $fields as $field ) {
1585
+ $field->set_values( array() );
1586
+ }
1587
+
1588
+ foreach ( $values as $value ) {
1589
+ foreach ( $value as $field_id => $field_value ) {
1590
+ $fields[$field_id]->set_values( (array) $field_value );
1591
+ }
1592
+ }
1593
+
1594
+ }
1595
+
1596
+ }
1597
+
1598
+
1599
+ /**
1600
+ * Google map field class for drkfr
1601
+ *
1602
+ * It enables the google places API and doesn't store the place
1603
+ * name. It only stores latitude and longitude of the selected area.
1604
+ *
1605
+ * Note
1606
+ */
1607
+ class drkfr_Gmap_Field extends drkfr_Field {
1608
+
1609
+ /**
1610
+ * Return the default args for the Map field.
1611
+ *
1612
+ * @return array $args
1613
+ */
1614
+ public function get_default_args() {
1615
+ return array_merge(
1616
+ parent::get_default_args(),
1617
+ array(
1618
+ 'field_width' => '100%',
1619
+ 'field_height' => '250px',
1620
+ 'default_lat' => '51.5073509',
1621
+ 'default_long' => '-0.12775829999998223',
1622
+ 'default_zoom' => '8',
1623
+ 'string-marker-title' => __( 'Drag to set the exact location', 'drkfr' ),
1624
+ )
1625
+ );
1626
+ }
1627
+
1628
+ public function enqueue_scripts() {
1629
+
1630
+ parent::enqueue_scripts();
1631
+
1632
+ wp_enqueue_script( 'drkfr-google-maps', '//maps.google.com/maps/api/js?sensor=true&libraries=places' );
1633
+ wp_enqueue_script( 'drkfr-google-maps-script', trailingslashit( drkfr_URL ) . 'js/field-gmap.js', array( 'jquery', 'drkfr-google-maps' ) );
1634
+
1635
+ wp_localize_script( 'drkfr-google-maps-script', 'drkfrGmaps', array(
1636
+ 'defaults' => array(
1637
+ 'latitude' => $this->args['default_lat'],
1638
+ 'longitude' => $this->args['default_long'],
1639
+ 'zoom' => $this->args['default_zoom'],
1640
+ ),
1641
+ 'strings' => array(
1642
+ 'markerTitle' => $this->args['string-marker-title']
1643
+ )
1644
+ ) );
1645
+
1646
+ }
1647
+
1648
+ public function html() {
1649
+
1650
+ // Ensure all args used are set
1651
+ $value = wp_parse_args(
1652
+ $this->get_value(),
1653
+ array( 'lat' => null, 'long' => null, 'elevation' => null )
1654
+ );
1655
+
1656
+ $style = array(
1657
+ sprintf( 'width: %s;', $this->args['field_width'] ),
1658
+ sprintf( 'height: %s;', $this->args['field_height'] ),
1659
+ 'border: 1px solid #eee;',
1660
+ 'margin-top: 8px;'
1661
+ );
1662
+
1663
+ ?>
1664
+
1665
+ <input type="text" <?php $this->class_attr( 'map-search' ); ?> <?php $this->id_attr(); ?> />
1666
+
1667
+ <div class="map" style="<?php echo esc_attr( implode( ' ', $style ) ); ?>"></div>
1668
+
1669
+ <input type="hidden" class="latitude" <?php $this->name_attr( '[lat]' ); ?> value="<?php echo esc_attr( $value['lat'] ); ?>" />
1670
+ <input type="hidden" class="longitude" <?php $this->name_attr( '[long]' ); ?> value="<?php echo esc_attr( $value['long'] ); ?>" />
1671
+ <input type="hidden" class="elevation" <?php $this->name_attr( '[elevation]' ); ?> value="<?php echo esc_attr( $value['elevation'] ); ?>" />
1672
+
1673
+ <?php
1674
+ }
1675
+ }
drkfr/css/dist/drkfr.css ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /**
3
+ * drkfr Styles
4
+ *
5
+ * This file is used for development only and is loaded when drkfr_DEV is defined as true.
6
+ * drkfr.min.css is generated by the Grunt build process.
7
+ */
8
+
9
+ @import '../src/layout.css';
10
+ @import '../src/generic.css';
11
+
12
+ /** Features **/
13
+ @import '../src/repeatable.css';
14
+ @import '../src/sortable.css';
15
+
16
+ /** Fields **/
17
+ @import '../src/group.css';
18
+ @import '../src/file.css';
19
+ @import '../src/misc-fields.css';
20
+
21
+ .drkfr_metabox .field-item {
22
+ background:white !important;
23
+ border:none !important;
24
+ }
25
+
26
+ .drkfr_metabox .drkfr-handle {
27
+ background:url('../../images/dragndrop.png') no-repeat whitesmoke !important;
28
+ border:lightgray 0px solid !important;
29
+ }
30
+
31
+ .drkfr_metabox .drkfr-delete-field {
32
+ font-size:14px !important;
33
+ padding-top: 2px !important;
34
+ padding-bottom: 4px !important;
35
+ padding-left: 28px !important;
36
+ padding-right: 12px !important;
37
+ height:32px !important;
38
+ top:7px !important;
39
+ }
40
+
41
+ .drkfr_metabox .drkfr-handle {
42
+ height:47px !important;
43
+ margin-bottom:10px !important;
44
+ }
45
+
46
+ .drkfr_metabox .field-title{
47
+ margin-top:0px;
48
+ font-size:18px;
49
+ font-weight:400;
50
+ }
51
+
52
+ .drkfr_Title h2 {
53
+ margin: 0px !important;
54
+ padding: 0px !important;
55
+ text-align: center;
56
+ font-size: 22px !important;
57
+ color: grey;
58
+ font-weight: 400 !important;
59
+ border-bottom: 5px solid whitesmoke;
60
+ padding-bottom: 9px !important;
61
+ }
62
+
63
+ .drkfr_metabox .field {border:none;}
drkfr/css/dist/drkfr.min.css ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /**
3
+ * drkfr Styles
4
+ *
5
+ * This file is used for development only and is loaded when drkfr_DEV is defined as true.
6
+ * drkfr.min.css is generated by the Grunt build process.
7
+ */
8
+
9
+ @import '../src/layout.css';
10
+ @import '../src/generic.css';
11
+
12
+ /** Features **/
13
+ @import '../src/repeatable.css';
14
+ @import '../src/sortable.css';
15
+
16
+ /** Fields **/
17
+ @import '../src/group.css';
18
+ @import '../src/file.css';
19
+ @import '../src/misc-fields.css';
20
+
21
+ .drkfr_metabox .field-item {
22
+ background:white !important;
23
+ border:none !important;
24
+ }
25
+
26
+ .drkfr_metabox .drkfr-handle {
27
+ background:url('../../images/dragndrop.png') no-repeat whitesmoke !important;
28
+ border:lightgray 0px solid !important;
29
+ }
30
+
31
+ .drkfr_metabox .drkfr-delete-field {
32
+ font-size:14px !important;
33
+ padding-top: 2px !important;
34
+ padding-bottom: 4px !important;
35
+ padding-left: 28px !important;
36
+ padding-right: 12px !important;
37
+ height:32px !important;
38
+ top:7px !important;
39
+ }
40
+
41
+ .drkfr_metabox .drkfr-handle {
42
+ height:47px !important;
43
+ margin-bottom:10px !important;
44
+ }
45
+
46
+ .drkfr_metabox .field-title{
47
+ margin-top:0px;
48
+ font-size:18px;
49
+ font-weight:400;
50
+ }
51
+
52
+ .drkfr_Title h2 {
53
+ margin: 0px !important;
54
+ padding: 0px !important;
55
+ text-align: center;
56
+ font-size: 22px !important;
57
+ color: grey;
58
+ font-weight: 400 !important;
59
+ border-bottom: 5px solid whitesmoke;
60
+ padding-bottom: 9px !important;
61
+ }
62
+
63
+ .drkfr_metabox .field {border:none;}
drkfr/css/legacy.css ADDED
@@ -0,0 +1,319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * drkfr Styling
3
+ */
4
+ .drkfr_metabox tr td, table.drkfr_metabox tr th { vertical-align: top; padding: 5px; }
5
+ .drkfr_metabox th { text-align: right; font-weight:bold;}
6
+ .drkfr_metabox th label { margin-top:5px; display:block;}
7
+ div.drkfr_metabox_description { color: #AAA; font-style: italic; margin: 0 0 8px !important;}
8
+ span.drkfr_metabox_description { color: #AAA; font-style: italic;}
9
+ .drkfr_metabox input,
10
+ .drkfr_metabox textarea { font-size:12px; padding: 5px; margin: 0; }
11
+ .drkfr_metabox input[type=text], table.drkfr_metabox textarea, table.drkfr_metabox select { width: 100%; }
12
+ .drkfr_metabox textarea.drkfr_textarea_code,
13
+ .drkfr_metabox textarea.drkfr_textarea { vertical-align: top; margin: 0; }
14
+ .drkfr_metabox textarea.drkfr_textarea_code { font-family: Consolas,Monaco,monospace; line-height: 16px; }
15
+ .drkfr_metabox input.drkfr_text_small { width: 100px; }
16
+ .drkfr_metabox input.drkfr_timepicker { width: 100px; margin-right: 0;}
17
+ .drkfr_metabox input.drkfr_text_money { width: 90px; margin-right: 15px;}
18
+ .drkfr_metabox input.drkfr_text_medium { width: 230px; margin-right: 15px;}
19
+ .drkfr_metabox input.drkfr_upload_file { width: 65%; }
20
+ .drkfr_metabox li { font-size:12px; margin: 1px 0 5px 0; line-height: 16px; }
21
+ .drkfr_metabox ul { padding-top:5px; margin: 0; }
22
+ .drkfr_metabox select { font-size:12px; margin-top: 3px;}
23
+ .drkfr_metabox input:focus, table.drkfr_metabox textarea:focus { background: #fffff8;}
24
+ .drkfr_metabox_title { margin: 0 0 5px 0; padding: 5px 0 0 0; font: italic 24px/35px Georgia,"Times New Roman","Bitstream Charter",Times,serif;}
25
+ .drkfr_radio_inline { padding: 4px 0 0 0;}
26
+ .drkfr_radio_inline_option {display: inline; padding-right: 18px;}
27
+ .drkfr_metabox input[type="radio"] { margin: 0 5px 0 0; padding: 0;}
28
+ .drkfr_metabox input[type="checkbox"] { margin: 0 5px 0 0; padding: 0;}
29
+ .drkfr_metabox .mceIframeContainer {background:#FFF;}
30
+ .drkfr_metabox .meta_mce {width:97%;}
31
+ .drkfr_metabox .meta_mce textarea {width:100%;}
32
+ .drkfr_metabox .drkfr_upload_status { margin: 10px 0 0 0;}
33
+ .drkfr_metabox .drkfr_upload_status .img_status { position: relative; }
34
+ .drkfr_metabox .drkfr_upload_status .img_status img { border:1px solid #DFDFDF; background: #FAFAFA; max-width:350px; padding: 5px; -moz-border-radius: 2px; border-radius: 2px;}
35
+ .drkfr_remove_file_button { text-indent: -9999px; background: url(../images/ico-delete.png); width: 16px; height: 16px; position: absolute; top: -5px; left: -5px;}
36
+ /* Sidebar placement adjustments */
37
+ .inner-sidebar table.drkfr_metabox input[type=text], table.drkfr_metabox textarea { width: 100%; }
38
+ .inner-sidebar table.drkfr_metabox .drkfr_upload_status .img_status img { width: 90%; }
39
+
40
+ /**
41
+ * Timepicker
42
+ */
43
+ div.time-picker { position: absolute; height: 191px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99; margin: 0; }
44
+ div.time-picker-12hours { width:6em; /* needed for IE */ }
45
+ div.time-picker ul { list-style-type: none; margin: 0; padding: 0; }
46
+ div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; }
47
+ div.time-picker li.selected { background: #0063CE; color: #fff; }
48
+
49
+ .field { margin-bottom: 8px; }
50
+ .field-title { margin-bottom: 8px; margin-top: 0; font-weight: bold; }
51
+ .field-title label { vertical-align: baseline; }
52
+ #poststuff .field-title h2 { margin: 0 !important; }
53
+
54
+ .field.repeatable .field-item {
55
+ padding-right: 25px;
56
+ margin-bottom: 8px;
57
+ }
58
+
59
+ .drkfr-delete-field {
60
+ position: absolute;
61
+ top: 6px;
62
+ right: 0;
63
+ width: 16px;
64
+ height: 16px;
65
+ padding-left: 0;
66
+ padding-right: 0;
67
+ text-indent: 26px;
68
+ overflow: hidden;
69
+ white-space: nowrap;
70
+ padding: 0;
71
+ font-size: 20px;
72
+ line-height: 20px;
73
+ text-align: center;
74
+ text-decoration: none;
75
+ color: #464646;
76
+ cursor: pointer;
77
+ border-width: 0;
78
+ border-radius: 3px;
79
+ border: 1px solid #fff;
80
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.3);
81
+ background: #f3f3f3;
82
+ background-image: -webkit-gradient(linear,left top,left bottom,from(#fefefe),to(#f4f4f4));
83
+ background-image: -webkit-linear-gradient(top,#fefefe,#f4f4f4);
84
+ background-image: -moz-linear-gradient(top,#fefefe,#f4f4f4);
85
+ background-image: -o-linear-gradient(top,#fefefe,#f4f4f4);
86
+ background-image: linear-gradient(to bottom,#fefefe,#f4f4f4);
87
+ }
88
+
89
+ .drkfr-delete-field:hover,
90
+ .drkfr-delete-field:focus,
91
+ .drkfr-delete-field:active {
92
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.6);
93
+ }
94
+
95
+ .drkfr-delete-field .drkfr-delete-field-icon {
96
+ content: ' ';
97
+ display: block;
98
+ position: absolute;
99
+ height: 8px;
100
+ width: 8px;
101
+ top: 50%;
102
+ left: 50%;
103
+ margin-top: -4px;
104
+ margin-left: -4px;
105
+ background-image: url( '../images/drkfr-icon-remove.png');
106
+ background-repeat: no-repeat;
107
+ }
108
+
109
+ @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
110
+
111
+ .drkfr-delete-field .drkfr-delete-field-icon {
112
+ background-image: url( '../images/drkfr-icon-remove@2x.png');
113
+ background-size: 8px 8px;
114
+ }
115
+
116
+ }
117
+
118
+ #poststuff .field-title h2 { margin: 0 !important; }
119
+
120
+ .field.repeatable .field-item { padding-right: 25px; margin-bottom: 8px; }
121
+ .ui-icon.delete-field { position: absolute; top: 6px; right: 0; cursor: pointer; opacity: 0.75; }
122
+ .ui-icon.delete-field:hover { opacity: 1; }
123
+ button.repeat-field { display: block !important; clear: both; }
124
+
125
+ .drkfr_Text_Small_Field.repeatable .field-item,
126
+ .drkfr_Date_Field.repeatable .field-item,
127
+ .drkfr_Time_Field.repeatable .field-item,
128
+ .drkfr_Date_Timestamp_Field.repeatable .field-item,
129
+ .drkfr_Date_Timestamp_Field.repeatable .field-item,
130
+ .drkfr_Datetime_Timestamp_Field.repeatable .field-item {
131
+ float: left; clear: both;
132
+ }
133
+ .drkfr_Datetime_Timestamp_Field input + input { margin-left: 4px; }
134
+
135
+ #poststuff .drkfr_Group_Field h2 { padding: 0; margin: 8px 5px; }
136
+ .drkfr_Group_Field.repeatable > .field-item { padding: 0 9px; margin-bottom: 16px ; border: 1px solid #DDD; background: #F9F9F9; border-radius: 3px; }
137
+
138
+ .drkfr_Group_Field.repeatable > .field-item.ui-sortable-placeholder { margin-bottom: 16px !important; }
139
+
140
+ .drkfr_Group_Field > .field-title {
141
+ margin-top: 20px;
142
+ font-size: 1.5em;
143
+ margin-top: 10px;
144
+ margin-bottom: 10px;
145
+ padding: 0 0 3px;
146
+ clear: left;
147
+ color: #464646;
148
+ font-family: "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;
149
+ font-weight: lighter;
150
+ }
151
+
152
+ .drkfr_Group_Field.repeatable > .field-item {
153
+ padding: 0 9px;
154
+ margin-bottom: 16px;
155
+ border: 1px solid #DDD;
156
+ border-radius: 3px;
157
+ }
158
+
159
+ .drkfr_Group_Field .group > .drkfr-delete-field {
160
+ top: 0;
161
+ right: -3px;
162
+ width: auto;
163
+ height: auto;
164
+ padding: 2px 5px 2px 20px;
165
+ text-indent: 0;
166
+ font-size: 12px;
167
+ line-height: 14px;
168
+ }
169
+
170
+ .drkfr_Group_Field .group > .drkfr-delete-field .drkfr-delete-field-icon {
171
+ left: 10px;
172
+ text-indent: 100%;
173
+ overflow: hidden;
174
+ }
175
+
176
+
177
+ .drkfr_File_Field .field-item,
178
+ .drkfr_Image_Field .field-item { float: left; margin: 0 8px 8px 0 !important; text-align: center; padding: 0 !important; z-index: 1; }
179
+ .drkfr-file-wrap { position: relative; overflow: hidden; width: 150px; height: 150px; line-height: 150px; }
180
+ .drkfr-file-wrap-placeholder { content: ' '; position: absolute; top: 0; left: 0; display: block; height: 142px; width: 142px; border: 4px dashed #DDD; z-index: -1; }
181
+ .drkfr-file-wrap-placeholder .dimensions { line-height: normal; position: absolute; bottom: 10px; right: 10px; font-size: 18px; font-weight: bold; opacity: 0.2;}
182
+ .drkfr-file-holder { position: relative; overflow: hidden; box-shadow: inset 0 0 15px rgba(0,0,0,0.1),inset 0 0 0 1px rgba(0,0,0,0.05); background: #eee; width: 100%; height: 100%; }
183
+ .drkfr-file-holder.type-file img { position: absolute; top: 43%; margin-top: -30px; left: 50%; margin-left: -23px; }
184
+ .drkfr-file-holder.type-img img { width: 100%; height: auto; margin-top: 0; vertical-align: top; }
185
+ .drkfr-file-holder.type-img::after { content: ''; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1); overflow: hidden; z-index: 1; }
186
+ .drkfr-file-name { position: absolute; left: 0; right: 0; bottom: 0; line-height: 1.4; overflow: hidden; max-height: 100%; word-wrap: break-word; text-align: center; font-weight: bold; background: rgba(255,255,255,0.8); box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15); }
187
+ .drkfr-file-name strong { padding: 5px 10px; display: block;}
188
+ .drkfr_File_Field .drkfr-delete-field,
189
+ .drkfr_Image_Field .drkfr-delete-field { z-index: 10; top: 10px; right: 10px; }
190
+ .drkfr_File_Field .drkfr-remove-file,
191
+ .drkfr_Image_Field .drkfr-remove-file { position: absolute; z-index: 1; top: 5px; right: 5px; }
192
+ .drkfr_File_Field.repeatable .drkfr-remove-file,
193
+ .drkfr_Image_Field.repeatable .drkfr-remove-file { display: none !important; }
194
+
195
+
196
+ .drkfr_Color_Picker .field-item { float: left; clear: both; }
197
+ .drkfr_Color_Picker .iris-picker .iris-slider-offset { width: auto; height: auto; border: none; background: transparent; margin: 0; /*top: 4px !important; bottom: 5px !important;*/ border-radius: 0; }
198
+ .drkfr_Color_Picker .iris-picker .iris-strip .ui-slider-handle { margin-bottom: 0; }
199
+ .drkfr_Color_Picker .iris-picker .iris-strip .ui-slider-handle:focus { outline: none; }
200
+
201
+ .drkfr-loading:before { content: ' '; display: block; background: url( '../images/wpspin.gif' ) no-repeat; width: 16px; height: 16px; position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; }
202
+ @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
203
+ .drkfr-loading:before { background-image: url( 'images/wpspin-2x.gif'); background-size: 16px 16px; }
204
+ }
205
+
206
+ .drkfr-sortable > .field-item {
207
+ padding-left: 16px;
208
+ }
209
+
210
+ .drkfr-sortable .drkfr-handle {
211
+ height: 100%;
212
+ width: 2px;
213
+ position: absolute;
214
+ top: 0;
215
+ left: 0;
216
+ background: transparent;
217
+ cursor: move;
218
+ border-left: 2px solid #DFDFDF;
219
+ border-right: 2px solid #DFDFDF;
220
+ }
221
+
222
+ .drkfr-sortable .drkfr-handle:after {
223
+ position: absolute;
224
+ content: ' ';
225
+ height: 100%;
226
+ width: 0;
227
+ position: absolute;
228
+ top: 0;
229
+ left: 100%;
230
+ margin-left: 4px;
231
+ background: transparent;
232
+ cursor: move;
233
+ border-left: 2px solid #DFDFDF;
234
+ }
235
+
236
+ .drkfr-sortable .ui-sortable-helper {
237
+ opacity: 0.75;
238
+ }
239
+
240
+
241
+ .drkfr-sortable .ui-sortable-helper:before {
242
+ content: ' ';
243
+ position: absolute;
244
+ width: 100%;
245
+ height: 100%;
246
+ top: -6px;
247
+ left: -6px;
248
+ background-color: #F8F8F8;
249
+ border: 1px solid #DEDEDE;
250
+ padding: 5px;
251
+ z-index: -1;
252
+ }
253
+
254
+ .drkfr-sortable .ui-sortable-placeholder {
255
+ border: 1px dashed #DDD !important;
256
+ background: transparent !important;
257
+ visibility: visible !important;
258
+ margin-bottom: 6px !important;
259
+ margin-right: 6px !important;
260
+ }
261
+
262
+ .drkfr_File_Field.drkfr-sortable .drkfr-handle,
263
+ .drkfr_Image_Field.drkfr-sortable .drkfr-handle {
264
+ background: transparent;
265
+ width: 100%;
266
+ z-index: 1;
267
+ }
268
+
269
+ .drkfr_File_Field.drkfr-sortable .drkfr-file-upload,
270
+ .drkfr_Image_Field.drkfr-sortable .drkfr-file-upload {
271
+ position: relative;
272
+ z-index: 5;
273
+ }
274
+
275
+ .drkfr_File_Field.drkfr-sortable .ui-sortable-helper:before,
276
+ .drkfr_Image_Field.drkfr-sortable .ui-sortable-helper:before {
277
+ top: 0;
278
+ left: 0;
279
+ padding: 0;
280
+ border: none;
281
+ background: #F9F9F9;
282
+ }
283
+
284
+ .drkfr_Group_Field.drkfr-sortable > .field-item {
285
+ position: relative;
286
+ padding-top: 30px;
287
+ }
288
+
289
+ .drkfr_Group_Field.drkfr-sortable > .field-item > .drkfr-handle {
290
+ top: -1px;
291
+ left: -1px;
292
+ right: -1px;
293
+ height: 30px;
294
+ width: auto;
295
+ border: 1px solid #dfdfdf;
296
+ border-radius: 3px 3px 0 0;
297
+ background: #f1f1f1;
298
+ background-image: -webkit-gradient(linear,left bottom,left top,from(#ececec),to(#f9f9f9));
299
+ background-image: -webkit-linear-gradient(bottom,#ececec,#f9f9f9);
300
+ background-image: -moz-linear-gradient(bottom,#ececec,#f9f9f9);
301
+ background-image: -o-linear-gradient(bottom,#ececec,#f9f9f9);
302
+ background-image: linear-gradient(to top,#ececec,#f9f9f9);
303
+ }
304
+
305
+ .drkfr_Group_Field.drkfr-sortable .drkfr-handle:after {
306
+ display: none;
307
+ }
308
+
309
+ .drkfr_Group_Field.drkfr-sortable .group > .drkfr-delete-field {
310
+ top: -33px;
311
+ right: -5px;
312
+ width: auto;
313
+ height: auto;
314
+ padding: 2px 5px 2px 20px;
315
+ text-indent: 0;
316
+ font-size: 12px;
317
+ line-height: 14px;
318
+ z-index: 1;
319
+ }
drkfr/css/src/file.css ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .drkfr_File_Field .field-item,
3
+ .drkfr_Image_Field .field-item {
4
+ float: left;
5
+ margin: 0 16px 16px 0 !important;
6
+ text-align: center;
7
+ padding: 0 !important;
8
+ z-index: 1;
9
+ }
10
+
11
+ .drkfr-file-wrap {
12
+ position: relative;
13
+ overflow: hidden;
14
+ width: 150px;
15
+ height: 150px;
16
+ line-height: 150px;
17
+ }
18
+
19
+ .drkfr-file-wrap-placeholder {
20
+ content: ' ';
21
+ position: absolute;
22
+ top: 0;
23
+ left: 0;
24
+ display: block;
25
+ height: 142px;
26
+ width: 142px;
27
+ border: 4px dashed #DDD;
28
+ z-index: -1;
29
+ }
30
+
31
+ .drkfr-file-wrap-placeholder .dimensions {
32
+ line-height: normal;
33
+ position: absolute;
34
+ bottom: 10px;
35
+ right: 10px;
36
+ font-size: 18px;
37
+ font-weight: bold;
38
+ opacity: 0.2;
39
+ }
40
+
41
+ .drkfr-file-holder {
42
+ position: relative;
43
+ overflow: hidden;
44
+ box-shadow: inset 0 0 15px rgba(0,0,0,0.1), inset 0 0 0 1px rgba(0,0,0,0.05);
45
+ background: #eee;
46
+ width: 100%;
47
+ height: 100%;
48
+ }
49
+
50
+ .drkfr-file-holder.type-file img {
51
+ position: absolute;
52
+ top: 43%;
53
+ margin-top: -30px;
54
+ left: 50%;
55
+ margin-left: -23px;
56
+ }
57
+
58
+ .drkfr-file-holder.type-img img {
59
+ width: 100%;
60
+ height: auto;
61
+ margin-top: 0;
62
+ vertical-align: top;
63
+ }
64
+
65
+ .drkfr-file-holder.type-img::after {
66
+ content: '';
67
+ display: block;
68
+ position: absolute;
69
+ top: 0;
70
+ left: 0;
71
+ right: 0;
72
+ bottom: 0;
73
+ box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1);
74
+ overflow: hidden;
75
+ z-index: 1;
76
+ }
77
+
78
+ .drkfr-file-name {
79
+ position: absolute;
80
+ left: 0;
81
+ right: 0;
82
+ bottom: 0;
83
+ line-height: 1.4;
84
+ overflow: hidden;
85
+ max-height: 100%;
86
+ word-wrap: break-word;
87
+ text-align: center;
88
+ font-weight: bold;
89
+ background: rgba(255,255,255,0.8);
90
+ box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15);
91
+ }
92
+
93
+ .drkfr-file-name strong {
94
+ padding: 5px 10px;
95
+ display: block;
96
+ }
97
+
98
+ .drkfr_File_Field .drkfr-delete-field,
99
+ .drkfr_Image_Field .drkfr-delete-field {
100
+ z-index: 10;
101
+ top: 10px;
102
+ right: 10px;
103
+ }
104
+
105
+ .drkfr_File_Field .drkfr-remove-file,
106
+ .drkfr_Image_Field .drkfr-remove-file {
107
+ position: absolute;
108
+ z-index: 1;
109
+ top: 5px;
110
+ right: 5px;
111
+ }
112
+
113
+ .drkfr_File_Field.repeatable .drkfr-remove-file,
114
+ .drkfr_Image_Field.repeatable .drkfr-remove-file {
115
+ display: none !important;
116
+ }
117
+
118
+ .drkfr-file-wrap .drkfr-file-upload {
119
+ vertical-align: middle;
120
+ }
121
+
122
+ .drkfr-loading::before {
123
+ content: ' ';
124
+ display: block;
125
+ background: url( '../../images/wpspin.gif' ) no-repeat;
126
+ width: 16px;
127
+ height: 16px;
128
+ position: absolute;
129
+ top: 50%;
130
+ left: 50%;
131
+ margin-top: -8px;
132
+ margin-left: -8px;
133
+ }
134
+
135
+ @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
136
+
137
+ .drkfr-loading::before {
138
+ background-image: url( '../../images/wpspin-2x.gif');
139
+ background-size: 16px 16px;
140
+ }
141
+
142
+ }
143
+
144
+ .drkfr_File_Field.drkfr-sortable .drkfr-handle,
145
+ .drkfr_Image_Field.drkfr-sortable .drkfr-handle {
146
+ border: none;
147
+ background: transparent;
148
+ height: 100%;
149
+ width: 100%;
150
+ z-index: 1;
151
+ }
152
+
153
+ .drkfr_File_Field.drkfr-sortable .drkfr-file-upload,
154
+ .drkfr_Image_Field.drkfr-sortable .drkfr-file-upload {
155
+ position: relative;
156
+ z-index: 5;
157
+ }
158
+
159
+ .drkfr_File_Field.drkfr-sortable .ui-sortable-helper:before,
160
+ .drkfr_Image_Field.drkfr-sortable .ui-sortable-helper:before {
161
+ top: 0;
162
+ left: 0;
163
+ padding: 0;
164
+ border: none;
165
+ background: #F9F9F9;
166
+ }
drkfr/css/src/generic.css ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .drkfr_metabox .field-item {
2
+ position: relative;
3
+ }
4
+
5
+ .drkfr_metabox_description {
6
+ color: #AAA;
7
+ font-style: italic;
8
+ margin: 0 0 16px !important;
9
+ }
10
+
11
+ .drkfr_metabox input[type=text],
12
+ .drkfr_metabox textarea,
13
+ .drkfr_metabox select {
14
+ width: 100%;
15
+ margin: 0;
16
+ }
17
+
18
+ .drkfr_metabox input.drkfr_text_small {
19
+ width: 100px;
20
+ }
21
+
22
+ .drkfr_metabox input.drkfr_text_medium {
23
+ width: 230px;
24
+ margin-right: 15px;
25
+ }
26
+
27
+ .drkfr_metabox input[type="radio"] {
28
+ margin: 0 5px 0 0;
29
+ padding: 0;
30
+ }
31
+
32
+ .drkfr_metabox input[type="checkbox"] {
33
+ margin: 0 5px 0 0;
34
+ padding: 0;
35
+ }
36
+
37
+ .drkfr_metabox .field-title {
38
+ margin-top: -4px;
39
+ margin-bottom: 16px;
40
+ margin-top: 0;
41
+ font-weight: bold;
42
+ }
43
+
44
+ .drkfr_metabox .field-title label {
45
+ vertical-align: baseline;
46
+ }
47
+ .drkfr_metabox .select2-search-choice-close {
48
+ -webkit-transition: none;
49
+ transition: none;
50
+ top: 3px;
51
+ }
52
+
53
+ .drkfr_metabox [disabled] {
54
+ background: #F7F7F7;
55
+ }
drkfr/css/src/group.css ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** Group **/
2
+
3
+ .drkfr_metabox .drkfr_Group_Field > .field-title {
4
+ font-size: 20px;
5
+ clear: left;
6
+ color: #222;
7
+ font-family: 'Open Sans', sans-serif;
8
+ font-weight: normal;
9
+ margin: 8px 0;
10
+ }
11
+
12
+ .drkfr_metabox .drkfr_Group_Field.repeatable > .field-title {
13
+ margin-bottom: 16px;
14
+ }
15
+
16
+ .drkfr_metabox .drkfr_Group_Field.repeatable > .field-item {
17
+ padding: 30px 10px 0;
18
+ margin-bottom: 16px;
19
+ border: 1px solid #DDD;
20
+ background: #FAFAFA;
21
+ position: relative;
22
+ }
23
+
24
+ .drkfr_metabox .drkfr_Group_Field.repeatable > .field-item:before {
25
+ content: ' ';
26
+ display: block;
27
+ position: absolute;
28
+ top: 0;
29
+ left: 0;
30
+ right: 0;
31
+ height: 33px;
32
+ border-bottom: 1px solid #DDDDDD;
33
+ }
34
+
35
+ .drkfr_metabox .drkfr_Group_Field.repeatable > .field-item > .drkfr-delete-field {
36
+ top: 5px;
37
+ right: 5px;
38
+ width: auto;
39
+ text-indent: 0;
40
+ padding-left: 24px;
41
+ padding-right: 8px;
42
+ height: 22px;
43
+ line-height: 20px;
44
+ font-size: 11px;
45
+ z-index: 1;
46
+ }
47
+
48
+ .drkfr_metabox .drkfr_Group_Field.repeatable > .field-item > .drkfr-delete-field .drkfr-delete-field-icon {
49
+ left: 12px;
50
+ }
51
+
52
+
53
+ .drkfr_Group_Field.drkfr-sortable > .field-item {
54
+ position: relative;
55
+ padding-top: 30px;
56
+ }
57
+
58
+ .drkfr_Group_Field.drkfr-sortable > .field-item > .drkfr-handle {
59
+ top: -1px;
60
+ left: -1px;
61
+ right: -1px;
62
+ height: 34px;
63
+ width: auto;
64
+ border: none;
65
+ border-bottom: 1px solid #DDDDDD;
66
+ }
67
+
68
+ .drkfr_Group_Field.drkfr-sortable > .field-item.ui-sortable-helper > .drkfr-handle {
69
+ padding: 0 5px;
70
+ }
71
+
72
+ .drkfr_metabox .drkfr_Group_Field.repeatable.drkfr-sortable > .field-item:before {
73
+ display: none !important;
74
+ }
75
+
76
+ .drkfr_Group_Field.drkfr-sortable > .ui-sortable-placeholder {
77
+ margin-bottom: 16px !important;
78
+ }
79
+
80
+ .drkfr_Group_Field .drkfr_metabox > .drkfr-row:last-child {
81
+ margin-bottom: 0;
82
+ }
drkfr/css/src/layout.css ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** drkfr Layout **/
2
+
3
+ .drkfr_metabox .field {
4
+ overflow: hidden;
5
+ padding: 16px 0;
6
+ border-bottom: 1px solid #DFDFDF;
7
+ }
8
+
9
+ .drkfr-row:last-child > [class*="drkfr-cell-"] > .field {
10
+ border-bottom: 0;
11
+ }
12
+
13
+ /* Neaten up the margins when metaboxes are within the standard postbox. */
14
+ .postbox > .inside > .drkfr_metabox {
15
+ margin: -10px 0;
16
+ }
17
+
18
+ .drkfr_metabox .drkfr-row {
19
+ overflow: hidden;
20
+ margin: 0 -5px;
21
+ zoom: 1;
22
+ }
23
+
24
+ .drkfr_metabox .drkfr-row:before,
25
+ .drkfr_metabox .drkfr-row:after {
26
+ content: "";
27
+ display: table;
28
+ }
29
+ .drkfr_metabox .drkfr-row:after {
30
+ clear: both;
31
+ }
32
+
33
+ .drkfr_metabox [class*="drkfr-cell-"] {
34
+ float: left;
35
+ padding: 0 5px;
36
+ -moz-box-sizing: border-box;
37
+ box-sizing: border-box;
38
+ }
39
+
40
+ .drkfr_metabox .drkfr-cell-1 { width: 8.333333333%; }
41
+ .drkfr_metabox .drkfr-cell-2 { width: 16.666666667%; }
42
+ .drkfr_metabox .drkfr-cell-3 { width: 25%; }
43
+ .drkfr_metabox .drkfr-cell-4 { width: 33.333333333%; }
44
+ .drkfr_metabox .drkfr-cell-5 { width: 41.666666667%; }
45
+ .drkfr_metabox .drkfr-cell-6 { width: 50%; }
46
+ .drkfr_metabox .drkfr-cell-7 { width: 58.333333333%; }
47
+ .drkfr_metabox .drkfr-cell-8 { width: 66.666666667%; }
48
+ .drkfr_metabox .drkfr-cell-9 { width: 75%; }
49
+ .drkfr_metabox .drkfr-cell-10 { width: 83.333333333%; }
50
+ .drkfr_metabox .drkfr-cell-11 { width: 91.666666667%; }
51
+ .drkfr_metabox .drkfr-cell-12 { width: 100%; }
52
+
53
+ @media all and ( max-width: 850px ) {
54
+
55
+ .drkfr_metabox [class*="drkfr-cell-"] { width: 100%; }
56
+
57
+ }
drkfr/css/src/misc-fields.css ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Title Field
3
+ */
4
+ .drkfr_Title .field-title {
5
+ margin: 8px 0 !important;
6
+ }
7
+
8
+ .drkfr_Title {
9
+ border-bottom: 0;
10
+ padding-bottom: 0;
11
+ margin-top: 16px;
12
+ }
13
+
14
+ .drkfr_Title h2 {
15
+ margin: 0 !important;
16
+ padding: 0 !important;
17
+ }
18
+
19
+
20
+ /**
21
+ * Color Picker
22
+ */
23
+ .drkfr_Color_Picker .field-item {
24
+ float: left;
25
+ clear: both;
26
+ }
27
+
28
+ .drkfr_Color_Picker:before,
29
+ .drkfr_Color_Picker:after {
30
+ content: "";
31
+ display: table;
32
+ }
33
+
34
+ .drkfr_Color_Picker:after {
35
+ clear: both;
36
+ }
37
+
38
+ .drkfr_Color_Picker {
39
+ zoom: 1;
40
+ }
41
+
42
+
43
+ /**
44
+ * Timepicker
45
+ */
46
+ div.time-picker { position: absolute; height: 191px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99; margin: 0; }
47
+ div.time-picker-12hours { width:6em; /* needed for IE */ }
48
+ div.time-picker ul { list-style-type: none; margin: 0; padding: 0; }
49
+ div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; }
50
+ div.time-picker li.selected { background: #0063CE; color: #fff; }
51
+
52
+ .drkfr_metabox input.drkfr_timepicker {
53
+ width: 100px;
54
+ margin-right: 0;
55
+ }
56
+
57
+ .drkfr_Datetime_Timestamp_Field input + input {
58
+ margin-left: 4px;
59
+ }
60
+
61
+ /**
62
+ * Select Fields
63
+ */
64
+
65
+ .drkfr_select {
66
+ width: 100%;
67
+ }
68
+
69
+ .select2-offscreen {
70
+ display: none;
71
+ }
drkfr/css/src/repeatable.css ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Repeatable
3
+ */
4
+
5
+ .drkfr_metabox .field.repeatable > .field-item {
6
+ padding-right: 30px;
7
+ margin-bottom: 10px;
8
+ }
9
+
10
+ .drkfr_metabox .repeat-field {
11
+ display: block !important;
12
+ clear: both;
13
+ }
14
+
15
+ .drkfr_Text_Small_Field.repeatable .field-item,
16
+ .drkfr_Date_Field.repeatable .field-item,
17
+ .drkfr_Time_Field.repeatable .field-item,
18
+ .drkfr_Date_Timestamp_Field.repeatable .field-item,
19
+ .drkfr_Date_Timestamp_Field.repeatable .field-item,
20
+ .drkfr_Datetime_Timestamp_Field.repeatable .field-item {
21
+ float: left; clear: both;
22
+ }
23
+
24
+ .drkfr-delete-field {
25
+ display: inline-block;
26
+ text-decoration: none;
27
+ font-size: 11px;
28
+ line-height: 20px;
29
+ height: 22px;
30
+ width: 22px;
31
+ margin: 0;
32
+ padding: 0;
33
+ cursor: pointer;
34
+ border-width: 1px;
35
+ border-style: solid;
36
+ -webkit-border-radius: 3px;
37
+ -webkit-appearance: none;
38
+ border-radius: 3px;
39
+ white-space: nowrap;
40
+ -webkit-box-sizing: border-box;
41
+ -moz-box-sizing: border-box;
42
+ box-sizing: border-box;
43
+ color: #555;
44
+ border-color: #ccc;
45
+ background: #f7f7f7;
46
+ -webkit-box-shadow: inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);
47
+ box-shadow: inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);
48
+ vertical-align: top;
49
+ position: absolute;
50
+ top: 3px;
51
+ right: 0;
52
+ text-indent: 100%;
53
+ overflow: hidden;
54
+ white-space: nowrap;
55
+ }
56
+
57
+ .drkfr-delete-field:hover,
58
+ .drkfr-delete-field:focus,
59
+ .drkfr-delete-field:active {
60
+ background: #fafafa;
61
+ border-color: #999;
62
+ color: #222;
63
+ }
64
+
65
+ .drkfr-delete-field .drkfr-delete-field-icon {
66
+ content: ' ';
67
+ display: block;
68
+ position: absolute;
69
+ height: 8px;
70
+ width: 8px;
71
+ top: 50%;
72
+ left: 50%;
73
+ margin-top: -4px;
74
+ margin-left: -4px;
75
+ background-image: url( '../../images/drkfr-icon-remove.png');
76
+ background-repeat: no-repeat;
77
+ text-indent: 8px;
78
+ overflow: hidden;
79
+ }
80
+
81
+ @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
82
+
83
+ .drkfr-delete-field .drkfr-delete-field-icon {
84
+ background-image: url( '../../images/drkfr-icon-remove@2x.png');
85
+ background-size: 8px 8px;
86
+ }
87
+
88
+ }
drkfr/css/src/sortable.css ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .drkfr-sortable > .field-item {
3
+ padding-left: 15px;
4
+ }
5
+
6
+ .drkfr-sortable .drkfr-handle {
7
+ height: 100%;
8
+ width: 3px;
9
+ position: absolute;
10
+ top: 0;
11
+ left: 0;
12
+ background: transparent;
13
+ cursor: move;
14
+ border-left: 3px solid #DFDFDF;
15
+ border-right: 3px solid #DFDFDF;
16
+ }
17
+
18
+ .drkfr-sortable .ui-sortable-helper {
19
+ opacity: 0.75;
20
+ }
21
+
22
+ .drkfr-sortable .ui-sortable-helper:before {
23
+ content: ' ';
24
+ position: absolute;
25
+ width: 100%;
26
+ height: 100%;
27
+ top: -6px;
28
+ left: -6px;
29
+ background-color: #F8F8F8;
30
+ border: 1px solid #DEDEDE;
31
+ padding: 5px;
32
+ z-index: -1;
33
+ }
34
+
35
+ .drkfr-sortable > .ui-sortable-placeholder {
36
+ border: 1px dashed #DDD !important;
37
+ background: transparent !important;
38
+ visibility: visible !important;
39
+ margin-bottom: 8px !important;
40
+ }
drkfr/css/vendor/jquery-ui/images/animated-overlay.gif ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png ADDED
Binary file
drkfr/css/vendor/jquery-ui/jquery-ui.css ADDED
@@ -0,0 +1,1175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.10.2 - 2013-03-14
2
+ * http://jqueryui.com
3
+ * Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
4
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
5
+ * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
6
+
7
+ /* Layout helpers
8
+ ----------------------------------*/
9
+ .ui-helper-hidden {
10
+ display: none;
11
+ }
12
+ .ui-helper-hidden-accessible {
13
+ border: 0;
14
+ clip: rect(0 0 0 0);
15
+ height: 1px;
16
+ margin: -1px;
17
+ overflow: hidden;
18
+ padding: 0;
19
+ position: absolute;
20
+ width: 1px;
21
+ }
22
+ .ui-helper-reset {
23
+ margin: 0;
24
+ padding: 0;
25
+ border: 0;
26
+ outline: 0;
27
+ line-height: 1.3;
28
+ text-decoration: none;
29
+ font-size: 100%;
30
+ list-style: none;
31
+ }
32
+ .ui-helper-clearfix:before,
33
+ .ui-helper-clearfix:after {
34
+ content: "";
35
+ display: table;
36
+ border-collapse: collapse;
37
+ }
38
+ .ui-helper-clearfix:after {
39
+ clear: both;
40
+ }
41
+ .ui-helper-clearfix {
42
+ min-height: 0; /* support: IE7 */
43
+ }
44
+ .ui-helper-zfix {
45
+ width: 100%;
46
+ height: 100%;
47
+ top: 0;
48
+ left: 0;
49
+ position: absolute;
50
+ opacity: 0;
51
+ filter:Alpha(Opacity=0);
52
+ }
53
+
54
+ .ui-front {
55
+ z-index: 100;
56
+ }
57
+
58
+
59
+ /* Interaction Cues
60
+ ----------------------------------*/
61
+ .ui-state-disabled {
62
+ cursor: default !important;
63
+ }
64
+
65
+
66
+ /* Icons
67
+ ----------------------------------*/
68
+
69
+ /* states and images */
70
+ .ui-icon {
71
+ display: block;
72
+ text-indent: -99999px;
73
+ overflow: hidden;
74
+ background-repeat: no-repeat;
75
+ }
76
+
77
+
78
+ /* Misc visuals
79
+ ----------------------------------*/
80
+
81
+ /* Overlays */
82
+ .ui-widget-overlay {
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+ .ui-accordion .ui-accordion-header {
90
+ display: block;
91
+ cursor: pointer;
92
+ position: relative;
93
+ margin-top: 2px;
94
+ padding: .5em .5em .5em .7em;
95
+ min-height: 0; /* support: IE7 */
96
+ }
97
+ .ui-accordion .ui-accordion-icons {
98
+ padding-left: 2.2em;
99
+ }
100
+ .ui-accordion .ui-accordion-noicons {
101
+ padding-left: .7em;
102
+ }
103
+ .ui-accordion .ui-accordion-icons .ui-accordion-icons {
104
+ padding-left: 2.2em;
105
+ }
106
+ .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
107
+ position: absolute;
108
+ left: .5em;
109
+ top: 50%;
110
+ margin-top: -8px;
111
+ }
112
+ .ui-accordion .ui-accordion-content {
113
+ padding: 1em 2.2em;
114
+ border-top: 0;
115
+ overflow: auto;
116
+ }
117
+ .ui-autocomplete {
118
+ position: absolute;
119
+ top: 0;
120
+ left: 0;
121
+ cursor: default;
122
+ }
123
+ .ui-button {
124
+ display: inline-block;
125
+ position: relative;
126
+ padding: 0;
127
+ line-height: normal;
128
+ margin-right: .1em;
129
+ cursor: pointer;
130
+ vertical-align: middle;
131
+ text-align: center;
132
+ overflow: visible; /* removes extra width in IE */
133
+ }
134
+ .ui-button,
135
+ .ui-button:link,
136
+ .ui-button:visited,
137
+ .ui-button:hover,
138
+ .ui-button:active {
139
+ text-decoration: none;
140
+ }
141
+ /* to make room for the icon, a width needs to be set here */
142
+ .ui-button-icon-only {
143
+ width: 2.2em;
144
+ }
145
+ /* button elements seem to need a little more width */
146
+ button.ui-button-icon-only {
147
+ width: 2.4em;
148
+ }
149
+ .ui-button-icons-only {
150
+ width: 3.4em;
151
+ }
152
+ button.ui-button-icons-only {
153
+ width: 3.7em;
154
+ }
155
+
156
+ /* button text element */
157
+ .ui-button .ui-button-text {
158
+ display: block;
159
+ line-height: normal;
160
+ }
161
+ .ui-button-text-only .ui-button-text {
162
+ padding: .4em 1em;
163
+ }
164
+ .ui-button-icon-only .ui-button-text,
165
+ .ui-button-icons-only .ui-button-text {
166
+ padding: .4em;
167
+ text-indent: -9999999px;
168
+ }
169
+ .ui-button-text-icon-primary .ui-button-text,
170
+ .ui-button-text-icons .ui-button-text {
171
+ padding: .4em 1em .4em 2.1em;
172
+ }
173
+ .ui-button-text-icon-secondary .ui-button-text,
174
+ .ui-button-text-icons .ui-button-text {
175
+ padding: .4em 2.1em .4em 1em;
176
+ }
177
+ .ui-button-text-icons .ui-button-text {
178
+ padding-left: 2.1em;
179
+ padding-right: 2.1em;
180
+ }
181
+ /* no icon support for input elements, provide padding by default */
182
+ input.ui-button {
183
+ padding: .4em 1em;
184
+ }
185
+
186
+ /* button icon element(s) */
187
+ .ui-button-icon-only .ui-icon,
188
+ .ui-button-text-icon-primary .ui-icon,
189
+ .ui-button-text-icon-secondary .ui-icon,
190
+ .ui-button-text-icons .ui-icon,
191
+ .ui-button-icons-only .ui-icon {
192
+ position: absolute;
193
+ top: 50%;
194
+ margin-top: -8px;
195
+ }
196
+ .ui-button-icon-only .ui-icon {
197
+ left: 50%;
198
+ margin-left: -8px;
199
+ }
200
+ .ui-button-text-icon-primary .ui-button-icon-primary,
201
+ .ui-button-text-icons .ui-button-icon-primary,
202
+ .ui-button-icons-only .ui-button-icon-primary {
203
+ left: .5em;
204
+ }
205
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
206
+ .ui-button-text-icons .ui-button-icon-secondary,
207
+ .ui-button-icons-only .ui-button-icon-secondary {
208
+ right: .5em;
209
+ }
210
+
211
+ /* button sets */
212
+ .ui-buttonset {
213
+ margin-right: 7px;
214
+ }
215
+ .ui-buttonset .ui-button {
216
+ margin-left: 0;
217
+ margin-right: -.3em;
218
+ }
219
+
220
+ /* workarounds */
221
+ /* reset extra padding in Firefox, see h5bp.com/l */
222
+ input.ui-button::-moz-focus-inner,
223
+ button.ui-button::-moz-focus-inner {
224
+ border: 0;
225
+ padding: 0;
226
+ }
227
+ .ui-datepicker {
228
+ width: 17em;
229
+ padding: .2em .2em 0;
230
+ display: none;
231
+ }
232
+ .ui-datepicker .ui-datepicker-header {
233
+ position: relative;
234
+ padding: .2em 0;
235
+ }
236
+ .ui-datepicker .ui-datepicker-prev,
237
+ .ui-datepicker .ui-datepicker-next {
238
+ position: absolute;
239
+ top: 2px;
240
+ width: 1.8em;
241
+ height: 1.8em;
242
+ }
243
+ .ui-datepicker .ui-datepicker-prev-hover,
244
+ .ui-datepicker .ui-datepicker-next-hover {
245
+ top: 1px;
246
+ }
247
+ .ui-datepicker .ui-datepicker-prev {
248
+ left: 2px;
249
+ }
250
+ .ui-datepicker .ui-datepicker-next {
251
+ right: 2px;
252
+ }
253
+ .ui-datepicker .ui-datepicker-prev-hover {
254
+ left: 1px;
255
+ }
256
+ .ui-datepicker .ui-datepicker-next-hover {
257
+ right: 1px;
258
+ }
259
+ .ui-datepicker .ui-datepicker-prev span,
260
+ .ui-datepicker .ui-datepicker-next span {
261
+ display: block;
262
+ position: absolute;
263
+ left: 50%;
264
+ margin-left: -8px;
265
+ top: 50%;
266
+ margin-top: -8px;
267
+ }
268
+ .ui-datepicker .ui-datepicker-title {
269
+ margin: 0 2.3em;
270
+ line-height: 1.8em;
271
+ text-align: center;
272
+ }
273
+ .ui-datepicker .ui-datepicker-title select {
274
+ font-size: 1em;
275
+ margin: 1px 0;
276
+ }
277
+ .ui-datepicker select.ui-datepicker-month-year {
278
+ width: 100%;
279
+ }
280
+ .ui-datepicker select.ui-datepicker-month,
281
+ .ui-datepicker select.ui-datepicker-year {
282
+ width: 49%;
283
+ }
284
+ .ui-datepicker table {
285
+ width: 100%;
286
+ font-size: .9em;
287
+ border-collapse: collapse;
288
+ margin: 0 0 .4em;
289
+ }
290
+ .ui-datepicker th {
291
+ padding: .7em .3em;
292
+ text-align: center;
293
+ font-weight: bold;
294
+ border: 0;
295
+ }
296
+ .ui-datepicker td {
297
+ border: 0;
298
+ padding: 1px;
299
+ }
300
+ .ui-datepicker td span,
301
+ .ui-datepicker td a {
302
+ display: block;
303
+ padding: .2em;
304
+ text-align: right;
305
+ text-decoration: none;
306
+ }
307
+ .ui-datepicker .ui-datepicker-buttonpane {
308
+ background-image: none;
309
+ margin: .7em 0 0 0;
310
+ padding: 0 .2em;
311
+ border-left: 0;
312
+ border-right: 0;
313
+ border-bottom: 0;
314
+ }
315
+ .ui-datepicker .ui-datepicker-buttonpane button {
316
+ float: right;
317
+ margin: .5em .2em .4em;
318
+ cursor: pointer;
319
+ padding: .2em .6em .3em .6em;
320
+ width: auto;
321
+ overflow: visible;
322
+ }
323
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
324
+ float: left;
325
+ }
326
+
327
+ /* with multiple calendars */
328
+ .ui-datepicker.ui-datepicker-multi {
329
+ width: auto;
330
+ }
331
+ .ui-datepicker-multi .ui-datepicker-group {
332
+ float: left;
333
+ }
334
+ .ui-datepicker-multi .ui-datepicker-group table {
335
+ width: 95%;
336
+ margin: 0 auto .4em;
337
+ }
338
+ .ui-datepicker-multi-2 .ui-datepicker-group {
339
+ width: 50%;
340
+ }
341
+ .ui-datepicker-multi-3 .ui-datepicker-group {
342
+ width: 33.3%;
343
+ }
344
+ .ui-datepicker-multi-4 .ui-datepicker-group {
345
+ width: 25%;
346
+ }
347
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
348
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
349
+ border-left-width: 0;
350
+ }
351
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
352
+ clear: left;
353
+ }
354
+ .ui-datepicker-row-break {
355
+ clear: both;
356
+ width: 100%;
357
+ font-size: 0;
358
+ }
359
+
360
+ /* RTL support */
361
+ .ui-datepicker-rtl {
362
+ direction: rtl;
363
+ }
364
+ .ui-datepicker-rtl .ui-datepicker-prev {
365
+ right: 2px;
366
+ left: auto;
367
+ }
368
+ .ui-datepicker-rtl .ui-datepicker-next {
369
+ left: 2px;
370
+ right: auto;
371
+ }
372
+ .ui-datepicker-rtl .ui-datepicker-prev:hover {
373
+ right: 1px;
374
+ left: auto;
375
+ }
376
+ .ui-datepicker-rtl .ui-datepicker-next:hover {
377
+ left: 1px;
378
+ right: auto;
379
+ }
380
+ .ui-datepicker-rtl .ui-datepicker-buttonpane {
381
+ clear: right;
382
+ }
383
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button {
384
+ float: left;
385
+ }
386
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
387
+ .ui-datepicker-rtl .ui-datepicker-group {
388
+ float: right;
389
+ }
390
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
391
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
392
+ border-right-width: 0;
393
+ border-left-width: 1px;
394
+ }
395
+ .ui-dialog {
396
+ position: absolute;
397
+ top: 0;
398
+ left: 0;
399
+ padding: .2em;
400
+ outline: 0;
401
+ }
402
+ .ui-dialog .ui-dialog-titlebar {
403
+ padding: .4em 1em;
404
+ position: relative;
405
+ }
406
+ .ui-dialog .ui-dialog-title {
407
+ float: left;
408
+ margin: .1em 0;
409
+ white-space: nowrap;
410
+ width: 90%;
411
+ overflow: hidden;
412
+ text-overflow: ellipsis;
413
+ }
414
+ .ui-dialog .ui-dialog-titlebar-close {
415
+ position: absolute;
416
+ right: .3em;
417
+ top: 50%;
418
+ width: 21px;
419
+ margin: -10px 0 0 0;
420
+ padding: 1px;
421
+ height: 20px;
422
+ }
423
+ .ui-dialog .ui-dialog-content {
424
+ position: relative;
425
+ border: 0;
426
+ padding: .5em 1em;
427
+ background: none;
428
+ overflow: auto;
429
+ }
430
+ .ui-dialog .ui-dialog-buttonpane {
431
+ text-align: left;
432
+ border-width: 1px 0 0 0;
433
+ background-image: none;
434
+ margin-top: .5em;
435
+ padding: .3em 1em .5em .4em;
436
+ }
437
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
438
+ float: right;
439
+ }
440
+ .ui-dialog .ui-dialog-buttonpane button {
441
+ margin: .5em .4em .5em 0;
442
+ cursor: pointer;
443
+ }
444
+ .ui-dialog .ui-resizable-se {
445
+ width: 12px;
446
+ height: 12px;
447
+ right: -5px;
448
+ bottom: -5px;
449
+ background-position: 16px 16px;
450
+ }
451
+ .ui-draggable .ui-dialog-titlebar {
452
+ cursor: move;
453
+ }
454
+ .ui-menu {
455
+ list-style: none;
456
+ padding: 2px;
457
+ margin: 0;
458
+ display: block;
459
+ outline: none;
460
+ }
461
+ .ui-menu .ui-menu {
462
+ margin-top: -3px;
463
+ position: absolute;
464
+ }
465
+ .ui-menu .ui-menu-item {
466
+ margin: 0;
467
+ padding: 0;
468
+ width: 100%;
469
+ }
470
+ .ui-menu .ui-menu-divider {
471
+ margin: 5px -2px 5px -2px;
472
+ height: 0;
473
+ font-size: 0;
474
+ line-height: 0;
475
+ border-width: 1px 0 0 0;
476
+ }
477
+ .ui-menu .ui-menu-item a {
478
+ text-decoration: none;
479
+ display: block;
480
+ padding: 2px .4em;
481
+ line-height: 1.5;
482
+ min-height: 0; /* support: IE7 */
483
+ font-weight: normal;
484
+ }
485
+ .ui-menu .ui-menu-item a.ui-state-focus,
486
+ .ui-menu .ui-menu-item a.ui-state-active {
487
+ font-weight: normal;
488
+ margin: -1px;
489
+ }
490
+
491
+ .ui-menu .ui-state-disabled {
492
+ font-weight: normal;
493
+ margin: .4em 0 .2em;
494
+ line-height: 1.5;
495
+ }
496
+ .ui-menu .ui-state-disabled a {
497
+ cursor: default;
498
+ }
499
+
500
+ /* icon support */
501
+ .ui-menu-icons {
502
+ position: relative;
503
+ }
504
+ .ui-menu-icons .ui-menu-item a {
505
+ position: relative;
506
+ padding-left: 2em;
507
+ }
508
+
509
+ /* left-aligned */
510
+ .ui-menu .ui-icon {
511
+ position: absolute;
512
+ top: .2em;
513
+ left: .2em;
514
+ }
515
+
516
+ /* right-aligned */
517
+ .ui-menu .ui-menu-icon {
518
+ position: static;
519
+ float: right;
520
+ }
521
+ .ui-progressbar {
522
+ height: 2em;
523
+ text-align: left;
524
+ overflow: hidden;
525
+ }
526
+ .ui-progressbar .ui-progressbar-value {
527
+ margin: -1px;
528
+ height: 100%;
529
+ }
530
+ .ui-progressbar .ui-progressbar-overlay {
531
+ background: url("images/animated-overlay.gif");
532
+ height: 100%;
533
+ filter: alpha(opacity=25);
534
+ opacity: 0.25;
535
+ }
536
+ .ui-progressbar-indeterminate .ui-progressbar-value {
537
+ background-image: none;
538
+ }
539
+ .ui-resizable {
540
+ position: relative;
541
+ }
542
+ .ui-resizable-handle {
543
+ position: absolute;
544
+ font-size: 0.1px;
545
+ display: block;
546
+ }
547
+ .ui-resizable-disabled .ui-resizable-handle,
548
+ .ui-resizable-autohide .ui-resizable-handle {
549
+ display: none;
550
+ }
551
+ .ui-resizable-n {
552
+ cursor: n-resize;
553
+ height: 7px;
554
+ width: 100%;
555
+ top: -5px;
556
+ left: 0;
557
+ }
558
+ .ui-resizable-s {
559
+ cursor: s-resize;
560
+ height: 7px;
561
+ width: 100%;
562
+ bottom: -5px;
563
+ left: 0;
564
+ }
565
+ .ui-resizable-e {
566
+ cursor: e-resize;
567
+ width: 7px;
568
+ right: -5px;
569
+ top: 0;
570
+ height: 100%;
571
+ }
572
+ .ui-resizable-w {
573
+ cursor: w-resize;
574
+ width: 7px;
575
+ left: -5px;
576
+ top: 0;
577
+ height: 100%;
578
+ }
579
+ .ui-resizable-se {
580
+ cursor: se-resize;
581
+ width: 12px;
582
+ height: 12px;
583
+ right: 1px;
584
+ bottom: 1px;
585
+ }
586
+ .ui-resizable-sw {
587
+ cursor: sw-resize;
588
+ width: 9px;
589
+ height: 9px;
590
+ left: -5px;
591
+ bottom: -5px;
592
+ }
593
+ .ui-resizable-nw {
594
+ cursor: nw-resize;
595
+ width: 9px;
596
+ height: 9px;
597
+ left: -5px;
598
+ top: -5px;
599
+ }
600
+ .ui-resizable-ne {
601
+ cursor: ne-resize;
602
+ width: 9px;
603
+ height: 9px;
604
+ right: -5px;
605
+ top: -5px;
606
+ }
607
+ .ui-selectable-helper {
608
+ position: absolute;
609
+ z-index: 100;
610
+ border: 1px dotted black;
611
+ }
612
+ .ui-slider {
613
+ position: relative;
614
+ text-align: left;
615
+ }
616
+ .ui-slider .ui-slider-handle {
617
+ position: absolute;
618
+ z-index: 2;
619
+ width: 1.2em;
620
+ height: 1.2em;
621
+ cursor: default;
622
+ }
623
+ .ui-slider .ui-slider-range {
624
+ position: absolute;
625
+ z-index: 1;
626
+ font-size: .7em;
627
+ display: block;
628
+ border: 0;
629
+ background-position: 0 0;
630
+ }
631
+
632
+ /* For IE8 - See #6727 */
633
+ .ui-slider.ui-state-disabled .ui-slider-handle,
634
+ .ui-slider.ui-state-disabled .ui-slider-range {
635
+ filter: inherit;
636
+ }
637
+
638
+ .ui-slider-horizontal {
639
+ height: .8em;
640
+ }
641
+ .ui-slider-horizontal .ui-slider-handle {
642
+ top: -.3em;
643
+ margin-left: -.6em;
644
+ }
645
+ .ui-slider-horizontal .ui-slider-range {
646
+ top: 0;
647
+ height: 100%;
648
+ }
649
+ .ui-slider-horizontal .ui-slider-range-min {
650
+ left: 0;
651
+ }
652
+ .ui-slider-horizontal .ui-slider-range-max {
653
+ right: 0;
654
+ }
655
+
656
+ .ui-slider-vertical {
657
+ width: .8em;
658
+ height: 100px;
659
+ }
660
+ .ui-slider-vertical .ui-slider-handle {
661
+ left: -.3em;
662
+ margin-left: 0;
663
+ margin-bottom: -.6em;
664
+ }
665
+ .ui-slider-vertical .ui-slider-range {
666
+ left: 0;
667
+ width: 100%;
668
+ }
669
+ .ui-slider-vertical .ui-slider-range-min {
670
+ bottom: 0;
671
+ }
672
+ .ui-slider-vertical .ui-slider-range-max {
673
+ top: 0;
674
+ }
675
+ .ui-spinner {
676
+ position: relative;
677
+ display: inline-block;
678
+ overflow: hidden;
679
+ padding: 0;
680
+ vertical-align: middle;
681
+ }
682
+ .ui-spinner-input {
683
+ border: none;
684
+ background: none;
685
+ color: inherit;
686
+ padding: 0;
687
+ margin: .2em 0;
688
+ vertical-align: middle;
689
+ margin-left: .4em;
690
+ margin-right: 22px;
691
+ }
692
+ .ui-spinner-button {
693
+ width: 16px;
694
+ height: 50%;
695
+ font-size: .5em;
696
+ padding: 0;
697
+ margin: 0;
698
+ text-align: center;
699
+ position: absolute;
700
+ cursor: default;
701
+ display: block;
702
+ overflow: hidden;
703
+ right: 0;
704
+ }
705
+ /* more specificity required here to overide default borders */
706
+ .ui-spinner a.ui-spinner-button {
707
+ border-top: none;
708
+ border-bottom: none;
709
+ border-right: none;
710
+ }
711
+ /* vertical centre icon */
712
+ .ui-spinner .ui-icon {
713
+ position: absolute;
714
+ margin-top: -8px;
715
+ top: 50%;
716
+ left: 0;
717
+ }
718
+ .ui-spinner-up {
719
+ top: 0;
720
+ }
721
+ .ui-spinner-down {
722
+ bottom: 0;
723
+ }
724
+
725
+ /* TR overrides */
726
+ .ui-spinner .ui-icon-triangle-1-s {
727
+ /* need to fix icons sprite */
728
+ background-position: -65px -16px;
729
+ }
730
+ .ui-tabs {
731
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
732
+ padding: .2em;
733
+ }
734
+ .ui-tabs .ui-tabs-nav {
735
+ margin: 0;
736
+ padding: .2em .2em 0;
737
+ }
738
+ .ui-tabs .ui-tabs-nav li {
739
+ list-style: none;
740
+ float: left;
741
+ position: relative;
742
+ top: 0;
743
+ margin: 1px .2em 0 0;
744
+ border-bottom-width: 0;
745
+ padding: 0;
746
+ white-space: nowrap;
747
+ }
748
+ .ui-tabs .ui-tabs-nav li a {
749
+ float: left;
750
+ padding: .5em 1em;
751
+ text-decoration: none;
752
+ }
753
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active {
754
+ margin-bottom: -1px;
755
+ padding-bottom: 1px;
756
+ }
757
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active a,
758
+ .ui-tabs .ui-tabs-nav li.ui-state-disabled a,
759
+ .ui-tabs .ui-tabs-nav li.ui-tabs-loading a {
760
+ cursor: text;
761
+ }
762
+ .ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
763
+ .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {
764
+ cursor: pointer;
765
+ }
766
+ .ui-tabs .ui-tabs-panel {
767
+ display: block;
768
+ border-width: 0;
769
+ padding: 1em 1.4em;
770
+ background: none;
771
+ }
772
+ .ui-tooltip {
773
+ padding: 8px;
774
+ position: absolute;
775
+ z-index: 9999;
776
+ max-width: 300px;
777
+ -webkit-box-shadow: 0 0 5px #aaa;
778
+ box-shadow: 0 0 5px #aaa;
779
+ }
780
+ body .ui-tooltip {
781
+ border-width: 2px;
782
+ }
783
+
784
+ /* Component containers
785
+ ----------------------------------*/
786
+ .ui-widget {
787
+ font-family: Verdana,Arial,sans-serif;
788
+ font-size: 1.1em;
789
+ }
790
+ .ui-widget .ui-widget {
791
+ font-size: 1em;
792
+ }
793
+ .ui-widget input,
794
+ .ui-widget select,
795
+ .ui-widget textarea,
796
+ .ui-widget button {
797
+ font-family: Verdana,Arial,sans-serif;
798
+ font-size: 1em;
799
+ }
800
+ .ui-widget-content {
801
+ border: 1px solid #aaaaaa;
802
+ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
803
+ color: #222222;
804
+ }
805
+ .ui-widget-content a {
806
+ color: #222222;
807
+ }
808
+ .ui-widget-header {
809
+ border: 1px solid #aaaaaa;
810
+ background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
811
+ color: #222222;
812
+ font-weight: bold;
813
+ }
814
+ .ui-widget-header a {
815
+ color: #222222;
816
+ }
817
+
818
+ /* Interaction states
819
+ ----------------------------------*/
820
+ .ui-state-default,
821
+ .ui-widget-content .ui-state-default,
822
+ .ui-widget-header .ui-state-default {
823
+ border: 1px solid #d3d3d3;
824
+ background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
825
+ font-weight: normal;
826
+ color: #555555;
827
+ }
828
+ .ui-state-default a,
829
+ .ui-state-default a:link,
830
+ .ui-state-default a:visited {
831
+ color: #555555;
832
+ text-decoration: none;
833
+ }
834
+ .ui-state-hover,
835
+ .ui-widget-content .ui-state-hover,
836
+ .ui-widget-header .ui-state-hover,
837
+ .ui-state-focus,
838
+ .ui-widget-content .ui-state-focus,
839
+ .ui-widget-header .ui-state-focus {
840
+ border: 1px solid #999999;
841
+ background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
842
+ font-weight: normal;
843
+ color: #212121;
844
+ }
845
+ .ui-state-hover a,
846
+ .ui-state-hover a:hover,
847
+ .ui-state-hover a:link,
848
+ .ui-state-hover a:visited {
849
+ color: #212121;
850
+ text-decoration: none;
851
+ }
852
+ .ui-state-active,
853
+ .ui-widget-content .ui-state-active,
854
+ .ui-widget-header .ui-state-active {
855
+ border: 1px solid #aaaaaa;
856
+ background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
857
+ font-weight: normal;
858
+ color: #212121;
859
+ }
860
+ .ui-state-active a,
861
+ .ui-state-active a:link,
862
+ .ui-state-active a:visited {
863
+ color: #212121;
864
+ text-decoration: none;
865
+ }
866
+
867
+ /* Interaction Cues
868
+ ----------------------------------*/
869
+ .ui-state-highlight,
870
+ .ui-widget-content .ui-state-highlight,
871
+ .ui-widget-header .ui-state-highlight {
872
+ border: 1px solid #fcefa1;
873
+ background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
874
+ color: #363636;
875
+ }
876
+ .ui-state-highlight a,
877
+ .ui-widget-content .ui-state-highlight a,
878
+ .ui-widget-header .ui-state-highlight a {
879
+ color: #363636;
880
+ }
881
+ .ui-state-error,
882
+ .ui-widget-content .ui-state-error,
883
+ .ui-widget-header .ui-state-error {
884
+ border: 1px solid #cd0a0a;
885
+ background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
886
+ color: #cd0a0a;
887
+ }
888
+ .ui-state-error a,
889
+ .ui-widget-content .ui-state-error a,
890
+ .ui-widget-header .ui-state-error a {
891
+ color: #cd0a0a;
892
+ }
893
+ .ui-state-error-text,
894
+ .ui-widget-content .ui-state-error-text,
895
+ .ui-widget-header .ui-state-error-text {
896
+ color: #cd0a0a;
897
+ }
898
+ .ui-priority-primary,
899
+ .ui-widget-content .ui-priority-primary,
900
+ .ui-widget-header .ui-priority-primary {
901
+ font-weight: bold;
902
+ }
903
+ .ui-priority-secondary,
904
+ .ui-widget-content .ui-priority-secondary,
905
+ .ui-widget-header .ui-priority-secondary {
906
+ opacity: .7;
907
+ filter:Alpha(Opacity=70);
908
+ font-weight: normal;
909
+ }
910
+ .ui-state-disabled,
911
+ .ui-widget-content .ui-state-disabled,
912
+ .ui-widget-header .ui-state-disabled {
913
+ opacity: .35;
914
+ filter:Alpha(Opacity=35);
915
+ background-image: none;
916
+ }
917
+ .ui-state-disabled .ui-icon {
918
+ filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
919
+ }
920
+
921
+ /* Icons
922
+ ----------------------------------*/
923
+
924
+ /* states and images */
925
+ .ui-icon {
926
+ width: 16px;
927
+ height: 16px;
928
+ }
929
+ .ui-icon,
930
+ .ui-widget-content .ui-icon {
931
+ background-image: url(images/ui-icons_222222_256x240.png);
932
+ }
933
+ .ui-widget-header .ui-icon {
934
+ background-image: url(images/ui-icons_222222_256x240.png);
935
+ }
936
+ .ui-state-default .ui-icon {
937
+ background-image: url(images/ui-icons_888888_256x240.png);
938
+ }
939
+ .ui-state-hover .ui-icon,
940
+ .ui-state-focus .ui-icon {
941
+ background-image: url(images/ui-icons_454545_256x240.png);
942
+ }
943
+ .ui-state-active .ui-icon {
944
+ background-image: url(images/ui-icons_454545_256x240.png);
945
+ }
946
+ .ui-state-highlight .ui-icon {
947
+ background-image: url(images/ui-icons_2e83ff_256x240.png);
948
+ }
949
+ .ui-state-error .ui-icon,
950
+ .ui-state-error-text .ui-icon {
951
+ background-image: url(images/ui-icons_cd0a0a_256x240.png);
952
+ }
953
+
954
+ /* positioning */
955
+ .ui-icon-blank { background-position: 16px 16px; }
956
+ .ui-icon-carat-1-n { background-position: 0 0; }
957
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
958
+ .ui-icon-carat-1-e { background-position: -32px 0; }
959
+ .ui-icon-carat-1-se { background-position: -48px 0; }
960
+ .ui-icon-carat-1-s { background-position: -64px 0; }
961
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
962
+ .ui-icon-carat-1-w { background-position: -96px 0; }
963
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
964
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
965
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
966
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
967
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
968
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
969
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
970
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
971
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
972
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
973
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
974
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
975
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
976
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
977
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
978
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
979
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
980
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
981
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
982
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
983
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
984
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
985
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
986
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
987
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
988
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
989
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
990
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
991
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
992
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
993
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
994
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
995
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
996
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
997
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
998
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
999
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1000
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1001
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1002
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1003
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1004
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1005
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1006
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1007
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1008
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1009
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1010
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1011
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1012
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1013
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1014
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1015
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1016
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1017
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1018
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1019
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1020
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
1021
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1022
+ .ui-icon-extlink { background-position: -32px -80px; }
1023
+ .ui-icon-newwin { background-position: -48px -80px; }
1024
+ .ui-icon-refresh { background-position: -64px -80px; }
1025
+ .ui-icon-shuffle { background-position: -80px -80px; }
1026
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
1027
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1028
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
1029
+ .ui-icon-folder-open { background-position: -16px -96px; }
1030
+ .ui-icon-document { background-position: -32px -96px; }
1031
+ .ui-icon-document-b { background-position: -48px -96px; }
1032
+ .ui-icon-note { background-position: -64px -96px; }
1033
+ .ui-icon-mail-closed { background-position: -80px -96px; }
1034
+ .ui-icon-mail-open { background-position: -96px -96px; }
1035
+ .ui-icon-suitcase { background-position: -112px -96px; }
1036
+ .ui-icon-comment { background-position: -128px -96px; }
1037
+ .ui-icon-person { background-position: -144px -96px; }
1038
+ .ui-icon-print { background-position: -160px -96px; }
1039
+ .ui-icon-trash { background-position: -176px -96px; }
1040
+ .ui-icon-locked { background-position: -192px -96px; }
1041
+ .ui-icon-unlocked { background-position: -208px -96px; }
1042
+ .ui-icon-bookmark { background-position: -224px -96px; }
1043
+ .ui-icon-tag { background-position: -240px -96px; }
1044
+ .ui-icon-home { background-position: 0 -112px; }
1045
+ .ui-icon-flag { background-position: -16px -112px; }
1046
+ .ui-icon-calendar { background-position: -32px -112px; }
1047
+ .ui-icon-cart { background-position: -48px -112px; }
1048
+ .ui-icon-pencil { background-position: -64px -112px; }
1049
+ .ui-icon-clock { background-position: -80px -112px; }
1050
+ .ui-icon-disk { background-position: -96px -112px; }
1051
+ .ui-icon-calculator { background-position: -112px -112px; }
1052
+ .ui-icon-zoomin { background-position: -128px -112px; }
1053
+ .ui-icon-zoomout { background-position: -144px -112px; }
1054
+ .ui-icon-search { background-position: -160px -112px; }
1055
+ .ui-icon-wrench { background-position: -176px -112px; }
1056
+ .ui-icon-gear { background-position: -192px -112px; }
1057
+ .ui-icon-heart { background-position: -208px -112px; }
1058
+ .ui-icon-star { background-position: -224px -112px; }
1059
+ .ui-icon-link { background-position: -240px -112px; }
1060
+ .ui-icon-cancel { background-position: 0 -128px; }
1061
+ .ui-icon-plus { background-position: -16px -128px; }
1062
+ .ui-icon-plusthick { background-position: -32px -128px; }
1063
+ .ui-icon-minus { background-position: -48px -128px; }
1064
+ .ui-icon-minusthick { background-position: -64px -128px; }
1065
+ .ui-icon-close { background-position: -80px -128px; }
1066
+ .ui-icon-closethick { background-position: -96px -128px; }
1067
+ .ui-icon-key { background-position: -112px -128px; }
1068
+ .ui-icon-lightbulb { background-position: -128px -128px; }
1069
+ .ui-icon-scissors { background-position: -144px -128px; }
1070
+ .ui-icon-clipboard { background-position: -160px -128px; }
1071
+ .ui-icon-copy { background-position: -176px -128px; }
1072
+ .ui-icon-contact { background-position: -192px -128px; }
1073
+ .ui-icon-image { background-position: -208px -128px; }
1074
+ .ui-icon-video { background-position: -224px -128px; }
1075
+ .ui-icon-script { background-position: -240px -128px; }
1076
+ .ui-icon-alert { background-position: 0 -144px; }
1077
+ .ui-icon-info { background-position: -16px -144px; }
1078
+ .ui-icon-notice { background-position: -32px -144px; }
1079
+ .ui-icon-help { background-position: -48px -144px; }
1080
+ .ui-icon-check { background-position: -64px -144px; }
1081
+ .ui-icon-bullet { background-position: -80px -144px; }
1082
+ .ui-icon-radio-on { background-position: -96px -144px; }
1083
+ .ui-icon-radio-off { background-position: -112px -144px; }
1084
+ .ui-icon-pin-w { background-position: -128px -144px; }
1085
+ .ui-icon-pin-s { background-position: -144px -144px; }
1086
+ .ui-icon-play { background-position: 0 -160px; }
1087
+ .ui-icon-pause { background-position: -16px -160px; }
1088
+ .ui-icon-seek-next { background-position: -32px -160px; }
1089
+ .ui-icon-seek-prev { background-position: -48px -160px; }
1090
+ .ui-icon-seek-end { background-position: -64px -160px; }
1091
+ .ui-icon-seek-start { background-position: -80px -160px; }
1092
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1093
+ .ui-icon-seek-first { background-position: -80px -160px; }
1094
+ .ui-icon-stop { background-position: -96px -160px; }
1095
+ .ui-icon-eject { background-position: -112px -160px; }
1096
+ .ui-icon-volume-off { background-position: -128px -160px; }
1097
+ .ui-icon-volume-on { background-position: -144px -160px; }
1098
+ .ui-icon-power { background-position: 0 -176px; }
1099
+ .ui-icon-signal-diag { background-position: -16px -176px; }
1100
+ .ui-icon-signal { background-position: -32px -176px; }
1101
+ .ui-icon-battery-0 { background-position: -48px -176px; }
1102
+ .ui-icon-battery-1 { background-position: -64px -176px; }
1103
+ .ui-icon-battery-2 { background-position: -80px -176px; }
1104
+ .ui-icon-battery-3 { background-position: -96px -176px; }
1105
+ .ui-icon-circle-plus { background-position: 0 -192px; }
1106
+ .ui-icon-circle-minus { background-position: -16px -192px; }
1107
+ .ui-icon-circle-close { background-position: -32px -192px; }
1108
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1109
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1110
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1111
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1112
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1113
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1114
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1115
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1116
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
1117
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
1118
+ .ui-icon-circle-check { background-position: -208px -192px; }
1119
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1120
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1121
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
1122
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1123
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1124
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
1125
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1126
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1127
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1128
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1129
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1130
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1131
+
1132
+
1133
+ /* Misc visuals
1134
+ ----------------------------------*/
1135
+
1136
+ /* Corner radius */
1137
+ .ui-corner-all,
1138
+ .ui-corner-top,
1139
+ .ui-corner-left,
1140
+ .ui-corner-tl {
1141
+ border-top-left-radius: 4px;
1142
+ }
1143
+ .ui-corner-all,
1144
+ .ui-corner-top,
1145
+ .ui-corner-right,
1146
+ .ui-corner-tr {
1147
+ border-top-right-radius: 4px;
1148
+ }
1149
+ .ui-corner-all,
1150
+ .ui-corner-bottom,
1151
+ .ui-corner-left,
1152
+ .ui-corner-bl {
1153
+ border-bottom-left-radius: 4px;
1154
+ }
1155
+ .ui-corner-all,
1156
+ .ui-corner-bottom,
1157
+ .ui-corner-right,
1158
+ .ui-corner-br {
1159
+ border-bottom-right-radius: 4px;
1160
+ }
1161
+
1162
+ /* Overlays */
1163
+ .ui-widget-overlay {
1164
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
1165
+ opacity: .3;
1166
+ filter: Alpha(Opacity=30);
1167
+ }
1168
+ .ui-widget-shadow {
1169
+ margin: -8px 0 0 -8px;
1170
+ padding: 8px;
1171
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
1172
+ opacity: .3;
1173
+ filter: Alpha(Opacity=30);
1174
+ border-radius: 8px;
1175
+ }
drkfr/css/vendor/jquery-ui/jquery-ui.min.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*! jQuery UI - v1.10.2 - 2013-03-14
2
+ * http://jqueryui.com
3
+ * Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
4
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
5
+ * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
drkfr/css/vendor/jquery-ui/jquery.ui.theme.css ADDED
@@ -0,0 +1,406 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jQuery UI CSS Framework 1.10.2
3
+ * http://jqueryui.com
4
+ *
5
+ * Copyright 2013 jQuery Foundation and other contributors
6
+ * Released under the MIT license.
7
+ * http://jquery.org/license
8
+ *
9
+ * http://docs.jquery.com/UI/Theming/API
10
+ *
11
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
12
+ */
13
+
14
+
15
+ /* Component containers
16
+ ----------------------------------*/
17
+ .ui-widget {
18
+ font-family: Verdana,Arial,sans-serif;
19
+ font-size: 1.1em;
20
+ }
21
+ .ui-widget .ui-widget {
22
+ font-size: 1em;
23
+ }
24
+ .ui-widget input,
25
+ .ui-widget select,
26
+ .ui-widget textarea,
27
+ .ui-widget button {
28
+ font-family: Verdana,Arial,sans-serif;
29
+ font-size: 1em;
30
+ }
31
+ .ui-widget-content {
32
+ border: 1px solid #aaaaaa;
33
+ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
34
+ color: #222222;
35
+ }
36
+ .ui-widget-content a {
37
+ color: #222222;
38
+ }
39
+ .ui-widget-header {
40
+ border: 1px solid #aaaaaa;
41
+ background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
42
+ color: #222222;
43
+ font-weight: bold;
44
+ }
45
+ .ui-widget-header a {
46
+ color: #222222;
47
+ }
48
+
49
+ /* Interaction states
50
+ ----------------------------------*/
51
+ .ui-state-default,
52
+ .ui-widget-content .ui-state-default,
53
+ .ui-widget-header .ui-state-default {
54
+ border: 1px solid #d3d3d3;
55
+ background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
56
+ font-weight: normal;
57
+ color: #555555;
58
+ }
59
+ .ui-state-default a,
60
+ .ui-state-default a:link,
61
+ .ui-state-default a:visited {
62
+ color: #555555;
63
+ text-decoration: none;
64
+ }
65
+ .ui-state-hover,
66
+ .ui-widget-content .ui-state-hover,
67
+ .ui-widget-header .ui-state-hover,
68
+ .ui-state-focus,
69
+ .ui-widget-content .ui-state-focus,
70
+ .ui-widget-header .ui-state-focus {
71
+ border: 1px solid #999999;
72
+ background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
73
+ font-weight: normal;
74
+ color: #212121;
75
+ }
76
+ .ui-state-hover a,
77
+ .ui-state-hover a:hover,
78
+ .ui-state-hover a:link,
79
+ .ui-state-hover a:visited {
80
+ color: #212121;
81
+ text-decoration: none;
82
+ }
83
+ .ui-state-active,
84
+ .ui-widget-content .ui-state-active,
85
+ .ui-widget-header .ui-state-active {
86
+ border: 1px solid #aaaaaa;
87
+ background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
88
+ font-weight: normal;
89
+ color: #212121;
90
+ }
91
+ .ui-state-active a,
92
+ .ui-state-active a:link,
93
+ .ui-state-active a:visited {
94
+ color: #212121;
95
+ text-decoration: none;
96
+ }
97
+
98
+ /* Interaction Cues
99
+ ----------------------------------*/
100
+ .ui-state-highlight,
101
+ .ui-widget-content .ui-state-highlight,
102
+ .ui-widget-header .ui-state-highlight {
103
+ border: 1px solid #fcefa1;
104
+ background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
105
+ color: #363636;
106
+ }
107
+ .ui-state-highlight a,
108
+ .ui-widget-content .ui-state-highlight a,
109
+ .ui-widget-header .ui-state-highlight a {
110
+ color: #363636;
111
+ }
112
+ .ui-state-error,
113
+ .ui-widget-content .ui-state-error,
114
+ .ui-widget-header .ui-state-error {
115
+ border: 1px solid #cd0a0a;
116
+ background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
117
+ color: #cd0a0a;
118
+ }
119
+ .ui-state-error a,
120
+ .ui-widget-content .ui-state-error a,
121
+ .ui-widget-header .ui-state-error a {
122
+ color: #cd0a0a;
123
+ }
124
+ .ui-state-error-text,
125
+ .ui-widget-content .ui-state-error-text,
126
+ .ui-widget-header .ui-state-error-text {
127
+ color: #cd0a0a;
128
+ }
129
+ .ui-priority-primary,
130
+ .ui-widget-content .ui-priority-primary,
131
+ .ui-widget-header .ui-priority-primary {
132
+ font-weight: bold;
133
+ }
134
+ .ui-priority-secondary,
135
+ .ui-widget-content .ui-priority-secondary,
136
+ .ui-widget-header .ui-priority-secondary {
137
+ opacity: .7;
138
+ filter:Alpha(Opacity=70);
139
+ font-weight: normal;
140
+ }
141
+ .ui-state-disabled,
142
+ .ui-widget-content .ui-state-disabled,
143
+ .ui-widget-header .ui-state-disabled {
144
+ opacity: .35;
145
+ filter:Alpha(Opacity=35);
146
+ background-image: none;
147
+ }
148
+ .ui-state-disabled .ui-icon {
149
+ filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
150
+ }
151
+
152
+ /* Icons
153
+ ----------------------------------*/
154
+
155
+ /* states and images */
156
+ .ui-icon {
157
+ width: 16px;
158
+ height: 16px;
159
+ }
160
+ .ui-icon,
161
+ .ui-widget-content .ui-icon {
162
+ background-image: url(images/ui-icons_222222_256x240.png);
163
+ }
164
+ .ui-widget-header .ui-icon {
165
+ background-image: url(images/ui-icons_222222_256x240.png);
166
+ }
167
+ .ui-state-default .ui-icon {
168
+ background-image: url(images/ui-icons_888888_256x240.png);
169
+ }
170
+ .ui-state-hover .ui-icon,
171
+ .ui-state-focus .ui-icon {
172
+ background-image: url(images/ui-icons_454545_256x240.png);
173
+ }
174
+ .ui-state-active .ui-icon {
175
+ background-image: url(images/ui-icons_454545_256x240.png);
176
+ }
177
+ .ui-state-highlight .ui-icon {
178
+ background-image: url(images/ui-icons_2e83ff_256x240.png);
179
+ }
180
+ .ui-state-error .ui-icon,
181
+ .ui-state-error-text .ui-icon {
182
+ background-image: url(images/ui-icons_cd0a0a_256x240.png);
183
+ }
184
+
185
+ /* positioning */
186
+ .ui-icon-blank { background-position: 16px 16px; }
187
+ .ui-icon-carat-1-n { background-position: 0 0; }
188
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
189
+ .ui-icon-carat-1-e { background-position: -32px 0; }
190
+ .ui-icon-carat-1-se { background-position: -48px 0; }
191
+ .ui-icon-carat-1-s { background-position: -64px 0; }
192
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
193
+ .ui-icon-carat-1-w { background-position: -96px 0; }
194
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
195
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
196
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
197
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
198
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
199
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
200
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
201
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
202
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
203
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
204
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
205
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
206
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
207
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
208
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
209
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
210
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
211
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
212
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
213
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
214
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
215
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
216
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
217
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
218
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
219
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
220
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
221
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
222
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
223
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
224
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
225
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
226
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
227
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
228
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
229
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
230
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
231
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
232
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
233
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
234
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
235
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
236
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
237
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
238
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
239
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
240
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
241
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
242
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
243
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
244
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
245
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
246
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
247
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
248
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
249
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
250
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
251
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
252
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
253
+ .ui-icon-extlink { background-position: -32px -80px; }
254
+ .ui-icon-newwin { background-position: -48px -80px; }
255
+ .ui-icon-refresh { background-position: -64px -80px; }
256
+ .ui-icon-shuffle { background-position: -80px -80px; }
257
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
258
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
259
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
260
+ .ui-icon-folder-open { background-position: -16px -96px; }
261
+ .ui-icon-document { background-position: -32px -96px; }
262
+ .ui-icon-document-b { background-position: -48px -96px; }
263
+ .ui-icon-note { background-position: -64px -96px; }
264
+ .ui-icon-mail-closed { background-position: -80px -96px; }
265
+ .ui-icon-mail-open { background-position: -96px -96px; }
266
+ .ui-icon-suitcase { background-position: -112px -96px; }
267
+ .ui-icon-comment { background-position: -128px -96px; }
268
+ .ui-icon-person { background-position: -144px -96px; }
269
+ .ui-icon-print { background-position: -160px -96px; }
270
+ .ui-icon-trash { background-position: -176px -96px; }
271
+ .ui-icon-locked { background-position: -192px -96px; }
272
+ .ui-icon-unlocked { background-position: -208px -96px; }
273
+ .ui-icon-bookmark { background-position: -224px -96px; }
274
+ .ui-icon-tag { background-position: -240px -96px; }
275
+ .ui-icon-home { background-position: 0 -112px; }
276
+ .ui-icon-flag { background-position: -16px -112px; }
277
+ .ui-icon-calendar { background-position: -32px -112px; }
278
+ .ui-icon-cart { background-position: -48px -112px; }
279
+ .ui-icon-pencil { background-position: -64px -112px; }
280
+ .ui-icon-clock { background-position: -80px -112px; }
281
+ .ui-icon-disk { background-position: -96px -112px; }
282
+ .ui-icon-calculator { background-position: -112px -112px; }
283
+ .ui-icon-zoomin { background-position: -128px -112px; }
284
+ .ui-icon-zoomout { background-position: -144px -112px; }
285
+ .ui-icon-search { background-position: -160px -112px; }
286
+ .ui-icon-wrench { background-position: -176px -112px; }
287
+ .ui-icon-gear { background-position: -192px -112px; }
288
+ .ui-icon-heart { background-position: -208px -112px; }
289
+ .ui-icon-star { background-position: -224px -112px; }
290
+ .ui-icon-link { background-position: -240px -112px; }
291
+ .ui-icon-cancel { background-position: 0 -128px; }
292
+ .ui-icon-plus { background-position: -16px -128px; }
293
+ .ui-icon-plusthick { background-position: -32px -128px; }
294
+ .ui-icon-minus { background-position: -48px -128px; }
295
+ .ui-icon-minusthick { background-position: -64px -128px; }
296
+ .ui-icon-close { background-position: -80px -128px; }
297
+ .ui-icon-closethick { background-position: -96px -128px; }
298
+ .ui-icon-key { background-position: -112px -128px; }
299
+ .ui-icon-lightbulb { background-position: -128px -128px; }
300
+ .ui-icon-scissors { background-position: -144px -128px; }
301
+ .ui-icon-clipboard { background-position: -160px -128px; }
302
+ .ui-icon-copy { background-position: -176px -128px; }
303
+ .ui-icon-contact { background-position: -192px -128px; }
304
+ .ui-icon-image { background-position: -208px -128px; }
305
+ .ui-icon-video { background-position: -224px -128px; }
306
+ .ui-icon-script { background-position: -240px -128px; }
307
+ .ui-icon-alert { background-position: 0 -144px; }
308
+ .ui-icon-info { background-position: -16px -144px; }
309
+ .ui-icon-notice { background-position: -32px -144px; }
310
+ .ui-icon-help { background-position: -48px -144px; }
311
+ .ui-icon-check { background-position: -64px -144px; }
312
+ .ui-icon-bullet { background-position: -80px -144px; }
313
+ .ui-icon-radio-on { background-position: -96px -144px; }
314
+ .ui-icon-radio-off { background-position: -112px -144px; }
315
+ .ui-icon-pin-w { background-position: -128px -144px; }
316
+ .ui-icon-pin-s { background-position: -144px -144px; }
317
+ .ui-icon-play { background-position: 0 -160px; }
318
+ .ui-icon-pause { background-position: -16px -160px; }
319
+ .ui-icon-seek-next { background-position: -32px -160px; }
320
+ .ui-icon-seek-prev { background-position: -48px -160px; }
321
+ .ui-icon-seek-end { background-position: -64px -160px; }
322
+ .ui-icon-seek-start { background-position: -80px -160px; }
323
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
324
+ .ui-icon-seek-first { background-position: -80px -160px; }
325
+ .ui-icon-stop { background-position: -96px -160px; }
326
+ .ui-icon-eject { background-position: -112px -160px; }
327
+ .ui-icon-volume-off { background-position: -128px -160px; }
328
+ .ui-icon-volume-on { background-position: -144px -160px; }
329
+ .ui-icon-power { background-position: 0 -176px; }
330
+ .ui-icon-signal-diag { background-position: -16px -176px; }
331
+ .ui-icon-signal { background-position: -32px -176px; }
332
+ .ui-icon-battery-0 { background-position: -48px -176px; }
333
+ .ui-icon-battery-1 { background-position: -64px -176px; }
334
+ .ui-icon-battery-2 { background-position: -80px -176px; }
335
+ .ui-icon-battery-3 { background-position: -96px -176px; }
336
+ .ui-icon-circle-plus { background-position: 0 -192px; }
337
+ .ui-icon-circle-minus { background-position: -16px -192px; }
338
+ .ui-icon-circle-close { background-position: -32px -192px; }
339
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
340
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
341
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
342
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
343
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
344
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
345
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
346
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
347
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
348
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
349
+ .ui-icon-circle-check { background-position: -208px -192px; }
350
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
351
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
352
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
353
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
354
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
355
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
356
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
357
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
358
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
359
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
360
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
361
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
362
+
363
+
364
+ /* Misc visuals
365
+ ----------------------------------*/
366
+
367
+ /* Corner radius */
368
+ .ui-corner-all,
369
+ .ui-corner-top,
370
+ .ui-corner-left,
371
+ .ui-corner-tl {
372
+ border-top-left-radius: 4px;
373
+ }
374
+ .ui-corner-all,
375
+ .ui-corner-top,
376
+ .ui-corner-right,
377
+ .ui-corner-tr {
378
+ border-top-right-radius: 4px;
379
+ }
380
+ .ui-corner-all,
381
+ .ui-corner-bottom,
382
+ .ui-corner-left,
383
+ .ui-corner-bl {
384
+ border-bottom-left-radius: 4px;
385
+ }
386
+ .ui-corner-all,
387
+ .ui-corner-bottom,
388
+ .ui-corner-right,
389
+ .ui-corner-br {
390
+ border-bottom-right-radius: 4px;
391
+ }
392
+
393
+ /* Overlays */
394
+ .ui-widget-overlay {
395
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
396
+ opacity: .3;
397
+ filter: Alpha(Opacity=30);
398
+ }
399
+ .ui-widget-shadow {
400
+ margin: -8px 0 0 -8px;
401
+ padding: 8px;
402
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
403
+ opacity: .3;
404
+ filter: Alpha(Opacity=30);
405
+ border-radius: 8px;
406
+ }
drkfr/custom-meta-boxes.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'drkfr_DEV') )
3
+ define( 'drkfr_DEV', false );
4
+
5
+ if ( ! defined( 'drkfr_PATH') )
6
+ define( 'drkfr_PATH', plugin_dir_path( __FILE__ ) );
7
+
8
+ if ( ! defined( 'drkfr_URL' ) )
9
+ define( 'drkfr_URL', plugins_url( '', __FILE__ ) );
10
+
11
+ include_once( drkfr_PATH . '/classes.fields.php' );
12
+ include_once( drkfr_PATH . '/class.drkfr-meta-box.php' );
13
+
14
+ // Make it possible to add fields in locations other than post edit screen.
15
+ include_once( drkfr_PATH . '/fields-anywhere.php' );
16
+
17
+ // include_once( drkfr_PATH . '/example-functions.php' );
18
+
19
+ /**
20
+ * Get all the meta boxes on init
21
+ *
22
+ * @return null
23
+ */
24
+ function drkfr_init() {
25
+
26
+ if ( ! is_admin() )
27
+ return;
28
+
29
+ // Load translations
30
+ $textdomain = 'drkfr';
31
+ $locale = apply_filters( 'plugin_locale', get_locale(), $textdomain );
32
+
33
+ // By default, try to load language files from /wp-content/languages/custom-meta-boxes/
34
+ load_textdomain( $textdomain, WP_LANG_DIR . '/custom-meta-boxes/' . $textdomain . '-' . $locale . '.mo' );
35
+ load_textdomain( $textdomain, drkfr_PATH . '/languages/' . $textdomain . '-' . $locale . '.mo' );
36
+
37
+ $meta_boxes = apply_filters( 'drkfr_meta_boxes', array() );
38
+
39
+ if ( ! empty( $meta_boxes ) )
40
+ foreach ( $meta_boxes as $meta_box )
41
+ new drkfr_Meta_Box( $meta_box );
42
+
43
+ }
44
+ add_action( 'init', 'drkfr_init', 50 );
45
+
46
+ /**
47
+ * Return an array of built in available fields
48
+ *
49
+ * Key is field name, Value is class used by field.
50
+ * Available fields can be modified using the 'drkfr_field_types' filter.
51
+ *
52
+ * @return array
53
+ */
54
+ function _drkfr_available_fields() {
55
+
56
+ return apply_filters( 'drkfr_field_types', array(
57
+ 'text' => 'drkfr_Text_Field',
58
+ 'text_small' => 'drkfr_Text_Small_Field',
59
+ 'text_url' => 'drkfr_URL_Field',
60
+ 'url' => 'drkfr_URL_Field',
61
+ 'radio' => 'drkfr_Radio_Field',
62
+ 'checkbox' => 'drkfr_Checkbox',
63
+ 'file' => 'drkfr_File_Field',
64
+ 'image' => 'drkfr_Image_Field',
65
+ 'wysiwyg' => 'drkfr_wysiwyg',
66
+ 'textarea' => 'drkfr_Textarea_Field',
67
+ 'textarea_code' => 'drkfr_Textarea_Field_Code',
68
+ 'select' => 'drkfr_Select',
69
+ 'taxonomy_select' => 'drkfr_Taxonomy',
70
+ 'post_select' => 'drkfr_Post_Select',
71
+ 'date' => 'drkfr_Date_Field',
72
+ 'date_unix' => 'drkfr_Date_Timestamp_Field',
73
+ 'datetime_unix' => 'drkfr_Datetime_Timestamp_Field',
74
+ 'time' => 'drkfr_Time_Field',
75
+ 'colorpicker' => 'drkfr_Color_Picker',
76
+ 'title' => 'drkfr_Title',
77
+ 'group' => 'drkfr_Group_Field',
78
+ 'gmap' => 'drkfr_Gmap_Field',
79
+ ) );
80
+
81
+ }
82
+
83
+ /**
84
+ * Get a field class by type
85
+ *
86
+ * @param string $type
87
+ * @return string $class, or false if not found.
88
+ */
89
+ function _drkfr_field_class_for_type( $type ) {
90
+
91
+ $map = _drkfr_available_fields();
92
+
93
+ if ( isset( $map[$type] ) )
94
+ return $map[$type];
95
+
96
+ return false;
97
+
98
+ }
99
+
100
+ /**
101
+ * For the order of repeatable fields to be guaranteed, orderby meta_id needs to be set.
102
+ * Note usermeta has a different meta_id column name.
103
+ *
104
+ * Only do this for older versions as meta is now ordered by ID (since 3.8)
105
+ * See http://core.trac.wordpress.org/ticket/25511
106
+ *
107
+ * @param string $query
108
+ * @return string $query
109
+ */
110
+ function drkfr_fix_meta_query_order($query) {
111
+
112
+ $pattern = '/^SELECT (post_id|user_id), meta_key, meta_value FROM \w* WHERE post_id IN \([\d|,]*\)$/';
113
+
114
+ if (
115
+ 0 === strpos( $query, "SELECT post_id, meta_key, meta_value" ) &&
116
+ preg_match( $pattern, $query, $matches )
117
+ ) {
118
+
119
+ if ( isset( $matches[1] ) && 'user_id' == $matches[1] )
120
+ $meta_id_column = 'umeta_id';
121
+ else
122
+ $meta_id_column = 'meta_id';
123
+
124
+ $meta_query_orderby = ' ORDER BY ' . $meta_id_column;
125
+
126
+ if ( false === strpos( $query, $meta_query_orderby ) )
127
+ $query .= $meta_query_orderby;
128
+
129
+ }
130
+
131
+ return $query;
132
+
133
+ }
134
+
135
+ if ( version_compare( get_bloginfo( 'version' ), '3.8', '<' ) )
136
+ add_filter( 'query', 'drkfr_fix_meta_query_order', 1 );
drkfr/fields-anywhere.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Create drkfr Meta boxes anywhere you like (other than the post edit screen).
5
+ *
6
+ * This is functional, but a little hacky.
7
+ */
8
+
9
+ /**
10
+ * Draw the meta boxes in places other than the post edit screen
11
+ *
12
+ * @return null
13
+ */
14
+ function drkfr_draw_meta_boxes( $pages, $context = 'normal', $object = null ) {
15
+
16
+ drkfr_do_meta_boxes( $pages, $context, $object );
17
+
18
+ wp_enqueue_script('post');
19
+
20
+ }
21
+
22
+ /**
23
+ * Meta-Box template function
24
+ *
25
+ * @since 2.5.0
26
+ *
27
+ * @param string|object $screen Screen identifier
28
+ * @param string $context box context
29
+ * @param mixed $object gets passed to the box callback function as first parameter
30
+ * @return int number of meta_boxes
31
+ */
32
+ function drkfr_do_meta_boxes( $screen, $context, $object ) {
33
+
34
+ global $wp_meta_boxes;
35
+
36
+ static $already_sorted = false;
37
+
38
+ if ( empty( $screen ) )
39
+ $screen = get_current_screen();
40
+
41
+ elseif ( is_string( $screen ) )
42
+ $screen = convert_to_screen( $screen );
43
+
44
+ $page = $screen->id;
45
+
46
+ $hidden = get_hidden_meta_boxes( $screen );
47
+
48
+ $i = 0;
49
+
50
+ do {
51
+ // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose
52
+
53
+ if ( ! $already_sorted && $sorted = get_user_option( "meta-box-order_$page" ) )
54
+ foreach ( $sorted as $box_context => $ids )
55
+ foreach ( explode(',', $ids ) as $id )
56
+ if ( $id && 'dashboard_browser_nag' !== $id )
57
+ add_meta_box( $id, null, null, $screen, $box_context, 'sorted' );
58
+
59
+ $already_sorted = true;
60
+
61
+ if ( ! isset( $wp_meta_boxes ) || ! isset( $wp_meta_boxes[$page] ) || ! isset( $wp_meta_boxes[$page][$context] ) )
62
+ break;
63
+
64
+ foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) {
65
+
66
+ if ( isset( $wp_meta_boxes[$page][$context][$priority] ) ) {
67
+
68
+ foreach ( (array) $wp_meta_boxes[$page][$context][$priority] as $box ) {
69
+
70
+ if ( false == $box || ! $box['title'] )
71
+ continue;
72
+
73
+ $i++;
74
+
75
+ $hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : ''; ?>
76
+
77
+ <div id="<?php esc_attr_e( $box['id'] ); ?>" class="<?php esc_attr_e( postbox_classes( $box['id'], $page ) . $hidden_class ); ?>">
78
+
79
+ <?php call_user_func( $box['callback'], $object, $box ); ?>
80
+
81
+ </div>
82
+
83
+ <?php }
84
+
85
+ }
86
+
87
+ }
88
+ } while( 0 );
89
+
90
+ return $i;
91
+
92
+ }
drkfr/images/drkfr-icon-remove.png ADDED
Binary file
drkfr/images/drkfr-icon-remove@2x.png ADDED
Binary file
drkfr/images/wpspin-2x.gif ADDED
Binary file
drkfr/images/wpspin.gif ADDED
Binary file
drkfr/js/drkfr.js ADDED
@@ -0,0 +1,315 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Custom jQuery for Custom Metaboxes and Fields
3
+ */
4
+
5
+ /*jslint browser: true, devel: true, indent: 4, maxerr: 50, sub: true */
6
+ /*global jQuery, tb_show, tb_remove */
7
+
8
+ 'use strict';
9
+
10
+ var drkfr = {
11
+
12
+ _initCallbacks: [],
13
+ _clonedFieldCallbacks: [],
14
+ _deletedFieldCallbacks: [],
15
+
16
+ _sortStartCallbacks: [],
17
+ _sortEndCallbacks: [],
18
+
19
+ init : function() {
20
+
21
+ jQuery( '.field.repeatable' ).each( function() {
22
+ drkfr.isMaxFields( jQuery(this) );
23
+ } );
24
+
25
+ // Unbind & Re-bind all drkfr events to prevent duplicates.
26
+ jQuery(document).unbind( 'click.drkfr' );
27
+ jQuery(document).on( 'click.drkfr', '.drkfr-delete-field', drkfr.deleteField );
28
+ jQuery(document).on( 'click.drkfr', '.repeat-field', drkfr.repeatField );
29
+
30
+ // When toggling the display of the meta box container - reinitialize
31
+ jQuery(document).on( 'click.drkfr', '.postbox h3, .postbox .handlediv', drkfr.init );
32
+
33
+ drkfr.doneInit();
34
+
35
+ jQuery('.field.drkfr-sortable' ).each( function() {
36
+ drkfr.sortableInit( jQuery(this) );
37
+ } );
38
+
39
+
40
+ },
41
+
42
+ repeatField : function( e ) {
43
+
44
+ var templateField, newT, field, index, attr;
45
+
46
+ field = jQuery( this ).closest('.field' );
47
+
48
+ e.preventDefault();
49
+ jQuery(this).blur();
50
+
51
+ if ( drkfr.isMaxFields( field, 1 ) )
52
+ return;
53
+
54
+ templateField = field.children( '.field-item.hidden' );
55
+
56
+ newT = templateField.clone();
57
+ newT.removeClass( 'hidden' );
58
+
59
+ var excludeInputTypes = '[type=submit],[type=button],[type=checkbox],[type=radio],[readonly]';
60
+ newT.find( 'input' ).not( excludeInputTypes ).val( '' );
61
+
62
+ newT.find( '.drkfr_upload_status' ).html('');
63
+
64
+ newT.insertBefore( templateField );
65
+
66
+ // Recalculate group ids & update the name fields..
67
+ index = 0;
68
+ attr = ['id','name','for','data-id','data-name'];
69
+
70
+ field.children( '.field-item' ).not( templateField ).each( function() {
71
+
72
+ var search = field.hasClass( 'drkfr_Group_Field' ) ? /drkfr-group-(\d|x)*/g : /drkfr-field-(\d|x)*/g;
73
+ var replace = field.hasClass( 'drkfr_Group_Field' ) ? 'drkfr-group-' + index : 'drkfr-field-' + index;
74
+
75
+ jQuery(this).find( '[' + attr.join('],[') + ']' ).each( function() {
76
+
77
+ for ( var i = 0; i < attr.length; i++ )
78
+ if ( typeof( jQuery(this).attr( attr[i] ) ) !== 'undefined' )
79
+ jQuery(this).attr( attr[i], jQuery(this).attr( attr[i] ).replace( search, replace ) );
80
+
81
+ } );
82
+
83
+ index += 1;
84
+
85
+ } );
86
+
87
+ drkfr.clonedField( newT );
88
+
89
+ if ( field.hasClass( 'drkfr-sortable' ) )
90
+ drkfr.sortableInit( field );
91
+
92
+
93
+ },
94
+
95
+ deleteField : function( e ) {
96
+
97
+ var fieldItem, field;
98
+
99
+ e.preventDefault();
100
+ jQuery(this).blur();
101
+
102
+ if ( ! confirm( drkfrData.strings.confirmDeleteField ) ) {
103
+ return;
104
+ }
105
+
106
+ fieldItem = jQuery( this ).closest('.field-item' );
107
+ field = fieldItem.closest( '.field' );
108
+
109
+ drkfr.isMaxFields( field, -1 );
110
+ drkfr.deletedField( fieldItem );
111
+
112
+ fieldItem.remove();
113
+
114
+ },
115
+
116
+ /**
117
+ * Prevent having more than the maximum number of repeatable fields.
118
+ * When called, if there is the maximum, disable .repeat-field button.
119
+ * Note: Information Passed using data-max attribute on the .field element.
120
+ *
121
+ * @param jQuery .field
122
+ * @param int modifier - adjust count by this ammount. 1 If adding a field, 0 if checking, -1 if removing a field... etc
123
+ * @return null
124
+ */
125
+ isMaxFields: function( field, modifier ) {
126
+
127
+ var count, addBtn, min, max, count;
128
+
129
+ modifier = (modifier) ? parseInt( modifier, 10 ) : 0;
130
+
131
+ addBtn = field.children( '.repeat-field' );
132
+ count = field.children('.field-item').not('.hidden').length + modifier; // Count after anticipated action (modifier)
133
+ max = field.attr( 'data-rep-max' );
134
+
135
+ // Show all the remove field buttons.
136
+ field.find( '> .field-item > .drkfr-delete-field, > .field-item > .group > .drkfr-delete-field' ).show();
137
+
138
+ if ( typeof( max ) === 'undefined' )
139
+ return false;
140
+
141
+ // Disable the add new field button?
142
+ if ( count >= parseInt( max, 10 ) )
143
+ addBtn.attr( 'disabled', 'disabled' );
144
+ else
145
+ addBtn.removeAttr( 'disabled' );
146
+
147
+ if ( count > parseInt( max, 10 ) )
148
+ return true;
149
+
150
+ },
151
+
152
+ addCallbackForInit: function( callback ) {
153
+
154
+ this._initCallbacks.push( callback )
155
+
156
+ },
157
+
158
+ /**
159
+ * Fire init callbacks.
160
+ * Called when drkfr has been set up.
161
+ */
162
+ doneInit: function() {
163
+
164
+ var _this = this,
165
+ callbacks = drkfr._initCallbacks;
166
+
167
+ if ( callbacks ) {
168
+ for ( var a = 0; a < callbacks.length; a++) {
169
+ callbacks[a]();
170
+ }
171
+ }
172
+
173
+ },
174
+
175
+ addCallbackForClonedField: function( fieldName, callback ) {
176
+
177
+ if ( jQuery.isArray( fieldName ) )
178
+ for ( var i = 0; i < fieldName.length; i++ )
179
+ drkfr.addCallbackForClonedField( fieldName[i], callback );
180
+
181
+ this._clonedFieldCallbacks[fieldName] = this._clonedFieldCallbacks[fieldName] ? this._clonedFieldCallbacks[fieldName] : []
182
+ this._clonedFieldCallbacks[fieldName].push( callback )
183
+
184
+ },
185
+
186
+ /**
187
+ * Fire clonedField callbacks.
188
+ * Called when a field has been cloned.
189
+ */
190
+ clonedField: function( el ) {
191
+
192
+ // also check child elements
193
+ el.add( el.find( 'div[data-class]' ) ).each( function( i, el ) {
194
+
195
+ el = jQuery( el )
196
+ var callbacks = drkfr._clonedFieldCallbacks[el.attr( 'data-class') ]
197
+
198
+ if ( callbacks )
199
+ for ( var a = 0; a < callbacks.length; a++ )
200
+ callbacks[a]( el );
201
+
202
+ })
203
+ },
204
+
205
+ addCallbackForDeletedField: function( fieldName, callback ) {
206
+
207
+ if ( jQuery.isArray( fieldName ) )
208
+ for ( var i = 0; i < fieldName.length; i++ )
209
+ drkfr._deletedFieldCallbacks( fieldName[i], callback );
210
+
211
+ this._deletedFieldCallbacks[fieldName] = this._deletedFieldCallbacks[fieldName] ? this._deletedFieldCallbacks[fieldName] : []
212
+ this._deletedFieldCallbacks[fieldName].push( callback )
213
+
214
+ },
215
+
216
+ /**
217
+ * Fire deletedField callbacks.
218
+ * Called when a field has been cloned.
219
+ */
220
+ deletedField: function( el ) {
221
+
222
+ // also check child elements
223
+ el.add( el.find( 'div[data-class]' ) ).each( function(i, el) {
224
+
225
+ el = jQuery( el )
226
+ var callbacks = drkfr._deletedFieldCallbacks[el.attr( 'data-class') ]
227
+
228
+ if ( callbacks )
229
+ for ( var a = 0; a < callbacks.length; a++ )
230
+ callbacks[a]( el )
231
+
232
+ })
233
+ },
234
+
235
+ sortableInit : function( field ) {
236
+
237
+ var items = field.find(' > .field-item').not('.hidden');
238
+
239
+ field.find( '> .field-item > .drkfr-handle' ).remove();
240
+
241
+ items.each( function() {
242
+ jQuery(this).append( '<div class="drkfr-handle"></div>' );
243
+ } );
244
+
245
+ field.sortable( {
246
+ handle: "> .drkfr-handle" ,
247
+ cursor: "move",
248
+ items: " > .field-item",
249
+ beforeStop: function( event, ui ) { drkfr.sortStart( jQuery( ui.item[0] ) ); },
250
+ deactivate: function( event, ui ) { drkfr.sortEnd( jQuery( ui.item[0] ) ); },
251
+ } );
252
+
253
+ },
254
+
255
+ sortStart : function ( el ) {
256
+
257
+ // also check child elements
258
+ el.add( el.find( 'div[data-class]' ) ).each( function(i, el) {
259
+
260
+ el = jQuery( el )
261
+ var callbacks = drkfr._sortStartCallbacks[el.attr( 'data-class') ]
262
+
263
+ if ( callbacks )
264
+ for ( var a = 0; a < callbacks.length; a++ )
265
+ callbacks[a]( el )
266
+
267
+ })
268
+
269
+ },
270
+
271
+ addCallbackForSortStart: function( fieldName, callback ) {
272
+
273
+ if ( jQuery.isArray( fieldName ) )
274
+ for ( var i = 0; i < fieldName.length; i++ )
275
+ drkfr.addCallbackForSortStart( fieldName[i], callback );
276
+
277
+ this._sortStartCallbacks[fieldName] = this._sortStartCallbacks[fieldName] ? this._sortStartCallbacks[fieldName] : []
278
+ this._sortStartCallbacks[fieldName].push( callback )
279
+
280
+ },
281
+
282
+ sortEnd : function ( el ) {
283
+
284
+ // also check child elements
285
+ el.add( el.find( 'div[data-class]' ) ).each( function(i, el) {
286
+
287
+ el = jQuery( el )
288
+ var callbacks = drkfr._sortEndCallbacks[el.attr( 'data-class') ]
289
+
290
+ if ( callbacks )
291
+ for ( var a = 0; a < callbacks.length; a++ )
292
+ callbacks[a]( el )
293
+
294
+ })
295
+
296
+ },
297
+
298
+ addCallbackForSortEnd: function( fieldName, callback ) {
299
+
300
+ if ( jQuery.isArray( fieldName ) )
301
+ for ( var i = 0; i < fieldName.length; i++ )
302
+ drkfr.addCallbackForSortEnd( fieldName[i], callback );
303
+
304
+ this._sortEndCallbacks[fieldName] = this._sortEndCallbacks[fieldName] ? this._sortEndCallbacks[fieldName] : []
305
+ this._sortEndCallbacks[fieldName].push( callback )
306
+
307
+ }
308
+
309
+ }
310
+
311
+ jQuery(document).ready( function() {
312
+
313
+ drkfr.init();
314
+
315
+ });
drkfr/js/field-gmap.js ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*jshint devel:true */
2
+ /*global google */
3
+
4
+ (function($) {
5
+
6
+ var drkfrGmapsInit = function( fieldEl ) {
7
+
8
+ var searchInput = $('.map-search', fieldEl ).get(0);
9
+ var mapCanvas = $('.map', fieldEl ).get(0);
10
+ var latitude = $('.latitude', fieldEl );
11
+ var longitude = $('.longitude', fieldEl );
12
+ var elevation = $('.elevation', fieldEl );
13
+ var elevator = new google.maps.ElevationService();
14
+
15
+ var mapOptions = {
16
+ center: new google.maps.LatLng( drkfrGmaps.defaults.latitude, drkfrGmaps.defaults.longitude ),
17
+ zoom: parseInt( drkfrGmaps.defaults.zoom ),
18
+ mapTypeId: google.maps.MapTypeId.ROADMAP
19
+ };
20
+
21
+ var map = new google.maps.Map( mapCanvas, mapOptions );
22
+
23
+ // Marker
24
+ var markerOptions = {
25
+ map: map,
26
+ draggable: true,
27
+ title: drkfrGmaps.strings.markerTitle
28
+ };
29
+
30
+ var marker = new google.maps.Marker( markerOptions );
31
+ marker.setPosition( mapOptions.center );
32
+
33
+ function setPosition( latLng, zoom ) {
34
+
35
+ marker.setPosition( latLng );
36
+ map.setCenter( latLng );
37
+
38
+ if ( zoom ) {
39
+ map.setZoom( zoom );
40
+ }
41
+
42
+ latitude.val( latLng.lat() );
43
+ longitude.val( latLng.lng() );
44
+
45
+ elevator.getElevationForLocations( { locations: [ marker.getPosition() ] }, function (results, status) {
46
+ if (status == google.maps.ElevationStatus.OK && results[0] ) {
47
+ elevation.val( results[0].elevation );
48
+ }
49
+ });
50
+
51
+ }
52
+
53
+ // Set stored Coordinates
54
+ if ( latitude.val() && longitude.val() ) {
55
+ latLng = new google.maps.LatLng( latitude.val(), longitude.val() );
56
+ setPosition( latLng, 17 )
57
+ }
58
+
59
+ google.maps.event.addListener( marker, 'dragend', function() {
60
+ setPosition( marker.getPosition() );
61
+ });
62
+
63
+ // Search
64
+ var autocomplete = new google.maps.places.Autocomplete(searchInput);
65
+ autocomplete.bindTo('bounds', map);
66
+
67
+ google.maps.event.addListener(autocomplete, 'place_changed', function() {
68
+ var place = autocomplete.getPlace();
69
+ if (place.geometry.viewport) {
70
+ map.fitBounds(place.geometry.viewport);
71
+ }
72
+
73
+ setPosition( place.geometry.location, 17 );
74
+
75
+ });
76
+
77
+ $(searchInput).keypress(function(e) {
78
+ if (e.keyCode === 13) {
79
+ e.preventDefault();
80
+ }
81
+ });
82
+
83
+ }
84
+
85
+ drkfr.addCallbackForInit( function() {
86
+ $('.drkfr_Gmap_Field .field-item').each(function() {
87
+ drkfrGmapsInit( $(this) );
88
+ });
89
+ } );
90
+
91
+ drkfr.addCallbackForClonedField( ['drkfr_Gmap_Field'], drkfrGmapsInit );
92
+
93
+ }(jQuery));
drkfr/js/field-wysiwyg.js ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ drkfr.addCallbackForDeletedField( 'drkfr_wysiwyg', function( el ) {
2
+
3
+ // Destroy WYSIWYG editors instances.
4
+ el.find( '.drkfr-wysiwyg textarea' ).each( function() {
5
+ var instance = tinyMCE.get( jQuery(this).attr('id') );
6
+ if ( instance !== null && typeof( instance ) !== 'undefined' )
7
+ instance.remove();
8
+ } );
9
+
10
+ } );
11
+
12
+ drkfr.addCallbackForClonedField( 'drkfr_wysiwyg', function( newT ) {
13
+
14
+ newT.find( '.drkfr-wysiwyg' ).each( function (i) {
15
+
16
+ var el, id, name, ed, dom, i, fieldId, nameRegex, idRegex;
17
+
18
+ el = jQuery(this);
19
+ id = el.attr( 'data-id' );
20
+ name = el.attr( 'data-name' );
21
+ ed = tinyMCE.get(id);
22
+ fieldId = el.attr('data-field-id'); //Field identifier, not including field/group index.,
23
+
24
+ if ( ed )
25
+ return;
26
+
27
+ nameRegex = new RegExp( 'drkfr-placeholder-name-' + fieldId, 'g' );
28
+ idRegex = new RegExp( 'drkfr-placeholder-id-' + fieldId, 'g' );
29
+
30
+ // Placeholder markup for the new wysiwyg is stored as a prop on var drkfr_wysiwyg_editors
31
+ // Copy, update ids & names & insert.
32
+ el.html( drkfr_wysiwyg_editors[fieldId].replace( nameRegex, name ).replace( idRegex, id ) );
33
+
34
+ // If no settings for this field. Clone from placeholder.
35
+ if ( typeof( tinyMCEPreInit.mceInit[ id ] ) === 'undefined' ) {
36
+ var newSettings = jQuery.extend( {}, tinyMCEPreInit.mceInit[ 'drkfr-placeholder-id-' + fieldId ] );
37
+ for ( var prop in newSettings )
38
+ if ( 'string' === typeof( newSettings[prop] ) )
39
+ newSettings[prop] = newSettings[prop].replace( idRegex, id ).replace( nameRegex, name );
40
+ tinyMCEPreInit.mceInit[ id ] = newSettings;
41
+ }
42
+
43
+ // If no Quicktag settings for this field. Clone from placeholder.
44
+ if ( typeof( tinyMCEPreInit.qtInit[ id ] ) === 'undefined' ) {
45
+ var newQTS = jQuery.extend( {}, tinyMCEPreInit.qtInit[ 'drkfr-placeholder-id-' + fieldId ] );
46
+ for ( var prop in newQTS )
47
+ if ( 'string' === typeof( newQTS[prop] ) )
48
+ newQTS[prop] = newQTS[prop].replace( idRegex, id ).replace( nameRegex, name );
49
+ tinyMCEPreInit.qtInit[ id ] = newQTS;
50
+ }
51
+
52
+ var mode = el.find('.wp-editor-wrap').hasClass('tmce-active') ? 'tmce' : 'html';
53
+
54
+ // If current mode is visual, create the tinyMCE.
55
+ if ( 'tmce' === mode ) {
56
+ if ( tinyMCE.majorVersion === '4' ) {
57
+ var ed = tinymce.init( tinyMCEPreInit.mceInit[id] );
58
+ } else if ( tinyMCE.majorVersion === '3' ) {
59
+ var ed = new tinymce.Editor( id, tinyMCEPreInit.mceInit[id] );
60
+ ed.render();
61
+ }
62
+ }
63
+
64
+ // Init Quicktags.
65
+ QTags.instances[0] = undefined;
66
+ try { quicktags( tinyMCEPreInit.qtInit[id] ); } catch(e){}
67
+
68
+ } );
69
+
70
+ } );
71
+
72
+
73
+ drkfr.addCallbackForSortStart( 'drkfr_wysiwyg', function( el ) {
74
+
75
+ el.find( '.wp-editor-area' ).each(function(){
76
+ var id = jQuery(this).attr('id');
77
+
78
+ if ( tinyMCE.majorVersion === '4' ) {
79
+ tinyMCE.execCommand('mceRemoveEditor', false, id);
80
+ } else if ( tinyMCE.majorVersion === '3' ) {
81
+ tinyMCE.execCommand('mceRemoveControl', false, id);
82
+ }
83
+
84
+
85
+ });
86
+
87
+ } );
88
+
89
+ drkfr.addCallbackForSortEnd( 'drkfr_wysiwyg', function( el ) {
90
+
91
+ el.find( '.wp-editor-area' ).each(function(){
92
+
93
+ var id = jQuery(this).attr('id'),
94
+ mode = jQuery(this).closest('.wp-editor-wrap').hasClass('tmce-active') ? 'tmce' : 'html';
95
+
96
+ if ( 'tmce' === mode ) {
97
+ if ( tinyMCE.majorVersion === '4' ) {
98
+ tinyMCE.execCommand('mceAddEditor', false, id);
99
+ } else if ( tinyMCE.majorVersion === '3' ) {
100
+ tinyMCE.execCommand('mceAddControl', false, id);
101
+ }
102
+ }
103
+
104
+ });
105
+
106
+ } );
drkfr/js/field.colorpicker.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * ColorPickers
3
+ */
4
+
5
+ drkfr.addCallbackForInit( function() {
6
+
7
+ // Colorpicker
8
+ jQuery('input:text.drkfr_colorpicker').wpColorPicker();
9
+
10
+ } );
11
+
12
+ drkfr.addCallbackForClonedField( 'drkfr_Color_Picker', function( newT ) {
13
+
14
+ // Reinitialize colorpickers
15
+ newT.find('.wp-color-result').remove();
16
+ newT.find('input:text.drkfr_colorpicker').wpColorPicker();
17
+
18
+ } );
drkfr/js/field.datetime.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /**
3
+ * Date & Time Fields
4
+ */
5
+
6
+ drkfr.addCallbackForClonedField( ['drkfr_Date_Field', 'drkfr_Time_Field', 'drkfr_Date_Timestamp_Field', 'drkfr_Datetime_Timestamp_Field' ], function( newT ) {
7
+
8
+ // Reinitialize all the datepickers
9
+ newT.find( '.drkfr_datepicker' ).each(function () {
10
+ jQuery(this).attr( 'id', '' ).removeClass( 'hasDatepicker' ).removeData( 'datepicker' ).unbind().datepicker();
11
+ });
12
+
13
+ // Reinitialize all the timepickers.
14
+ newT.find('.drkfr_timepicker' ).each(function () {
15
+ jQuery(this).timePicker({
16
+ startTime: "00:00",
17
+ endTime: "23:30",
18
+ show24Hours: false,
19
+ separator: ':',
20
+ step: 30
21
+ });
22
+ });
23
+
24
+ } );
25
+
26
+ drkfr.addCallbackForInit( function() {
27
+
28
+ // Datepicker
29
+ jQuery('.drkfr_datepicker').each(function () {
30
+ jQuery(this).datepicker();
31
+ });
32
+
33
+ // Wrap date picker in class to narrow the scope of jQuery UI CSS and prevent conflicts
34
+ jQuery("#ui-datepicker-div").wrap('<div class="drkfr_element" />');
35
+
36
+ // Timepicker
37
+ jQuery('.drkfr_timepicker').each(function () {
38
+ jQuery(this).timePicker({
39
+ startTime: "00:00",
40
+ endTime: "23:30",
41
+ show24Hours: false,
42
+ separator: ':',
43
+ step: 30
44
+ });
45
+ } );
46
+
47
+ });
drkfr/js/field.select.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var drkfrSelectInit = function() {
2
+
3
+ jQuery( '.drkfr_select' ).each( function() {
4
+
5
+ var el = jQuery(this);
6
+ var fieldID = el.attr( 'data-field-id'); // JS Friendly ID
7
+
8
+ // If fieldID is set
9
+ // If fieldID options exist
10
+ // If Element is not hidden template field.
11
+ // If elemnt has not already been initialized.
12
+ if ( fieldID && fieldID in window.drkfr_select_fields && el.is( ':visible' ) && ! el.hasClass( 'select2-added' ) ) {
13
+
14
+ // Get options for this field.
15
+ options = window.drkfr_select_fields[fieldID];
16
+
17
+ el.addClass( 'select2-added' ).select2( options );
18
+
19
+ }
20
+
21
+ })
22
+
23
+ };
24
+
25
+ // Hook this in for all the required fields.
26
+ drkfr.addCallbackForInit( drkfrSelectInit );
27
+ drkfr.addCallbackForClonedField( 'drkfr_Select', drkfrSelectInit );
28
+ drkfr.addCallbackForClonedField( 'drkfr_Post_Select', drkfrSelectInit );
29
+ drkfr.addCallbackForClonedField( 'drkfr_Taxonomy', drkfrSelectInit );
drkfr/js/file-upload.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( document ).ready( function() {
2
+
3
+ jQuery( document ).on( 'click', '.drkfr-file-upload', function(e) {
4
+
5
+ e.preventDefault();
6
+
7
+ var link = jQuery( this );
8
+ var container = jQuery( this ).parent();
9
+
10
+ var frameArgs = {
11
+ multiple: false,
12
+ title: 'Select File',
13
+ }
14
+
15
+ library = container.attr( 'data-type' ).split(',');
16
+ if ( library.length > 0 )
17
+ frameArgs.library = { type: library }
18
+
19
+ var drkfr_Frame = wp.media( frameArgs );
20
+
21
+ drkfr_Frame.on( 'select', function() {
22
+
23
+ var selection = drkfr_Frame.state().get('selection'),
24
+ model = selection.first(),
25
+ fileHolder = container.find( '.drkfr-file-holder' );
26
+
27
+ jQuery( container ).find( '.drkfr-file-upload-input' ).val( model.id );
28
+
29
+ link.hide(); // Hide 'add media' button
30
+
31
+ drkfr_Frame.close();
32
+
33
+ fileHolder.html( '' );
34
+ fileHolder.show();
35
+ fileHolder.siblings( '.drkfr-remove-file' ).show();
36
+
37
+ var fieldType = container.closest( '.field-item' ).attr( 'data-class' );
38
+
39
+ if ( 'drkfr_Image_Field' === fieldType ) {
40
+
41
+ var data = {
42
+ action: 'drkfr_request_image',
43
+ id: model.attributes.id,
44
+ width: container.width(),
45
+ height: container.height(),
46
+ crop: fileHolder.attr('data-crop'),
47
+ nonce: link.attr( 'data-nonce' )
48
+ }
49
+
50
+ fileHolder.addClass( 'drkfr-loading' );
51
+
52
+ jQuery.post( ajaxurl, data, function( src ) {
53
+ // Insert image
54
+ jQuery( '<img />', { src: src } ).prependTo( fileHolder );
55
+ fileHolder.removeClass( 'drkfr-loading' );
56
+ }).fail( function() {
57
+ // Fallback - insert full size image.
58
+ jQuery( '<img />', { src: model.attributes.url } ).prependTo( fileHolder );
59
+ fileHolder.removeClass( 'drkfr-loading' );
60
+ });
61
+
62
+ } else {
63
+
64
+ jQuery( '<img />', { src: model.attributes.icon } ).prependTo( fileHolder );
65
+ fileHolder.append( jQuery('<div class="drkfr-file-name" />').html( '<strong>' + model.attributes.filename + '</strong>' ) );
66
+
67
+ }
68
+
69
+ });
70
+
71
+ drkfr_Frame.open();
72
+
73
+ } );
74
+
75
+ jQuery( document ).on( 'click', '.drkfr-remove-file', function(e) {
76
+
77
+ e.preventDefault();
78
+
79
+ var container = jQuery( this ).parent().parent();
80
+
81
+ container.find( '.drkfr-file-holder' ).html( '' ).hide();
82
+ container.find( '.drkfr-file-upload-input' ).val( '' );
83
+ container.find( '.drkfr-file-upload' ).show().css( 'display', 'inline-block' );
84
+ container.find( '.drkfr-remove-file' ).hide();
85
+
86
+ } );
87
+
88
+ /**
89
+ * Recalculate the dimensions of the file upload field.
90
+ * It should never be larger than the available width.
91
+ * It should maintain the aspect ratio of the original field.
92
+ * It should recalculate when resized.
93
+ * @return {[type]} [description]
94
+ */
95
+ var recalculateFileFieldSize = function() {
96
+
97
+ jQuery( '.drkfr-file-wrap' ).each( function() {
98
+
99
+ var el = jQuery(this),
100
+ container = el.closest( '.postbox' ),
101
+ width = container.width() - 12 - 10 - 10,
102
+ ratio = el.height() / el.width();
103
+
104
+ if ( el.attr( 'data-original-width' ) )
105
+ el.width( el.attr( 'data-original-width' ) );
106
+ else
107
+ el.attr( 'data-original-width', el.width() );
108
+
109
+ if ( el.attr( 'data-original-height' ) )
110
+ el.height( el.attr( 'data-original-height' ) );
111
+ else
112
+ el.attr( 'data-original-height', el.height() );
113
+
114
+ if ( el.width() > width ) {
115
+ el.width( width );
116
+ el.find( '.drkfr-file-wrap-placeholder' ).width( width - 8 );
117
+ el.height( width * ratio );
118
+ el.css( 'line-height', ( width * ratio ) + 'px' );
119
+ el.find( '.drkfr-file-wrap-placeholder' ).height( ( width * ratio ) - 8 );
120
+ }
121
+
122
+
123
+ } );
124
+ }
125
+
126
+ recalculateFileFieldSize();
127
+ jQuery(window).resize( recalculateFileFieldSize );
128
+
129
+ } );
drkfr/js/jquery.timePicker.min.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * A time picker for jQuery
3
+ *
4
+ * Dual licensed under the MIT and GPL licenses.
5
+ * Copyright (c) 2009 Anders Fajerson and 2013 Dennis Burke
6
+ * @name timePicker
7
+ * @author Anders Fajerson (http://perifer.se)
8
+ * @example $("#mytime").timePicker();
9
+ * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"});
10
+ *
11
+ * Based on timePicker by Sam Collet (http://www.texotela.co.uk/code/jquery/timepicker/)
12
+ *
13
+ * Options:
14
+ * step: # of minutes to step the time by
15
+ * startTime: beginning of the range of acceptable times
16
+ * endTime: end of the range of acceptable times
17
+ * separator: separator string to use between hours and minutes (e.g. ':')
18
+ * show24Hours: use a 24-hour scheme
19
+ */
20
+ (function(e){"use strict";function n(t,n,r){t.value=e(n).text();e(t).change();t.focus();r.hide()}function r(e,t){var n=e.getHours();var r=t.show24Hours?n:(n+11)%12+1;var s=e.getMinutes();return i(r)+t.separator+i(s)+(t.show24Hours?"":n<12?" am":" pm")}function i(e){return(e<10?"0":"")+e}function s(e,t){return typeof e==="object"?u(e):o(e,t)}function o(e,t){if(e){e=a(e,t);var n=e.split(t.separator);var r=parseFloat(n[0]);var i=parseFloat(n[1]);if(!t.show24Hours){if(r===12&&e.indexOf("am")!==-1){r=0}else if(r!==12&&e.indexOf("pm")!==-1){r+=12}}var s=new Date(0,0,0,r,i,0);return u(s)}return null}function u(e){e.setFullYear(2001);e.setMonth(0);e.setDate(0);return e}function a(e,t){var n,r,i,s,o,u;if(t.show24Hours){return e}if(e){r=e.toLowerCase().replace(/\s*/g,"");if(n=/^(\d{1,2})(a|p)m*$/.exec(r)){if(parseInt(n[1],10)<12){return""+n[1]+":00"+n[2]+"m"}}else if(i=/^(\d{1,2}):(\d{1,2})(a|p)m*$/.exec(r)){s=parseInt(i[1],10);o=parseInt(i[2],10);u=i[3]+"m";if(s<12||o<59){return""+s+":"+(o>=10?o:o+"0")+u}}else if(i=/^(\d{1,2}):(\d{1,2})$/.exec(r)){s=parseInt(i[1],10);o=parseInt(i[2],10);u="am";if(s<=24&&o<=59){if(s>=12){s=s-12;u="pm"}if(s===0){s=12}return s+":"+o+u}}}}var t={init:function(t){var n=e.extend({},e.fn.timePicker.defaults,t);return this.each(function(){e.timePicker(this,n)})},destroy:function(){return this.each(function(){if(this.timePicker){var t=e(this).data("timepickerdiv");e(this).data("timepickerdiv","");e("#"+t).remove();delete this.timePicker}})}};e.timePicker=function(t,n){try{var r=e(t)[0];return r.timePicker||(r.timePicker=new e._timePicker(r,n))}catch(i){throw"timepicker must be called on an element"}};e.timePicker.version="0.4.0";e._timePicker=function(t,i){var f=false;var l=false;var c=s(i.startTime,i);var h=s(i.endTime,i);var p=i.defaultSelected?s(i.defaultSelected,i):c;var d="selected";var v="li."+d;var m="tp"+(new Date).getTime();e(t).attr("autocomplete","off");e(t).data("timepickerdiv",m);var g=[];var y=new Date(c);while(y<=h){g[g.length]=r(y,i);y=new Date(y.setMinutes(y.getMinutes()+i.step))}var b=e('<div id="'+m+'" class="time-picker'+(i.show24Hours?"":" time-picker-12hours")+'"></div>');var w=e("<ul></ul>");for(var E=0;E<g.length;E+=1){w.append("<li>"+g[E]+"</li>")}b.append(w);b.appendTo("body").hide();b.mouseover(function(){f=true}).mouseout(function(){f=false});e("li",w).mouseover(function(){if(!l){e(v,b).removeClass(d);e(this).addClass(d)}}).mousedown(function(){f=true}).click(function(){n(t,this,b,i);f=false});var S=function(){if(b.is(":visible")){return false}e("li",b).removeClass(d);var n=e(t).offset();b.css({top:n.top+t.offsetHeight,left:n.left});b.show();var s=t.value?o(t.value,i):p;var a=c.getHours()*60+c.getMinutes();var f=s.getHours()*60+s.getMinutes()-a;var l=Math.round(f/i.step);var v=u(new Date(0,0,0,0,l*i.step+a,0));v=c<v&&v<=h?v:c;var m=e("li:contains("+r(v,i)+")",b);if(m.length){m.addClass(d);b[0].scrollTop=m[0].offsetTop}return true};e(t).focus(S).click(S);e(t).blur(function(){if(!f){b.hide()}e(this).val(a(e(this).val(),i))});e(t).keydown(function(r){var s;l=true;var o=b[0].scrollTop;switch(r.which){case 38:if(S()){break}s=e(v,w);var u=s.prev().addClass(d)[0];if(u){s.removeClass(d);if(u.offsetTop<o){b[0].scrollTop=o-u.offsetHeight}}else{s.removeClass(d);u=e("li:last",w).addClass(d)[0];b[0].scrollTop=u.offsetTop-u.offsetHeight}break;case 40:if(S()){break}s=e(v,w);var a=s.next().addClass(d)[0];if(a){s.removeClass(d);if(a.offsetTop+a.offsetHeight>o+b[0].offsetHeight){b[0].scrollTop=o+a.offsetHeight}}else{s.removeClass(d);a=e("li:first",w).addClass(d)[0];b[0].scrollTop=0}break;case 13:if(b.is(":visible")){var f=e(v,w)[0];n(t,f,b,i);r.preventDefault()}break;case 27:b.hide();break}});e(t).keyup(function(){l=false});this.getTime=function(){return o(t.value,i)};this.setTime=function(n){t.value=r(s(n,i),i);e(t).change()}};e.fn.timePicker=function(n){if(t[n]){return t[n].apply(this,Array.prototype.slice.call(arguments,1))}else if(typeof n==="object"||!n){return t.init.apply(this,arguments)}else{e.error("Method "+n+" does not exist on jQuery.tooltip")}};e.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,0),defaultSelected:null,separator:":",show24Hours:true}})(jQuery)
drkfr/js/vendor/select2/.bower.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "select2",
3
+ "version": "3.5.1",
4
+ "main": [
5
+ "select2.js",
6
+ "select2.css",
7
+ "select2.png",
8
+ "select2x2.png",
9
+ "select2-spinner.gif"
10
+ ],
11
+ "dependencies": {
12
+ "jquery": ">= 1.7.1"
13
+ },
14
+ "homepage": "https://github.com/ivaynberg/select2",
15
+ "_release": "3.5.1",
16
+ "_resolution": {
17
+ "type": "version",
18
+ "tag": "3.5.1",
19
+ "commit": "621a3f9532357148b05efc0602f7e06b44ff9bb4"
20
+ },
21
+ "_source": "git://github.com/ivaynberg/select2.git",
22
+ "_target": "~3.5.1",
23
+ "_originalSource": "select2",
24
+ "_direct": true
25
+ }
drkfr/js/vendor/select2/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
1
+ .idea
2
+
drkfr/js/vendor/select2/LICENSE ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright 2014 Igor Vaynberg
2
+
3
+ Version: @@ver@@ Timestamp: @@timestamp@@
4
+
5
+ This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
6
+ General Public License version 2 (the "GPL License"). You may choose either license to govern your
7
+ use of this software only upon the condition that you accept all of the terms of either the Apache
8
+ License or the GPL License.
9
+
10
+ You may obtain a copy of the Apache License and the GPL License at:
11
+
12
+ http://www.apache.org/licenses/LICENSE-2.0
13
+ http://www.gnu.org/licenses/gpl-2.0.html
14
+
15
+ Unless required by applicable law or agreed to in writing, software distributed under the Apache License
16
+ or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17
+ either express or implied. See the Apache License and the GPL License for the specific language governing
18
+ permissions and limitations under the Apache License and the GPL License.
drkfr/js/vendor/select2/README.md ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Select2
2
+ =======
3
+
4
+ Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
5
+
6
+ To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
7
+
8
+ Use cases
9
+ ---------
10
+
11
+ * Enhancing native selects with search.
12
+ * Enhancing native selects with a better multi-select interface.
13
+ * Loading data from JavaScript: easily load items via ajax and have them searchable.
14
+ * Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
15
+ * Tagging: ability to add new items on the fly.
16
+ * Working with large, remote datasets: ability to partially load a dataset based on the search term.
17
+ * Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
18
+ * Templating: support for custom rendering of results and selections.
19
+
20
+ Browser compatibility
21
+ ---------------------
22
+ * IE 8+
23
+ * Chrome 8+
24
+ * Firefox 10+
25
+ * Safari 3+
26
+ * Opera 10.6+
27
+
28
+ Usage
29
+ -----
30
+ You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below.
31
+
32
+ Integrations
33
+ ------------
34
+
35
+ * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
36
+ * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
37
+ * [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
38
+ * [Django](https://github.com/applegrew/django-select2)
39
+ * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
40
+ * [Symfony2](https://github.com/avocode/FormExtensions)
41
+ * [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins)
42
+ * [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/))
43
+ * [Meteor](https://jquery-select2.meteor.com)
44
+ * [Yii 2.x](http://demos.krajee.com/widgets#select2)
45
+ * [Yii 1.x](https://github.com/tonybolzan/yii-select2)
46
+ * [AtmosphereJS](https://atmospherejs.com/package/jquery-select2)
47
+
48
+ ### Example Integrations
49
+
50
+ * [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
51
+ * [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
52
+ * [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
53
+ * [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
54
+
55
+ Internationalization (i18n)
56
+ ---------------------------
57
+
58
+ Select2 supports multiple languages by simply including the right language JS
59
+ file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
60
+
61
+ Missing a language? Just copy `select2_locale_en.js.template`, translate
62
+ it, and make a pull request back to Select2 here on GitHub.
63
+
64
+ Bug tracker
65
+ -----------
66
+
67
+ Have a bug? Please create an issue here on GitHub!
68
+
69
+ https://github.com/ivaynberg/select2/issues
70
+
71
+ Mailing list
72
+ ------------
73
+
74
+ Have a question? Ask on our mailing list!
75
+
76
+ select2@googlegroups.com
77
+
78
+ https://groups.google.com/d/forum/select2
79
+
80
+
81
+ Copyright and license
82
+ ---------------------
83
+
84
+ Copyright 2012 Igor Vaynberg
85
+
86
+ This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
87
+ General Public License version 2 (the "GPL License"). You may choose either license to govern your
88
+ use of this software only upon the condition that you accept all of the terms of either the Apache
89
+ License or the GPL License.
90
+
91
+ You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
92
+
93
+ http://www.apache.org/licenses/LICENSE-2.0
94
+ http://www.gnu.org/licenses/gpl-2.0.html
95
+
96
+ Unless required by applicable law or agreed to in writing, software distributed under the Apache License
97
+ or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
98
+ either express or implied. See the Apache License and the GPL License for the specific language governing
99
+ permissions and limitations under the Apache License and the GPL License.
drkfr/js/vendor/select2/bower.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "select2",
3
+ "version": "3.5.1",
4
+ "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
5
+ "dependencies": {
6
+ "jquery": ">= 1.7.1"
7
+ }
8
+ }
drkfr/js/vendor/select2/component.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "select2",
3
+ "repo": "ivaynberg/select2",
4
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
5
+ "version": "3.5.1",
6
+ "demo": "http://ivaynberg.github.io/select2/",
7
+ "keywords": [
8
+ "jquery"
9
+ ],
10
+ "main": "select2.js",
11
+ "styles": [
12
+ "select2.css",
13
+ "select2-bootstrap.css"
14
+ ],
15
+ "scripts": [
16
+ "select2.js",
17
+ "select2_locale_ar.js",
18
+ "select2_locale_bg.js",
19
+ "select2_locale_ca.js",
20
+ "select2_locale_cs.js",
21
+ "select2_locale_da.js",
22
+ "select2_locale_de.js",
23
+ "select2_locale_el.js",
24
+ "select2_locale_es.js",
25
+ "select2_locale_et.js",
26
+ "select2_locale_eu.js",
27
+ "select2_locale_fa.js",
28
+ "select2_locale_fi.js",
29
+ "select2_locale_fr.js",
30
+ "select2_locale_gl.js",
31
+ "select2_locale_he.js",
32
+ "select2_locale_hr.js",
33
+ "select2_locale_hu.js",
34
+ "select2_locale_id.js",
35
+ "select2_locale_is.js",
36
+ "select2_locale_it.js",
37
+ "select2_locale_ja.js",
38
+ "select2_locale_ka.js",
39
+ "select2_locale_ko.js",
40
+ "select2_locale_lt.js",
41
+ "select2_locale_lv.js",
42
+ "select2_locale_mk.js",
43
+ "select2_locale_ms.js",
44
+ "select2_locale_nl.js",
45
+ "select2_locale_no.js",
46
+ "select2_locale_pl.js",
47
+ "select2_locale_pt-BR.js",
48
+ "select2_locale_pt-PT.js",
49
+ "select2_locale_ro.js",
50
+ "select2_locale_ru.js",
51
+ "select2_locale_sk.js",
52
+ "select2_locale_sv.js",
53
+ "select2_locale_th.js",
54
+ "select2_locale_tr.js",
55
+ "select2_locale_uk.js",
56
+ "select2_locale_vi.js",
57
+ "select2_locale_zh-CN.js",
58
+ "select2_locale_zh-TW.js"
59
+ ],
60
+ "images": [
61
+ "select2-spinner.gif",
62
+ "select2.png",
63
+ "select2x2.png"
64
+ ],
65
+ "license": "MIT"
66
+ }
drkfr/js/vendor/select2/composer.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name":
3
+ "ivaynberg/select2",
4
+ "description": "Select2 is a jQuery based replacement for select boxes.",
5
+ "version": "3.5.1",
6
+ "type": "component",
7
+ "homepage": "http://ivaynberg.github.io/select2/",
8
+ "license": "Apache-2.0",
9
+ "require": {
10
+ "robloach/component-installer": "*",
11
+ "components/jquery": ">=1.7.1"
12
+ },
13
+ "extra": {
14
+ "component": {
15
+ "scripts": [
16
+ "select2.js"
17
+ ],
18
+ "files": [
19
+ "select2.js",
20
+ "select2_locale_*.js",
21
+ "select2.css",
22
+ "select2-bootstrap.css",
23
+ "select2-spinner.gif",
24
+ "select2.png",
25
+ "select2x2.png"
26
+ ]
27
+ }
28
+ }
29
+ }
drkfr/js/vendor/select2/package.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name" : "Select2",
3
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
4
+ "homepage": "http://ivaynberg.github.io/select2",
5
+ "author": "Igor Vaynberg",
6
+ "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"},
7
+ "main": "select2.js",
8
+ "version": "3.5.1",
9
+ "jspm": {
10
+ "main": "select2",
11
+ "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"],
12
+ "shim": {
13
+ "select2": {
14
+ "imports": ["jquery", "./select2.css!"],
15
+ "exports": "$"
16
+ }
17
+ },
18
+ "buildConfig": { "uglify": true }
19
+ }
20
+ }
drkfr/js/vendor/select2/release.sh ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ echo -n "Enter the version for this release: "
5
+
6
+ read ver
7
+
8
+ if [ ! $ver ]; then
9
+ echo "Invalid version."
10
+ exit
11
+ fi
12
+
13
+ name="select2"
14
+ js="$name.js"
15
+ mini="$name.min.js"
16
+ css="$name.css"
17
+ release="$name-$ver"
18
+ tag="$ver"
19
+ branch="build-$ver"
20
+ curbranch=`git branch | grep "*" | sed "s/* //"`
21
+ timestamp=$(date)
22
+ tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
23
+ remote="github"
24
+
25
+ echo "Pulling from origin"
26
+
27
+ git pull
28
+
29
+ echo "Updating Version Identifiers"
30
+
31
+ sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json
32
+
33
+ git add bower.json
34
+ git add select2.jquery.json
35
+ git add component.json
36
+ git add composer.json
37
+ git add package.json
38
+
39
+ git commit -m "modified version identifiers in descriptors for release $ver"
40
+ git push
41
+
42
+ git branch "$branch"
43
+ git checkout "$branch"
44
+
45
+ echo "Tokenizing..."
46
+
47
+ find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {}
48
+ find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {}
49
+
50
+ sed -e "s/latest/$ver/g" -i -- bower.json
51
+
52
+ git add "$js"
53
+ git add "$css"
54
+
55
+ echo "Minifying..."
56
+
57
+ echo "/*" > "$mini"
58
+ cat LICENSE | sed "$tokens" >> "$mini"
59
+ echo "*/" >> "$mini"
60
+
61
+ curl -s \
62
+ --data-urlencode "js_code@$js" \
63
+ http://marijnhaverbeke.nl/uglifyjs \
64
+ >> "$mini"
65
+
66
+ git add "$mini"
67
+
68
+ git commit -m "release $ver"
69
+
70
+ echo "Tagging..."
71
+ git tag -a "$tag" -m "tagged version $ver"
72
+ git push "$remote" --tags
73
+
74
+ echo "Cleaning Up..."
75
+
76
+ git checkout "$curbranch"
77
+ git branch -D "$branch"
78
+
79
+ echo "Done"
drkfr/js/vendor/select2/select2-bootstrap.css ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .form-control .select2-choice {
2
+ border: 0;
3
+ border-radius: 2px;
4
+ }
5
+
6
+ .form-control .select2-choice .select2-arrow {
7
+ border-radius: 0 2px 2px 0;
8
+ }
9
+
10
+ .form-control.select2-container {
11
+ height: auto !important;
12
+ padding: 0;
13
+ }
14
+
15
+ .form-control.select2-container.select2-dropdown-open {
16
+ border-color: #5897FB;
17
+ border-radius: 3px 3px 0 0;
18
+ }
19
+
20
+ .form-control .select2-container.select2-dropdown-open .select2-choices {
21
+ border-radius: 3px 3px 0 0;
22
+ }
23
+
24
+ .form-control.select2-container .select2-choices {
25
+ border: 0 !important;
26
+ border-radius: 3px;
27
+ }
28
+
29
+ .control-group.warning .select2-container .select2-choice,
30
+ .control-group.warning .select2-container .select2-choices,
31
+ .control-group.warning .select2-container-active .select2-choice,
32
+ .control-group.warning .select2-container-active .select2-choices,
33
+ .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
34
+ .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
35
+ .control-group.warning .select2-container-multi.select2-container-active .select2-choices {
36
+ border: 1px solid #C09853 !important;
37
+ }
38
+
39
+ .control-group.warning .select2-container .select2-choice div {
40
+ border-left: 1px solid #C09853 !important;
41
+ background: #FCF8E3 !important;
42
+ }
43
+
44
+ .control-group.error .select2-container .select2-choice,
45
+ .control-group.error .select2-container .select2-choices,
46
+ .control-group.error .select2-container-active .select2-choice,
47
+ .control-group.error .select2-container-active .select2-choices,
48
+ .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
49
+ .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
50
+ .control-group.error .select2-container-multi.select2-container-active .select2-choices {
51
+ border: 1px solid #B94A48 !important;
52
+ }
53
+
54
+ .control-group.error .select2-container .select2-choice div {
55
+ border-left: 1px solid #B94A48 !important;
56
+ background: #F2DEDE !important;
57
+ }
58
+
59
+ .control-group.info .select2-container .select2-choice,
60
+ .control-group.info .select2-container .select2-choices,
61
+ .control-group.info .select2-container-active .select2-choice,
62
+ .control-group.info .select2-container-active .select2-choices,
63
+ .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
64
+ .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
65
+ .control-group.info .select2-container-multi.select2-container-active .select2-choices {
66
+ border: 1px solid #3A87AD !important;
67
+ }
68
+
69
+ .control-group.info .select2-container .select2-choice div {
70
+ border-left: 1px solid #3A87AD !important;
71
+ background: #D9EDF7 !important;
72
+ }
73
+
74
+ .control-group.success .select2-container .select2-choice,
75
+ .control-group.success .select2-container .select2-choices,
76
+ .control-group.success .select2-container-active .select2-choice,
77
+ .control-group.success .select2-container-active .select2-choices,
78
+ .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
79
+ .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
80
+ .control-group.success .select2-container-multi.select2-container-active .select2-choices {
81
+ border: 1px solid #468847 !important;
82
+ }
83
+
84
+ .control-group.success .select2-container .select2-choice div {
85
+ border-left: 1px solid #468847 !important;
86
+ background: #DFF0D8 !important;
87
+ }
drkfr/js/vendor/select2/select2-spinner.gif ADDED
Binary file
drkfr/js/vendor/select2/select2.css ADDED
@@ -0,0 +1,704 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
3
+ */
4
+ .select2-container {
5
+ margin: 0;
6
+ position: relative;
7
+ display: inline-block;
8
+ /* inline-block for ie7 */
9
+ zoom: 1;
10
+ *display: inline;
11
+ vertical-align: middle;
12
+ }
13
+
14
+ .select2-container,
15
+ .select2-drop,
16
+ .select2-search,
17
+ .select2-search input {
18
+ /*
19
+ Force border-box so that % widths fit the parent
20
+ container without overlap because of margin/padding.
21
+ More Info : http://www.quirksmode.org/css/box.html
22
+ */
23
+ -webkit-box-sizing: border-box; /* webkit */
24
+ -moz-box-sizing: border-box; /* firefox */
25
+ box-sizing: border-box; /* css3 */
26
+ }
27
+
28
+ .select2-container .select2-choice {
29
+ display: block;
30
+ height: 26px;
31
+ padding: 0 0 0 8px;
32
+ overflow: hidden;
33
+ position: relative;
34
+
35
+ border: 1px solid #aaa;
36
+ white-space: nowrap;
37
+ line-height: 26px;
38
+ color: #444;
39
+ text-decoration: none;
40
+
41
+ border-radius: 4px;
42
+
43
+ background-clip: padding-box;
44
+
45
+ -webkit-touch-callout: none;
46
+ -webkit-user-select: none;
47
+ -moz-user-select: none;
48
+ -ms-user-select: none;
49
+ user-select: none;
50
+
51
+ background-color: #fff;
52
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
53
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
54
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
55
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
56
+ background-image: linear-gradient(to top, #eee 0%, #fff 50%);
57
+ }
58
+
59
+ html[dir="rtl"] .select2-container .select2-choice {
60
+ padding: 0 8px 0 0;
61
+ }
62
+
63
+ .select2-container.select2-drop-above .select2-choice {
64
+ border-bottom-color: #aaa;
65
+
66
+ border-radius: 0 0 4px 4px;
67
+
68
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
69
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
70
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
71
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
72
+ background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
73
+ }
74
+
75
+ .select2-container.select2-allowclear .select2-choice .select2-chosen {
76
+ margin-right: 42px;
77
+ }
78
+
79
+ .select2-container .select2-choice > .select2-chosen {
80
+ margin-right: 26px;
81
+ display: block;
82
+ overflow: hidden;
83
+
84
+ white-space: nowrap;
85
+
86
+ text-overflow: ellipsis;
87
+ float: none;
88
+ width: auto;
89
+ }
90
+
91
+ html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
92
+ margin-left: 26px;
93
+ margin-right: 0;
94
+ }
95
+
96
+ .select2-container .select2-choice abbr {
97
+ display: none;
98
+ width: 12px;
99
+ height: 12px;
100
+ position: absolute;
101
+ right: 24px;
102
+ top: 8px;
103
+
104
+ font-size: 1px;
105
+ text-decoration: none;
106
+
107
+ border: 0;
108
+ background: url('select2.png') right top no-repeat;
109
+ cursor: pointer;
110
+ outline: 0;
111
+ }
112
+
113
+ .select2-container.select2-allowclear .select2-choice abbr {
114
+ display: inline-block;
115
+ }
116
+
117
+ .select2-container .select2-choice abbr:hover {
118
+ background-position: right -11px;
119
+ cursor: pointer;
120
+ }
121
+
122
+ .select2-drop-mask {
123
+ border: 0;
124
+ margin: 0;
125
+ padding: 0;
126
+ position: fixed;
127
+ left: 0;
128
+ top: 0;
129
+ min-height: 100%;
130
+ min-width: 100%;
131
+ height: auto;
132
+ width: auto;
133
+ opacity: 0;
134
+ z-index: 9998;
135
+ /* styles required for IE to work */
136
+ background-color: #fff;
137
+ filter: alpha(opacity=0);
138
+ }
139
+
140
+ .select2-drop {
141
+ width: 100%;
142
+ margin-top: -1px;
143
+ position: absolute;
144
+ z-index: 9999;
145
+ top: 100%;
146
+
147
+ background: #fff;
148
+ color: #000;
149
+ border: 1px solid #aaa;
150
+ border-top: 0;
151
+
152
+ border-radius: 0 0 4px 4px;
153
+
154
+ -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
155
+ box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
156
+ }
157
+
158
+ .select2-drop.select2-drop-above {
159
+ margin-top: 1px;
160
+ border-top: 1px solid #aaa;
161
+ border-bottom: 0;
162
+
163
+ border-radius: 4px 4px 0 0;
164
+
165
+ -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
166
+ box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
167
+ }
168
+
169
+ .select2-drop-active {
170
+ border: 1px solid #5897fb;
171
+ border-top: none;
172
+ }
173
+
174
+ .select2-drop.select2-drop-above.select2-drop-active {
175
+ border-top: 1px solid #5897fb;
176
+ }
177
+
178
+ .select2-drop-auto-width {
179
+ border-top: 1px solid #aaa;
180
+ width: auto;
181
+ }
182
+
183
+ .select2-drop-auto-width .select2-search {
184
+ padding-top: 4px;
185
+ }
186
+
187
+ .select2-container .select2-choice .select2-arrow {
188
+ display: inline-block;
189
+ width: 18px;
190
+ height: 100%;
191
+ position: absolute;
192
+ right: 0;
193
+ top: 0;
194
+
195
+ border-left: 1px solid #aaa;
196
+ border-radius: 0 4px 4px 0;
197
+
198
+ background-clip: padding-box;
199
+
200
+ background: #ccc;
201
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
202
+ background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
203
+ background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
204
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
205
+ background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
206
+ }
207
+
208
+ html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
209
+ left: 0;
210
+ right: auto;
211
+
212
+ border-left: none;
213
+ border-right: 1px solid #aaa;
214
+ border-radius: 4px 0 0 4px;
215
+ }
216
+
217
+ .select2-container .select2-choice .select2-arrow b {
218
+ display: block;
219
+ width: 100%;
220
+ height: 100%;
221
+ background: url('select2.png') no-repeat 0 1px;
222
+ }
223
+
224
+ html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
225
+ background-position: 2px 1px;
226
+ }
227
+
228
+ .select2-search {
229
+ display: inline-block;
230
+ width: 100%;
231
+ min-height: 26px;
232
+ margin: 0;
233
+ padding-left: 4px;
234
+ padding-right: 4px;
235
+
236
+ position: relative;
237
+ z-index: 10000;
238
+
239
+ white-space: nowrap;
240
+ }
241
+
242
+ .select2-search input {
243
+ width: 100%;
244
+ height: auto !important;
245
+ min-height: 26px;
246
+ padding: 4px 20px 4px 5px;
247
+ margin: 0;
248
+
249
+ outline: 0;
250
+ font-family: sans-serif;
251
+ font-size: 1em;
252
+
253
+ border: 1px solid #aaa;
254
+ border-radius: 0;
255
+
256
+ -webkit-box-shadow: none;
257
+ box-shadow: none;
258
+
259
+ background: #fff url('select2.png') no-repeat 100% -22px;
260
+ background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
261
+ background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
262
+ background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
263
+ background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
264
+ }
265
+
266
+ html[dir="rtl"] .select2-search input {
267
+ padding: 4px 5px 4px 20px;
268
+
269
+ background: #fff url('select2.png') no-repeat -37px -22px;
270
+ background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
271
+ background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
+ background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
+ background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
+ }
275
+
276
+ .select2-drop.select2-drop-above .select2-search input {
277
+ margin-top: 4px;
278
+ }
279
+
280
+ .select2-search input.select2-active {
281
+ background: #fff url('select2-spinner.gif') no-repeat 100%;
282
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
283
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
284
+ background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
285
+ background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
286
+ }
287
+
288
+ .select2-container-active .select2-choice,
289
+ .select2-container-active .select2-choices {
290
+ border: 1px solid #5897fb;
291
+ outline: none;
292
+
293
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
294
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
295
+ }
296
+
297
+ .select2-dropdown-open .select2-choice {
298
+ border-bottom-color: transparent;
299
+ -webkit-box-shadow: 0 1px 0 #fff inset;
300
+ box-shadow: 0 1px 0 #fff inset;
301
+
302
+ border-bottom-left-radius: 0;
303
+ border-bottom-right-radius: 0;
304
+
305
+ background-color: #eee;
306
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
307
+ background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
308
+ background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
309
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
+ background-image: linear-gradient(to top, #fff 0%, #eee 50%);
311
+ }
312
+
313
+ .select2-dropdown-open.select2-drop-above .select2-choice,
314
+ .select2-dropdown-open.select2-drop-above .select2-choices {
315
+ border: 1px solid #5897fb;
316
+ border-top-color: transparent;
317
+
318
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
319
+ background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
320
+ background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
321
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
322
+ background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
323
+ }
324
+
325
+ .select2-dropdown-open .select2-choice .select2-arrow {
326
+ background: transparent;
327
+ border-left: none;
328
+ filter: none;
329
+ }
330
+ html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
331
+ border-right: none;
332
+ }
333
+
334
+ .select2-dropdown-open .select2-choice .select2-arrow b {
335
+ background-position: -18px 1px;
336
+ }
337
+
338
+ html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
339
+ background-position: -16px 1px;
340
+ }
341
+
342
+ .select2-hidden-accessible {
343
+ border: 0;
344
+ clip: rect(0 0 0 0);
345
+ height: 1px;
346
+ margin: -1px;
347
+ overflow: hidden;
348
+ padding: 0;
349
+ position: absolute;
350
+ width: 1px;
351
+ }
352
+
353
+ /* results */
354
+ .select2-results {
355
+ max-height: 200px;
356
+ padding: 0 0 0 4px;
357
+ margin: 4px 4px 4px 0;
358
+ position: relative;
359
+ overflow-x: hidden;
360
+ overflow-y: auto;
361
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
362
+ }
363
+
364
+ html[dir="rtl"] .select2-results {
365
+ padding: 0 4px 0 0;
366
+ margin: 4px 0 4px 4px;
367
+ }
368
+
369
+ .select2-results ul.select2-result-sub {
370
+ margin: 0;
371
+ padding-left: 0;
372
+ }
373
+
374
+ .select2-results li {
375
+ list-style: none;
376
+ display: list-item;
377
+ background-image: none;
378
+ }
379
+
380
+ .select2-results li.select2-result-with-children > .select2-result-label {
381
+ font-weight: bold;
382
+ }
383
+
384
+ .select2-results .select2-result-label {
385
+ padding: 3px 7px 4px;
386
+ margin: 0;
387
+ cursor: pointer;
388
+
389
+ min-height: 1em;
390
+
391
+ -webkit-touch-callout: none;
392
+ -webkit-user-select: none;
393
+ -moz-user-select: none;
394
+ -ms-user-select: none;
395
+ user-select: none;
396
+ }
397
+
398
+ .select2-results-dept-1 .select2-result-label { padding-left: 20px }
399
+ .select2-results-dept-2 .select2-result-label { padding-left: 40px }
400
+ .select2-results-dept-3 .select2-result-label { padding-left: 60px }
401
+ .select2-results-dept-4 .select2-result-label { padding-left: 80px }
402
+ .select2-results-dept-5 .select2-result-label { padding-left: 100px }
403
+ .select2-results-dept-6 .select2-result-label { padding-left: 110px }
404
+ .select2-results-dept-7 .select2-result-label { padding-left: 120px }
405
+
406
+ .select2-results .select2-highlighted {
407
+ background: #3875d7;
408
+ color: #fff;
409
+ }
410
+
411
+ .select2-results li em {
412
+ background: #feffde;
413
+ font-style: normal;
414
+ }
415
+
416
+ .select2-results .select2-highlighted em {
417
+ background: transparent;
418
+ }
419
+
420
+ .select2-results .select2-highlighted ul {
421
+ background: #fff;
422
+ color: #000;
423
+ }
424
+
425
+ .select2-results .select2-no-results,
426
+ .select2-results .select2-searching,
427
+ .select2-results .select2-ajax-error,
428
+ .select2-results .select2-selection-limit {
429
+ background: #f4f4f4;
430
+ display: list-item;
431
+ padding-left: 5px;
432
+ }
433
+
434
+ /*
435
+ disabled look for disabled choices in the results dropdown
436
+ */
437
+ .select2-results .select2-disabled.select2-highlighted {
438
+ color: #666;
439
+ background: #f4f4f4;
440
+ display: list-item;
441
+ cursor: default;
442
+ }
443
+ .select2-results .select2-disabled {
444
+ background: #f4f4f4;
445
+ display: list-item;
446
+ cursor: default;
447
+ }
448
+
449
+ .select2-results .select2-selected {
450
+ display: none;
451
+ }
452
+
453
+ .select2-more-results.select2-active {
454
+ background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
455
+ }
456
+
457
+ .select2-results .select2-ajax-error {
458
+ background: rgba(255, 50, 50, .2);
459
+ }
460
+
461
+ .select2-more-results {
462
+ background: #f4f4f4;
463
+ display: list-item;
464
+ }
465
+
466
+ /* disabled styles */
467
+
468
+ .select2-container.select2-container-disabled .select2-choice {
469
+ background-color: #f4f4f4;
470
+ background-image: none;
471
+ border: 1px solid #ddd;
472
+ cursor: default;
473
+ }
474
+
475
+ .select2-container.select2-container-disabled .select2-choice .select2-arrow {
476
+ background-color: #f4f4f4;
477
+ background-image: none;
478
+ border-left: 0;
479
+ }
480
+
481
+ .select2-container.select2-container-disabled .select2-choice abbr {
482
+ display: none;
483
+ }
484
+
485
+
486
+ /* multiselect */
487
+
488
+ .select2-container-multi .select2-choices {
489
+ height: auto !important;
490
+ height: 1%;
491
+ margin: 0;
492
+ padding: 0 5px 0 0;
493
+ position: relative;
494
+
495
+ border: 1px solid #aaa;
496
+ cursor: text;
497
+ overflow: hidden;
498
+
499
+ background-color: #fff;
500
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
501
+ background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
502
+ background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
503
+ background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
504
+ }
505
+
506
+ html[dir="rtl"] .select2-container-multi .select2-choices {
507
+ padding: 0 0 0 5px;
508
+ }
509
+
510
+ .select2-locked {
511
+ padding: 3px 5px 3px 5px !important;
512
+ }
513
+
514
+ .select2-container-multi .select2-choices {
515
+ min-height: 26px;
516
+ }
517
+
518
+ .select2-container-multi.select2-container-active .select2-choices {
519
+ border: 1px solid #5897fb;
520
+ outline: none;
521
+
522
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
523
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
524
+ }
525
+ .select2-container-multi .select2-choices li {
526
+ float: left;
527
+ list-style: none;
528
+ }
529
+ html[dir="rtl"] .select2-container-multi .select2-choices li
530
+ {
531
+ float: right;
532
+ }
533
+ .select2-container-multi .select2-choices .select2-search-field {
534
+ margin: 0;
535
+ padding: 0;
536
+ white-space: nowrap;
537
+ }
538
+
539
+ .select2-container-multi .select2-choices .select2-search-field input {
540
+ padding: 5px;
541
+ margin: 1px 0;
542
+
543
+ font-family: sans-serif;
544
+ font-size: 100%;
545
+ color: #666;
546
+ outline: 0;
547
+ border: 0;
548
+ -webkit-box-shadow: none;
549
+ box-shadow: none;
550
+ background: transparent !important;
551
+ }
552
+
553
+ .select2-container-multi .select2-choices .select2-search-field input.select2-active {
554
+ background: #fff url('select2-spinner.gif') no-repeat 100% !important;
555
+ }
556
+
557
+ .select2-default {
558
+ color: #999 !important;
559
+ }
560
+
561
+ .select2-container-multi .select2-choices .select2-search-choice {
562
+ padding: 3px 5px 3px 18px;
563
+ margin: 3px 0 3px 5px;
564
+ position: relative;
565
+
566
+ line-height: 13px;
567
+ color: #333;
568
+ cursor: default;
569
+ border: 1px solid #aaaaaa;
570
+
571
+ border-radius: 3px;
572
+
573
+ -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
574
+ box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
575
+
576
+ background-clip: padding-box;
577
+
578
+ -webkit-touch-callout: none;
579
+ -webkit-user-select: none;
580
+ -moz-user-select: none;
581
+ -ms-user-select: none;
582
+ user-select: none;
583
+
584
+ background-color: #e4e4e4;
585
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
586
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
587
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
588
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
589
+ background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
590
+ }
591
+ html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
592
+ {
593
+ margin: 3px 5px 3px 0;
594
+ padding: 3px 18px 3px 5px;
595
+ }
596
+ .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
597
+ cursor: default;
598
+ }
599
+ .select2-container-multi .select2-choices .select2-search-choice-focus {
600
+ background: #d4d4d4;
601
+ }
602
+
603
+ .select2-search-choice-close {
604
+ display: block;
605
+ width: 12px;
606
+ height: 13px;
607
+ position: absolute;
608
+ right: 3px;
609
+ top: 4px;
610
+
611
+ font-size: 1px;
612
+ outline: none;
613
+ background: url('select2.png') right top no-repeat;
614
+ }
615
+ html[dir="rtl"] .select2-search-choice-close {
616
+ right: auto;
617
+ left: 3px;
618
+ }
619
+
620
+ .select2-container-multi .select2-search-choice-close {
621
+ left: 3px;
622
+ }
623
+
624
+ html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
625
+ left: auto;
626
+ right: 2px;
627
+ }
628
+
629
+ .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
630
+ background-position: right -11px;
631
+ }
632
+ .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
633
+ background-position: right -11px;
634
+ }
635
+
636
+ /* disabled styles */
637
+ .select2-container-multi.select2-container-disabled .select2-choices {
638
+ background-color: #f4f4f4;
639
+ background-image: none;
640
+ border: 1px solid #ddd;
641
+ cursor: default;
642
+ }
643
+
644
+ .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
645
+ padding: 3px 5px 3px 5px;
646
+ border: 1px solid #ddd;
647
+ background-image: none;
648
+ background-color: #f4f4f4;
649
+ }
650
+
651
+ .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
652
+ background: none;
653
+ }
654
+ /* end multiselect */
655
+
656
+
657
+ .select2-result-selectable .select2-match,
658
+ .select2-result-unselectable .select2-match {
659
+ text-decoration: underline;
660
+ }
661
+
662
+ .select2-offscreen, .select2-offscreen:focus {
663
+ clip: rect(0 0 0 0) !important;
664
+ width: 1px !important;
665
+ height: 1px !important;
666
+ border: 0 !important;
667
+ margin: 0 !important;
668
+ padding: 0 !important;
669
+ overflow: hidden !important;
670
+ position: absolute !important;
671
+ outline: 0 !important;
672
+ left: 0px !important;
673
+ top: 0px !important;
674
+ }
675
+
676
+ .select2-display-none {
677
+ display: none;
678
+ }
679
+
680
+ .select2-measure-scrollbar {
681
+ position: absolute;
682
+ top: -10000px;
683
+ left: -10000px;
684
+ width: 100px;
685
+ height: 100px;
686
+ overflow: scroll;
687
+ }
688
+
689
+ /* Retina-ize icons */
690
+
691
+ @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
692
+ .select2-search input,
693
+ .select2-search-choice-close,
694
+ .select2-container .select2-choice abbr,
695
+ .select2-container .select2-choice .select2-arrow b {
696
+ background-image: url('select2x2.png') !important;
697
+ background-repeat: no-repeat !important;
698
+ background-size: 60px 40px !important;
699
+ }
700
+
701
+ .select2-search input {
702
+ background-position: 100% -21px !important;
703
+ }
704
+ }
drkfr/js/vendor/select2/select2.jquery.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "select2",
3
+ "title": "Select2",
4
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
5
+ "keywords": [
6
+ "select",
7
+ "autocomplete",
8
+ "typeahead",
9
+ "dropdown",
10
+ "multiselect",
11
+ "tag",
12
+ "tagging"
13
+ ],
14
+ "version": "3.5.1",
15
+ "author": {
16
+ "name": "Igor Vaynberg",
17
+ "url": "https://github.com/ivaynberg"
18
+ },
19
+ "licenses": [
20
+ {
21
+ "type": "Apache",
22
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
23
+ },
24
+ {
25
+ "type": "GPL v2",
26
+ "url": "http://www.gnu.org/licenses/gpl-2.0.html"
27
+ }
28
+ ],
29
+ "bugs": "https://github.com/ivaynberg/select2/issues",
30
+ "homepage": "http://ivaynberg.github.com/select2",
31
+ "docs": "http://ivaynberg.github.com/select2/",
32
+ "download": "https://github.com/ivaynberg/select2/tags",
33
+ "dependencies": {
34
+ "jquery": ">=1.7.1"
35
+ }
36
+ }
drkfr/js/vendor/select2/select2.js ADDED
@@ -0,0 +1,3508 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Copyright 2012 Igor Vaynberg
3
+
4
+ Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
5
+
6
+ This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
+ General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
+ use of this software only upon the condition that you accept all of the terms of either the Apache
9
+ License or the GPL License.
10
+
11
+ You may obtain a copy of the Apache License and the GPL License at:
12
+
13
+ http://www.apache.org/licenses/LICENSE-2.0
14
+ http://www.gnu.org/licenses/gpl-2.0.html
15
+
16
+ Unless required by applicable law or agreed to in writing, software distributed under the
17
+ Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
18
+ CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
19
+ the specific language governing permissions and limitations under the Apache License and the GPL License.
20
+ */
21
+ (function ($) {
22
+ if(typeof $.fn.each2 == "undefined") {
23
+ $.extend($.fn, {
24
+ /*
25
+ * 4-10 times faster .each replacement
26
+ * use it carefully, as it overrides jQuery context of element on each iteration
27
+ */
28
+ each2 : function (c) {
29
+ var j = $([0]), i = -1, l = this.length;
30
+ while (
31
+ ++i < l
32
+ && (j.context = j[0] = this[i])
33
+ && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
34
+ );
35
+ return this;
36
+ }
37
+ });
38
+ }
39
+ })(jQuery);
40
+
41
+ (function ($, undefined) {
42
+ "use strict";
43
+ /*global document, window, jQuery, console */
44
+
45
+ if (window.Select2 !== undefined) {
46
+ return;
47
+ }
48
+
49
+ var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
50
+ lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
51
+
52
+ KEY = {
53
+ TAB: 9,
54
+ ENTER: 13,
55
+ ESC: 27,
56
+ SPACE: 32,
57
+ LEFT: 37,
58
+ UP: 38,
59
+ RIGHT: 39,
60
+ DOWN: 40,
61
+ SHIFT: 16,
62
+ CTRL: 17,
63
+ ALT: 18,
64
+ PAGE_UP: 33,
65
+ PAGE_DOWN: 34,
66
+ HOME: 36,
67
+ END: 35,
68
+ BACKSPACE: 8,
69
+ DELETE: 46,
70
+ isArrow: function (k) {
71
+ k = k.which ? k.which : k;
72
+ switch (k) {
73
+ case KEY.LEFT:
74
+ case KEY.RIGHT:
75
+ case KEY.UP:
76
+ case KEY.DOWN:
77
+ return true;
78
+ }
79
+ return false;
80
+ },
81
+ isControl: function (e) {
82
+ var k = e.which;
83
+ switch (k) {
84
+ case KEY.SHIFT:
85
+ case KEY.CTRL:
86
+ case KEY.ALT:
87
+ return true;
88
+ }
89
+
90
+ if (e.metaKey) return true;
91
+
92
+ return false;
93
+ },
94
+ isFunctionKey: function (k) {
95
+ k = k.which ? k.which : k;
96
+ return k >= 112 && k <= 123;
97
+ }
98
+ },
99
+ MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
100
+
101
+ DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
102
+
103
+ $document = $(document);
104
+
105
+ nextUid=(function() { var counter=1; return function() { return counter++; }; }());
106
+
107
+
108
+ function reinsertElement(element) {
109
+ var placeholder = $(document.createTextNode(''));
110
+
111
+ element.before(placeholder);
112
+ placeholder.before(element);
113
+ placeholder.remove();
114
+ }
115
+
116
+ function stripDiacritics(str) {
117
+ // Used 'uni range + named function' from http://jsperf.com/diacritics/18
118
+ function match(a) {
119
+ return DIACRITICS[a] || a;
120
+ }
121
+
122
+ return str.replace(/[^\u0000-\u007E]/g, match);
123
+ }
124
+
125
+ function indexOf(value, array) {
126
+ var i = 0, l = array.length;
127
+ for (; i < l; i = i + 1) {
128
+ if (equal(value, array[i])) return i;
129
+ }
130
+ return -1;
131
+ }
132
+
133
+ function measureScrollbar () {
134
+ var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
135
+ $template.appendTo('body');
136
+
137
+ var dim = {
138
+ width: $template.width() - $template[0].clientWidth,
139
+ height: $template.height() - $template[0].clientHeight
140
+ };
141
+ $template.remove();
142
+
143
+ return dim;
144
+ }
145
+
146
+ /**
147
+ * Compares equality of a and b
148
+ * @param a
149
+ * @param b
150
+ */
151
+ function equal(a, b) {
152
+ if (a === b) return true;
153
+ if (a === undefined || b === undefined) return false;
154
+ if (a === null || b === null) return false;
155
+ // Check whether 'a' or 'b' is a string (primitive or object).
156
+ // The concatenation of an empty string (+'') converts its argument to a string's primitive.
157
+ if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
158
+ if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
159
+ return false;
160
+ }
161
+
162
+ /**
163
+ * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
164
+ * strings
165
+ * @param string
166
+ * @param separator
167
+ */
168
+ function splitVal(string, separator) {
169
+ var val, i, l;
170
+ if (string === null || string.length < 1) return [];
171
+ val = string.split(separator);
172
+ for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
173
+ return val;
174
+ }
175
+
176
+ function getSideBorderPadding(element) {
177
+ return element.outerWidth(false) - element.width();
178
+ }
179
+
180
+ function installKeyUpChangeEvent(element) {
181
+ var key="keyup-change-value";
182
+ element.on("keydown", function () {
183
+ if ($.data(element, key) === undefined) {
184
+ $.data(element, key, element.val());
185
+ }
186
+ });
187
+ element.on("keyup", function () {
188
+ var val= $.data(element, key);
189
+ if (val !== undefined && element.val() !== val) {
190
+ $.removeData(element, key);
191
+ element.trigger("keyup-change");
192
+ }
193
+ });
194
+ }
195
+
196
+
197
+ /**
198
+ * filters mouse events so an event is fired only if the mouse moved.
199
+ *
200
+ * filters out mouse events that occur when mouse is stationary but
201
+ * the elements under the pointer are scrolled.
202
+ */
203
+ function installFilteredMouseMove(element) {
204
+ element.on("mousemove", function (e) {
205
+ var lastpos = lastMousePosition;
206
+ if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
207
+ $(e.target).trigger("mousemove-filtered", e);
208
+ }
209
+ });
210
+ }
211
+
212
+ /**
213
+ * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
214
+ * within the last quietMillis milliseconds.
215
+ *
216
+ * @param quietMillis number of milliseconds to wait before invoking fn
217
+ * @param fn function to be debounced
218
+ * @param ctx object to be used as this reference within fn
219
+ * @return debounced version of fn
220
+ */
221
+ function debounce(quietMillis, fn, ctx) {
222
+ ctx = ctx || undefined;
223
+ var timeout;
224
+ return function () {
225
+ var args = arguments;
226
+ window.clearTimeout(timeout);
227
+ timeout = window.setTimeout(function() {
228
+ fn.apply(ctx, args);
229
+ }, quietMillis);
230
+ };
231
+ }
232
+
233
+ function installDebouncedScroll(threshold, element) {
234
+ var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
235
+ element.on("scroll", function (e) {
236
+ if (indexOf(e.target, element.get()) >= 0) notify(e);
237
+ });
238
+ }
239
+
240
+ function focus($el) {
241
+ if ($el[0] === document.activeElement) return;
242
+
243
+ /* set the focus in a 0 timeout - that way the focus is set after the processing
244
+ of the current event has finished - which seems like the only reliable way
245
+ to set focus */
246
+ window.setTimeout(function() {
247
+ var el=$el[0], pos=$el.val().length, range;
248
+
249
+ $el.focus();
250
+
251
+ /* make sure el received focus so we do not error out when trying to manipulate the caret.
252
+ sometimes modals or others listeners may steal it after its set */
253
+ var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
254
+ if (isVisible && el === document.activeElement) {
255
+
256
+ /* after the focus is set move the caret to the end, necessary when we val()
257
+ just before setting focus */
258
+ if(el.setSelectionRange)
259
+ {
260
+ el.setSelectionRange(pos, pos);
261
+ }
262
+ else if (el.createTextRange) {
263
+ range = el.createTextRange();
264
+ range.collapse(false);
265
+ range.select();
266
+ }
267
+ }
268
+ }, 0);
269
+ }
270
+
271
+ function getCursorInfo(el) {
272
+ el = $(el)[0];
273
+ var offset = 0;
274
+ var length = 0;
275
+ if ('selectionStart' in el) {
276
+ offset = el.selectionStart;
277
+ length = el.selectionEnd - offset;
278
+ } else if ('selection' in document) {
279
+ el.focus();
280
+ var sel = document.selection.createRange();
281
+ length = document.selection.createRange().text.length;
282
+ sel.moveStart('character', -el.value.length);
283
+ offset = sel.text.length - length;
284
+ }
285
+ return { offset: offset, length: length };
286
+ }
287
+
288
+ function killEvent(event) {
289
+ event.preventDefault();
290
+ event.stopPropagation();
291
+ }
292
+ function killEventImmediately(event) {
293
+ event.preventDefault();
294
+ event.stopImmediatePropagation();
295
+ }
296
+
297
+ function measureTextWidth(e) {
298
+ if (!sizer){
299
+ var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
300
+ sizer = $(document.createElement("div")).css({
301
+ position: "absolute",
302
+ left: "-10000px",
303
+ top: "-10000px",
304
+ display: "none",
305
+ fontSize: style.fontSize,
306
+ fontFamily: style.fontFamily,
307
+ fontStyle: style.fontStyle,
308
+ fontWeight: style.fontWeight,
309
+ letterSpacing: style.letterSpacing,
310
+ textTransform: style.textTransform,
311
+ whiteSpace: "nowrap"
312
+ });
313
+ sizer.attr("class","select2-sizer");
314
+ $("body").append(sizer);
315
+ }
316
+ sizer.text(e.val());
317
+ return sizer.width();
318
+ }
319
+
320
+ function syncCssClasses(dest, src, adapter) {
321
+ var classes, replacements = [], adapted;
322
+
323
+ classes = $.trim(dest.attr("class"));
324
+
325
+ if (classes) {
326
+ classes = '' + classes; // for IE which returns object
327
+
328
+ $(classes.split(/\s+/)).each2(function() {
329
+ if (this.indexOf("select2-") === 0) {
330
+ replacements.push(this);
331
+ }
332
+ });
333
+ }
334
+
335
+ classes = $.trim(src.attr("class"));
336
+
337
+ if (classes) {
338
+ classes = '' + classes; // for IE which returns object
339
+
340
+ $(classes.split(/\s+/)).each2(function() {
341
+ if (this.indexOf("select2-") !== 0) {
342
+ adapted = adapter(this);
343
+
344
+ if (adapted) {
345
+ replacements.push(adapted);
346
+ }
347
+ }
348
+ });
349
+ }
350
+
351
+ dest.attr("class", replacements.join(" "));
352
+ }
353
+
354
+
355
+ function markMatch(text, term, markup, escapeMarkup) {
356
+ var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
357
+ tl=term.length;
358
+
359
+ if (match<0) {
360
+ markup.push(escapeMarkup(text));
361
+ return;
362
+ }
363
+
364
+ markup.push(escapeMarkup(text.substring(0, match)));
365
+ markup.push("<span class='select2-match'>");
366
+ markup.push(escapeMarkup(text.substring(match, match + tl)));
367
+ markup.push("</span>");
368
+ markup.push(escapeMarkup(text.substring(match + tl, text.length)));
369
+ }
370
+
371
+ function defaultEscapeMarkup(markup) {
372
+ var replace_map = {
373
+ '\\': '&#92;',
374
+ '&': '&amp;',
375
+ '<': '&lt;',
376
+ '>': '&gt;',
377
+ '"': '&quot;',
378
+ "'": '&#39;',
379
+ "/": '&#47;'
380
+ };
381
+
382
+ return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
383
+ return replace_map[match];
384
+ });
385
+ }
386
+
387
+ /**
388
+ * Produces an ajax-based query function
389
+ *
390
+ * @param options object containing configuration parameters
391
+ * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
392
+ * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
393
+ * @param options.url url for the data
394
+ * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
395
+ * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
396
+ * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
397
+ * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
398
+ * The expected format is an object containing the following keys:
399
+ * results array of objects that will be used as choices
400
+ * more (optional) boolean indicating whether there are more results available
401
+ * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
402
+ */
403
+ function ajax(options) {
404
+ var timeout, // current scheduled but not yet executed request
405
+ handler = null,
406
+ quietMillis = options.quietMillis || 100,
407
+ ajaxUrl = options.url,
408
+ self = this;
409
+
410
+ return function (query) {
411
+ window.clearTimeout(timeout);
412
+ timeout = window.setTimeout(function () {
413
+ var data = options.data, // ajax data function
414
+ url = ajaxUrl, // ajax url string or function
415
+ transport = options.transport || $.fn.select2.ajaxDefaults.transport,
416
+ // deprecated - to be removed in 4.0 - use params instead
417
+ deprecated = {
418
+ type: options.type || 'GET', // set type of request (GET or POST)
419
+ cache: options.cache || false,
420
+ jsonpCallback: options.jsonpCallback||undefined,
421
+ dataType: options.dataType||"json"
422
+ },
423
+ params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
424
+
425
+ data = data ? data.call(self, query.term, query.page, query.context) : null;
426
+ url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
427
+
428
+ if (handler && typeof handler.abort === "function") { handler.abort(); }
429
+
430
+ if (options.params) {
431
+ if ($.isFunction(options.params)) {
432
+ $.extend(params, options.params.call(self));
433
+ } else {
434
+ $.extend(params, options.params);
435
+ }
436
+ }
437
+
438
+ $.extend(params, {
439
+ url: url,
440
+ dataType: options.dataType,
441
+ data: data,
442
+ success: function (data) {
443
+ // TODO - replace query.page with query so users have access to term, page, etc.
444
+ // added query as third paramter to keep backwards compatibility
445
+ var results = options.results(data, query.page, query);
446
+ query.callback(results);
447
+ },
448
+ error: function(jqXHR, textStatus, errorThrown){
449
+ var results = {
450
+ hasError: true,
451
+ jqXHR: jqXHR,
452
+ textStatus: textStatus,
453
+ errorThrown: errorThrown,
454
+ };
455
+
456
+ query.callback(results);
457
+ }
458
+ });
459
+ handler = transport.call(self, params);
460
+ }, quietMillis);
461
+ };
462
+ }
463
+
464
+ /**
465
+ * Produces a query function that works with a local array
466
+ *
467
+ * @param options object containing configuration parameters. The options parameter can either be an array or an
468
+ * object.
469
+ *
470
+ * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
471
+ *
472
+ * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
473
+ * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
474
+ * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
475
+ * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
476
+ * the text.
477
+ */
478
+ function local(options) {
479
+ var data = options, // data elements
480
+ dataText,
481
+ tmp,
482
+ text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
483
+
484
+ if ($.isArray(data)) {
485
+ tmp = data;
486
+ data = { results: tmp };
487
+ }
488
+
489
+ if ($.isFunction(data) === false) {
490
+ tmp = data;
491
+ data = function() { return tmp; };
492
+ }
493
+
494
+ var dataItem = data();
495
+ if (dataItem.text) {
496
+ text = dataItem.text;
497
+ // if text is not a function we assume it to be a key name
498
+ if (!$.isFunction(text)) {
499
+ dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
500
+ text = function (item) { return item[dataText]; };
501
+ }
502
+ }
503
+
504
+ return function (query) {
505
+ var t = query.term, filtered = { results: [] }, process;
506
+ if (t === "") {
507
+ query.callback(data());
508
+ return;
509
+ }
510
+
511
+ process = function(datum, collection) {
512
+ var group, attr;
513
+ datum = datum[0];
514
+ if (datum.children) {
515
+ group = {};
516
+ for (attr in datum) {
517
+ if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
518
+ }
519
+ group.children=[];
520
+ $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
521
+ if (group.children.length || query.matcher(t, text(group), datum)) {
522
+ collection.push(group);
523
+ }
524
+ } else {
525
+ if (query.matcher(t, text(datum), datum)) {
526
+ collection.push(datum);
527
+ }
528
+ }
529
+ };
530
+
531
+ $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
532
+ query.callback(filtered);
533
+ };
534
+ }
535
+
536
+ // TODO javadoc
537
+ function tags(data) {
538
+ var isFunc = $.isFunction(data);
539
+ return function (query) {
540
+ var t = query.term, filtered = {results: []};
541
+ var result = isFunc ? data(query) : data;
542
+ if ($.isArray(result)) {
543
+ $(result).each(function () {
544
+ var isObject = this.text !== undefined,
545
+ text = isObject ? this.text : this;
546
+ if (t === "" || query.matcher(t, text)) {
547
+ filtered.results.push(isObject ? this : {id: this, text: this});
548
+ }
549
+ });
550
+ query.callback(filtered);
551
+ }
552
+ };
553
+ }
554
+
555
+ /**
556
+ * Checks if the formatter function should be used.
557
+ *
558
+ * Throws an error if it is not a function. Returns true if it should be used,
559
+ * false if no formatting should be performed.
560
+ *
561
+ * @param formatter
562
+ */
563
+ function checkFormatter(formatter, formatterName) {
564
+ if ($.isFunction(formatter)) return true;
565
+ if (!formatter) return false;
566
+ if (typeof(formatter) === 'string') return true;
567
+ throw new Error(formatterName +" must be a string, function, or falsy value");
568
+ }
569
+
570
+ /**
571
+ * Returns a given value
572
+ * If given a function, returns its output
573
+ *
574
+ * @param val string|function
575
+ * @param context value of "this" to be passed to function
576
+ * @returns {*}
577
+ */
578
+ function evaluate(val, context) {
579
+ if ($.isFunction(val)) {
580
+ var args = Array.prototype.slice.call(arguments, 2);
581
+ return val.apply(context, args);
582
+ }
583
+ return val;
584
+ }
585
+
586
+ function countResults(results) {
587
+ var count = 0;
588
+ $.each(results, function(i, item) {
589
+ if (item.children) {
590
+ count += countResults(item.children);
591
+ } else {
592
+ count++;
593
+ }
594
+ });
595
+ return count;
596
+ }
597
+
598
+ /**
599
+ * Default tokenizer. This function uses breaks the input on substring match of any string from the
600
+ * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
601
+ * two options have to be defined in order for the tokenizer to work.
602
+ *
603
+ * @param input text user has typed so far or pasted into the search field
604
+ * @param selection currently selected choices
605
+ * @param selectCallback function(choice) callback tho add the choice to selection
606
+ * @param opts select2's opts
607
+ * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
608
+ */
609
+ function defaultTokenizer(input, selection, selectCallback, opts) {
610
+ var original = input, // store the original so we can compare and know if we need to tell the search to update its text
611
+ dupe = false, // check for whether a token we extracted represents a duplicate selected choice
612
+ token, // token
613
+ index, // position at which the separator was found
614
+ i, l, // looping variables
615
+ separator; // the matched separator
616
+
617
+ if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
618
+
619
+ while (true) {
620
+ index = -1;
621
+
622
+ for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
623
+ separator = opts.tokenSeparators[i];
624
+ index = input.indexOf(separator);
625
+ if (index >= 0) break;
626
+ }
627
+
628
+ if (index < 0) break; // did not find any token separator in the input string, bail
629
+
630
+ token = input.substring(0, index);
631
+ input = input.substring(index + separator.length);
632
+
633
+ if (token.length > 0) {
634
+ token = opts.createSearchChoice.call(this, token, selection);
635
+ if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
636
+ dupe = false;
637
+ for (i = 0, l = selection.length; i < l; i++) {
638
+ if (equal(opts.id(token), opts.id(selection[i]))) {
639
+ dupe = true; break;
640
+ }
641
+ }
642
+
643
+ if (!dupe) selectCallback(token);
644
+ }
645
+ }
646
+ }
647
+
648
+ if (original!==input) return input;
649
+ }
650
+
651
+ function cleanupJQueryElements() {
652
+ var self = this;
653
+
654
+ $.each(arguments, function (i, element) {
655
+ self[element].remove();
656
+ self[element] = null;
657
+ });
658
+ }
659
+
660
+ /**
661
+ * Creates a new class
662
+ *
663
+ * @param superClass
664
+ * @param methods
665
+ */
666
+ function clazz(SuperClass, methods) {
667
+ var constructor = function () {};
668
+ constructor.prototype = new SuperClass;
669
+ constructor.prototype.constructor = constructor;
670
+ constructor.prototype.parent = SuperClass.prototype;
671
+ constructor.prototype = $.extend(constructor.prototype, methods);
672
+ return constructor;
673
+ }
674
+
675
+ AbstractSelect2 = clazz(Object, {
676
+
677
+ // abstract
678
+ bind: function (func) {
679
+ var self = this;
680
+ return function () {
681
+ func.apply(self, arguments);
682
+ };
683
+ },
684
+
685
+ // abstract
686
+ init: function (opts) {
687
+ var results, search, resultsSelector = ".select2-results";
688
+
689
+ // prepare options
690
+ this.opts = opts = this.prepareOpts(opts);
691
+
692
+ this.id=opts.id;
693
+
694
+ // destroy if called on an existing component
695
+ if (opts.element.data("select2") !== undefined &&
696
+ opts.element.data("select2") !== null) {
697
+ opts.element.data("select2").destroy();
698
+ }
699
+
700
+ this.container = this.createContainer();
701
+
702
+ this.liveRegion = $("<span>", {
703
+ role: "status",
704
+ "aria-live": "polite"
705
+ })
706
+ .addClass("select2-hidden-accessible")
707
+ .appendTo(document.body);
708
+
709
+ this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
710
+ this.containerEventName= this.containerId
711
+ .replace(/([.])/g, '_')
712
+ .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
713
+ this.container.attr("id", this.containerId);
714
+
715
+ this.container.attr("title", opts.element.attr("title"));
716
+
717
+ this.body = $("body");
718
+
719
+ syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
720
+
721
+ this.container.attr("style", opts.element.attr("style"));
722
+ this.container.css(evaluate(opts.containerCss, this.opts.element));
723
+ this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
724
+
725
+ this.elementTabIndex = this.opts.element.attr("tabindex");
726
+
727
+ // swap container for the element
728
+ this.opts.element
729
+ .data("select2", this)
730
+ .attr("tabindex", "-1")
731
+ .before(this.container)
732
+ .on("click.select2", killEvent); // do not leak click events
733
+
734
+ this.container.data("select2", this);
735
+
736
+ this.dropdown = this.container.find(".select2-drop");
737
+
738
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
739
+
740
+ this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
741
+ this.dropdown.data("select2", this);
742
+ this.dropdown.on("click", killEvent);
743
+
744
+ this.results = results = this.container.find(resultsSelector);
745
+ this.search = search = this.container.find("input.select2-input");
746
+
747
+ this.queryCount = 0;
748
+ this.resultsPage = 0;
749
+ this.context = null;
750
+
751
+ // initialize the container
752
+ this.initContainer();
753
+
754
+ this.container.on("click", killEvent);
755
+
756
+ installFilteredMouseMove(this.results);
757
+
758
+ this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
759
+ this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
760
+ this._touchEvent = true;
761
+ this.highlightUnderEvent(event);
762
+ }));
763
+ this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
764
+ this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
765
+
766
+ // Waiting for a click event on touch devices to select option and hide dropdown
767
+ // otherwise click will be triggered on an underlying element
768
+ this.dropdown.on('click', this.bind(function (event) {
769
+ if (this._touchEvent) {
770
+ this._touchEvent = false;
771
+ this.selectHighlighted();
772
+ }
773
+ }));
774
+
775
+ installDebouncedScroll(80, this.results);
776
+ this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
777
+
778
+ // do not propagate change event from the search field out of the component
779
+ $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
780
+ $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
781
+
782
+ // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
783
+ if ($.fn.mousewheel) {
784
+ results.mousewheel(function (e, delta, deltaX, deltaY) {
785
+ var top = results.scrollTop();
786
+ if (deltaY > 0 && top - deltaY <= 0) {
787
+ results.scrollTop(0);
788
+ killEvent(e);
789
+ } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
790
+ results.scrollTop(results.get(0).scrollHeight - results.height());
791
+ killEvent(e);
792
+ }
793
+ });
794
+ }
795
+
796
+ installKeyUpChangeEvent(search);
797
+ search.on("keyup-change input paste", this.bind(this.updateResults));
798
+ search.on("focus", function () { search.addClass("select2-focused"); });
799
+ search.on("blur", function () { search.removeClass("select2-focused");});
800
+
801
+ this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
802
+ if ($(e.target).closest(".select2-result-selectable").length > 0) {
803
+ this.highlightUnderEvent(e);
804
+ this.selectHighlighted(e);
805
+ }
806
+ }));
807
+
808
+ // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
809
+ // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
810
+ // dom it will trigger the popup close, which is not what we want
811
+ // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
812
+ this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
813
+
814
+ this.nextSearchTerm = undefined;
815
+
816
+ if ($.isFunction(this.opts.initSelection)) {
817
+ // initialize selection based on the current value of the source element
818
+ this.initSelection();
819
+
820
+ // if the user has provided a function that can set selection based on the value of the source element
821
+ // we monitor the change event on the element and trigger it, allowing for two way synchronization
822
+ this.monitorSource();
823
+ }
824
+
825
+ if (opts.maximumInputLength !== null) {
826
+ this.search.attr("maxlength", opts.maximumInputLength);
827
+ }
828
+
829
+ var disabled = opts.element.prop("disabled");
830
+ if (disabled === undefined) disabled = false;
831
+ this.enable(!disabled);
832
+
833
+ var readonly = opts.element.prop("readonly");
834
+ if (readonly === undefined) readonly = false;
835
+ this.readonly(readonly);
836
+
837
+ // Calculate size of scrollbar
838
+ scrollBarDimensions = scrollBarDimensions || measureScrollbar();
839
+
840
+ this.autofocus = opts.element.prop("autofocus");
841
+ opts.element.prop("autofocus", false);
842
+ if (this.autofocus) this.focus();
843
+
844
+ this.search.attr("placeholder", opts.searchInputPlaceholder);
845
+ },
846
+
847
+ // abstract
848
+ destroy: function () {
849
+ var element=this.opts.element, select2 = element.data("select2"), self = this;
850
+
851
+ this.close();
852
+
853
+ if (element.length && element[0].detachEvent) {
854
+ element.each(function () {
855
+ this.detachEvent("onpropertychange", self._sync);
856
+ });
857
+ }
858
+ if (this.propertyObserver) {
859
+ this.propertyObserver.disconnect();
860
+ this.propertyObserver = null;
861
+ }
862
+ this._sync = null;
863
+
864
+ if (select2 !== undefined) {
865
+ select2.container.remove();
866
+ select2.liveRegion.remove();
867
+ select2.dropdown.remove();
868
+ element
869
+ .removeClass("select2-offscreen")
870
+ .removeData("select2")
871
+ .off(".select2")
872
+ .prop("autofocus", this.autofocus || false);
873
+ if (this.elementTabIndex) {
874
+ element.attr({tabindex: this.elementTabIndex});
875
+ } else {
876
+ element.removeAttr("tabindex");
877
+ }
878
+ element.show();
879
+ }
880
+
881
+ cleanupJQueryElements.call(this,
882
+ "container",
883
+ "liveRegion",
884
+ "dropdown",
885
+ "results",
886
+ "search"
887
+ );
888
+ },
889
+
890
+ // abstract
891
+ optionToData: function(element) {
892
+ if (element.is("option")) {
893
+ return {
894
+ id:element.prop("value"),
895
+ text:element.text(),
896
+ element: element.get(),
897
+ css: element.attr("class"),
898
+ disabled: element.prop("disabled"),
899
+ locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
900
+ };
901
+ } else if (element.is("optgroup")) {
902
+ return {
903
+ text:element.attr("label"),
904
+ children:[],
905
+ element: element.get(),
906
+ css: element.attr("class")
907
+ };
908
+ }
909
+ },
910
+
911
+ // abstract
912
+ prepareOpts: function (opts) {
913
+ var element, select, idKey, ajaxUrl, self = this;
914
+
915
+ element = opts.element;
916
+
917
+ if (element.get(0).tagName.toLowerCase() === "select") {
918
+ this.select = select = opts.element;
919
+ }
920
+
921
+ if (select) {
922
+ // these options are not allowed when attached to a select because they are picked up off the element itself
923
+ $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
924
+ if (this in opts) {
925
+ throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
926
+ }
927
+ });
928
+ }
929
+
930
+ opts = $.extend({}, {
931
+ populateResults: function(container, results, query) {
932
+ var populate, id=this.opts.id, liveRegion=this.liveRegion;
933
+
934
+ populate=function(results, container, depth) {
935
+
936
+ var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
937
+
938
+ results = opts.sortResults(results, container, query);
939
+
940
+ // collect the created nodes for bulk append
941
+ var nodes = [];
942
+ for (i = 0, l = results.length; i < l; i = i + 1) {
943
+
944
+ result=results[i];
945
+
946
+ disabled = (result.disabled === true);
947
+ selectable = (!disabled) && (id(result) !== undefined);
948
+
949
+ compound=result.children && result.children.length > 0;
950
+
951
+ node=$("<li></li>");
952
+ node.addClass("select2-results-dept-"+depth);
953
+ node.addClass("select2-result");
954
+ node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
955
+ if (disabled) { node.addClass("select2-disabled"); }
956
+ if (compound) { node.addClass("select2-result-with-children"); }
957
+ node.addClass(self.opts.formatResultCssClass(result));
958
+ node.attr("role", "presentation");
959
+
960
+ label=$(document.createElement("div"));
961
+ label.addClass("select2-result-label");
962
+ label.attr("id", "select2-result-label-" + nextUid());
963
+ label.attr("role", "option");
964
+
965
+ formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
966
+ if (formatted!==undefined) {
967
+ label.html(formatted);
968
+ node.append(label);
969
+ }
970
+
971
+
972
+ if (compound) {
973
+
974
+ innerContainer=$("<ul></ul>");
975
+ innerContainer.addClass("select2-result-sub");
976
+ populate(result.children, innerContainer, depth+1);
977
+ node.append(innerContainer);
978
+ }
979
+
980
+ node.data("select2-data", result);
981
+ nodes.push(node[0]);
982
+ }
983
+
984
+ // bulk append the created nodes
985
+ container.append(nodes);
986
+ liveRegion.text(opts.formatMatches(results.length));
987
+ };
988
+
989
+ populate(results, container, 0);
990
+ }
991
+ }, $.fn.select2.defaults, opts);
992
+
993
+ if (typeof(opts.id) !== "function") {
994
+ idKey = opts.id;
995
+ opts.id = function (e) { return e[idKey]; };
996
+ }
997
+
998
+ if ($.isArray(opts.element.data("select2Tags"))) {
999
+ if ("tags" in opts) {
1000
+ throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1001
+ }
1002
+ opts.tags=opts.element.data("select2Tags");
1003
+ }
1004
+
1005
+ if (select) {
1006
+ opts.query = this.bind(function (query) {
1007
+ var data = { results: [], more: false },
1008
+ term = query.term,
1009
+ children, placeholderOption, process;
1010
+
1011
+ process=function(element, collection) {
1012
+ var group;
1013
+ if (element.is("option")) {
1014
+ if (query.matcher(term, element.text(), element)) {
1015
+ collection.push(self.optionToData(element));
1016
+ }
1017
+ } else if (element.is("optgroup")) {
1018
+ group=self.optionToData(element);
1019
+ element.children().each2(function(i, elm) { process(elm, group.children); });
1020
+ if (group.children.length>0) {
1021
+ collection.push(group);
1022
+ }
1023
+ }
1024
+ };
1025
+
1026
+ children=element.children();
1027
+
1028
+ // ignore the placeholder option if there is one
1029
+ if (this.getPlaceholder() !== undefined && children.length > 0) {
1030
+ placeholderOption = this.getPlaceholderOption();
1031
+ if (placeholderOption) {
1032
+ children=children.not(placeholderOption);
1033
+ }
1034
+ }
1035
+
1036
+ children.each2(function(i, elm) { process(elm, data.results); });
1037
+
1038
+ query.callback(data);
1039
+ });
1040
+ // this is needed because inside val() we construct choices from options and their id is hardcoded
1041
+ opts.id=function(e) { return e.id; };
1042
+ } else {
1043
+ if (!("query" in opts)) {
1044
+
1045
+ if ("ajax" in opts) {
1046
+ ajaxUrl = opts.element.data("ajax-url");
1047
+ if (ajaxUrl && ajaxUrl.length > 0) {
1048
+ opts.ajax.url = ajaxUrl;
1049
+ }
1050
+ opts.query = ajax.call(opts.element, opts.ajax);
1051
+ } else if ("data" in opts) {
1052
+ opts.query = local(opts.data);
1053
+ } else if ("tags" in opts) {
1054
+ opts.query = tags(opts.tags);
1055
+ if (opts.createSearchChoice === undefined) {
1056
+ opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1057
+ }
1058
+ if (opts.initSelection === undefined) {
1059
+ opts.initSelection = function (element, callback) {
1060
+ var data = [];
1061
+ $(splitVal(element.val(), opts.separator)).each(function () {
1062
+ var obj = { id: this, text: this },
1063
+ tags = opts.tags;
1064
+ if ($.isFunction(tags)) tags=tags();
1065
+ $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1066
+ data.push(obj);
1067
+ });
1068
+
1069
+ callback(data);
1070
+ };
1071
+ }
1072
+ }
1073
+ }
1074
+ }
1075
+ if (typeof(opts.query) !== "function") {
1076
+ throw "query function not defined for Select2 " + opts.element.attr("id");
1077
+ }
1078
+
1079
+ if (opts.createSearchChoicePosition === 'top') {
1080
+ opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1081
+ }
1082
+ else if (opts.createSearchChoicePosition === 'bottom') {
1083
+ opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1084
+ }
1085
+ else if (typeof(opts.createSearchChoicePosition) !== "function") {
1086
+ throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1087
+ }
1088
+
1089
+ return opts;
1090
+ },
1091
+
1092
+ /**
1093
+ * Monitor the original element for changes and update select2 accordingly
1094
+ */
1095
+ // abstract
1096
+ monitorSource: function () {
1097
+ var el = this.opts.element, observer, self = this;
1098
+
1099
+ el.on("change.select2", this.bind(function (e) {
1100
+ if (this.opts.element.data("select2-change-triggered") !== true) {
1101
+ this.initSelection();
1102
+ }
1103
+ }));
1104
+
1105
+ this._sync = this.bind(function () {
1106
+
1107
+ // sync enabled state
1108
+ var disabled = el.prop("disabled");
1109
+ if (disabled === undefined) disabled = false;
1110
+ this.enable(!disabled);
1111
+
1112
+ var readonly = el.prop("readonly");
1113
+ if (readonly === undefined) readonly = false;
1114
+ this.readonly(readonly);
1115
+
1116
+ syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1117
+ this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1118
+
1119
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1120
+ this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1121
+
1122
+ });
1123
+
1124
+ // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1125
+ if (el.length && el[0].attachEvent) {
1126
+ el.each(function() {
1127
+ this.attachEvent("onpropertychange", self._sync);
1128
+ });
1129
+ }
1130
+
1131
+ // safari, chrome, firefox, IE11
1132
+ observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1133
+ if (observer !== undefined) {
1134
+ if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1135
+ this.propertyObserver = new observer(function (mutations) {
1136
+ $.each(mutations, self._sync);
1137
+ });
1138
+ this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1139
+ }
1140
+ },
1141
+
1142
+ // abstract
1143
+ triggerSelect: function(data) {
1144
+ var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1145
+ this.opts.element.trigger(evt);
1146
+ return !evt.isDefaultPrevented();
1147
+ },
1148
+
1149
+ /**
1150
+ * Triggers the change event on the source element
1151
+ */
1152
+ // abstract
1153
+ triggerChange: function (details) {
1154
+
1155
+ details = details || {};
1156
+ details= $.extend({}, details, { type: "change", val: this.val() });
1157
+ // prevents recursive triggering
1158
+ this.opts.element.data("select2-change-triggered", true);
1159
+ this.opts.element.trigger(details);
1160
+ this.opts.element.data("select2-change-triggered", false);
1161
+
1162
+ // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1163
+ // so here we trigger the click event manually
1164
+ this.opts.element.click();
1165
+
1166
+ // ValidationEngine ignores the change event and listens instead to blur
1167
+ // so here we trigger the blur event manually if so desired
1168
+ if (this.opts.blurOnChange)
1169
+ this.opts.element.blur();
1170
+ },
1171
+
1172
+ //abstract
1173
+ isInterfaceEnabled: function()
1174
+ {
1175
+ return this.enabledInterface === true;
1176
+ },
1177
+
1178
+ // abstract
1179
+ enableInterface: function() {
1180
+ var enabled = this._enabled && !this._readonly,
1181
+ disabled = !enabled;
1182
+
1183
+ if (enabled === this.enabledInterface) return false;
1184
+
1185
+ this.container.toggleClass("select2-container-disabled", disabled);
1186
+ this.close();
1187
+ this.enabledInterface = enabled;
1188
+
1189
+ return true;
1190
+ },
1191
+
1192
+ // abstract
1193
+ enable: function(enabled) {
1194
+ if (enabled === undefined) enabled = true;
1195
+ if (this._enabled === enabled) return;
1196
+ this._enabled = enabled;
1197
+
1198
+ this.opts.element.prop("disabled", !enabled);
1199
+ this.enableInterface();
1200
+ },
1201
+
1202
+ // abstract
1203
+ disable: function() {
1204
+ this.enable(false);
1205
+ },
1206
+
1207
+ // abstract
1208
+ readonly: function(enabled) {
1209
+ if (enabled === undefined) enabled = false;
1210
+ if (this._readonly === enabled) return;
1211
+ this._readonly = enabled;
1212
+
1213
+ this.opts.element.prop("readonly", enabled);
1214
+ this.enableInterface();
1215
+ },
1216
+
1217
+ // abstract
1218
+ opened: function () {
1219
+ return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1220
+ },
1221
+
1222
+ // abstract
1223
+ positionDropdown: function() {
1224
+ var $dropdown = this.dropdown,
1225
+ offset = this.container.offset(),
1226
+ height = this.container.outerHeight(false),
1227
+ width = this.container.outerWidth(false),
1228
+ dropHeight = $dropdown.outerHeight(false),
1229
+ $window = $(window),
1230
+ windowWidth = $window.width(),
1231
+ windowHeight = $window.height(),
1232
+ viewPortRight = $window.scrollLeft() + windowWidth,
1233
+ viewportBottom = $window.scrollTop() + windowHeight,
1234
+ dropTop = offset.top + height,
1235
+ dropLeft = offset.left,
1236
+ enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1237
+ enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1238
+ dropWidth = $dropdown.outerWidth(false),
1239
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
1240
+ aboveNow = $dropdown.hasClass("select2-drop-above"),
1241
+ bodyOffset,
1242
+ above,
1243
+ changeDirection,
1244
+ css,
1245
+ resultsListNode;
1246
+
1247
+ // always prefer the current above/below alignment, unless there is not enough room
1248
+ if (aboveNow) {
1249
+ above = true;
1250
+ if (!enoughRoomAbove && enoughRoomBelow) {
1251
+ changeDirection = true;
1252
+ above = false;
1253
+ }
1254
+ } else {
1255
+ above = false;
1256
+ if (!enoughRoomBelow && enoughRoomAbove) {
1257
+ changeDirection = true;
1258
+ above = true;
1259
+ }
1260
+ }
1261
+
1262
+ //if we are changing direction we need to get positions when dropdown is hidden;
1263
+ if (changeDirection) {
1264
+ $dropdown.hide();
1265
+ offset = this.container.offset();
1266
+ height = this.container.outerHeight(false);
1267
+ width = this.container.outerWidth(false);
1268
+ dropHeight = $dropdown.outerHeight(false);
1269
+ viewPortRight = $window.scrollLeft() + windowWidth;
1270
+ viewportBottom = $window.scrollTop() + windowHeight;
1271
+ dropTop = offset.top + height;
1272
+ dropLeft = offset.left;
1273
+ dropWidth = $dropdown.outerWidth(false);
1274
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
1275
+ $dropdown.show();
1276
+
1277
+ // fix so the cursor does not move to the left within the search-textbox in IE
1278
+ this.focusSearch();
1279
+ }
1280
+
1281
+ if (this.opts.dropdownAutoWidth) {
1282
+ resultsListNode = $('.select2-results', $dropdown)[0];
1283
+ $dropdown.addClass('select2-drop-auto-width');
1284
+ $dropdown.css('width', '');
1285
+ // Add scrollbar width to dropdown if vertical scrollbar is present
1286
+ dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1287
+ dropWidth > width ? width = dropWidth : dropWidth = width;
1288
+ dropHeight = $dropdown.outerHeight(false);
1289
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
1290
+ }
1291
+ else {
1292
+ this.container.removeClass('select2-drop-auto-width');
1293
+ }
1294
+
1295
+ //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1296
+ //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1297
+
1298
+ // fix positioning when body has an offset and is not position: static
1299
+ if (this.body.css('position') !== 'static') {
1300
+ bodyOffset = this.body.offset();
1301
+ dropTop -= bodyOffset.top;
1302
+ dropLeft -= bodyOffset.left;
1303
+ }
1304
+
1305
+ if (!enoughRoomOnRight) {
1306
+ dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1307
+ }
1308
+
1309
+ css = {
1310
+ left: dropLeft,
1311
+ width: width
1312
+ };
1313
+
1314
+ if (above) {
1315
+ css.top = offset.top - dropHeight;
1316
+ css.bottom = 'auto';
1317
+ this.container.addClass("select2-drop-above");
1318
+ $dropdown.addClass("select2-drop-above");
1319
+ }
1320
+ else {
1321
+ css.top = dropTop;
1322
+ css.bottom = 'auto';
1323
+ this.container.removeClass("select2-drop-above");
1324
+ $dropdown.removeClass("select2-drop-above");
1325
+ }
1326
+ css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1327
+
1328
+ $dropdown.css(css);
1329
+ },
1330
+
1331
+ // abstract
1332
+ shouldOpen: function() {
1333
+ var event;
1334
+
1335
+ if (this.opened()) return false;
1336
+
1337
+ if (this._enabled === false || this._readonly === true) return false;
1338
+
1339
+ event = $.Event("select2-opening");
1340
+ this.opts.element.trigger(event);
1341
+ return !event.isDefaultPrevented();
1342
+ },
1343
+
1344
+ // abstract
1345
+ clearDropdownAlignmentPreference: function() {
1346
+ // clear the classes used to figure out the preference of where the dropdown should be opened
1347
+ this.container.removeClass("select2-drop-above");
1348
+ this.dropdown.removeClass("select2-drop-above");
1349
+ },
1350
+
1351
+ /**
1352
+ * Opens the dropdown
1353
+ *
1354
+ * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1355
+ * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1356
+ */
1357
+ // abstract
1358
+ open: function () {
1359
+
1360
+ if (!this.shouldOpen()) return false;
1361
+
1362
+ this.opening();
1363
+
1364
+ // Only bind the document mousemove when the dropdown is visible
1365
+ $document.on("mousemove.select2Event", function (e) {
1366
+ lastMousePosition.x = e.pageX;
1367
+ lastMousePosition.y = e.pageY;
1368
+ });
1369
+
1370
+ return true;
1371
+ },
1372
+
1373
+ /**
1374
+ * Performs the opening of the dropdown
1375
+ */
1376
+ // abstract
1377
+ opening: function() {
1378
+ var cid = this.containerEventName,
1379
+ scroll = "scroll." + cid,
1380
+ resize = "resize."+cid,
1381
+ orient = "orientationchange."+cid,
1382
+ mask;
1383
+
1384
+ this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1385
+
1386
+ this.clearDropdownAlignmentPreference();
1387
+
1388
+ if(this.dropdown[0] !== this.body.children().last()[0]) {
1389
+ this.dropdown.detach().appendTo(this.body);
1390
+ }
1391
+
1392
+ // create the dropdown mask if doesn't already exist
1393
+ mask = $("#select2-drop-mask");
1394
+ if (mask.length == 0) {
1395
+ mask = $(document.createElement("div"));
1396
+ mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1397
+ mask.hide();
1398
+ mask.appendTo(this.body);
1399
+ mask.on("mousedown touchstart click", function (e) {
1400
+ // Prevent IE from generating a click event on the body
1401
+ reinsertElement(mask);
1402
+
1403
+ var dropdown = $("#select2-drop"), self;
1404
+ if (dropdown.length > 0) {
1405
+ self=dropdown.data("select2");
1406
+ if (self.opts.selectOnBlur) {
1407
+ self.selectHighlighted({noFocus: true});
1408
+ }
1409
+ self.close();
1410
+ e.preventDefault();
1411
+ e.stopPropagation();
1412
+ }
1413
+ });
1414
+ }
1415
+
1416
+ // ensure the mask is always right before the dropdown
1417
+ if (this.dropdown.prev()[0] !== mask[0]) {
1418
+ this.dropdown.before(mask);
1419
+ }
1420
+
1421
+ // move the global id to the correct dropdown
1422
+ $("#select2-drop").removeAttr("id");
1423
+ this.dropdown.attr("id", "select2-drop");
1424
+
1425
+ // show the elements
1426
+ mask.show();
1427
+
1428
+ this.positionDropdown();
1429
+ this.dropdown.show();
1430
+ this.positionDropdown();
1431
+
1432
+ this.dropdown.addClass("select2-drop-active");
1433
+
1434
+ // attach listeners to events that can change the position of the container and thus require
1435
+ // the position of the dropdown to be updated as well so it does not come unglued from the container
1436
+ var that = this;
1437
+ this.container.parents().add(window).each(function () {
1438
+ $(this).on(resize+" "+scroll+" "+orient, function (e) {
1439
+ if (that.opened()) that.positionDropdown();
1440
+ });
1441
+ });
1442
+
1443
+
1444
+ },
1445
+
1446
+ // abstract
1447
+ close: function () {
1448
+ if (!this.opened()) return;
1449
+
1450
+ var cid = this.containerEventName,
1451
+ scroll = "scroll." + cid,
1452
+ resize = "resize."+cid,
1453
+ orient = "orientationchange."+cid;
1454
+
1455
+ // unbind event listeners
1456
+ this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1457
+
1458
+ this.clearDropdownAlignmentPreference();
1459
+
1460
+ $("#select2-drop-mask").hide();
1461
+ this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1462
+ this.dropdown.hide();
1463
+ this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1464
+ this.results.empty();
1465
+
1466
+ // Now that the dropdown is closed, unbind the global document mousemove event
1467
+ $document.off("mousemove.select2Event");
1468
+
1469
+ this.clearSearch();
1470
+ this.search.removeClass("select2-active");
1471
+ this.opts.element.trigger($.Event("select2-close"));
1472
+ },
1473
+
1474
+ /**
1475
+ * Opens control, sets input value, and updates results.
1476
+ */
1477
+ // abstract
1478
+ externalSearch: function (term) {
1479
+ this.open();
1480
+ this.search.val(term);
1481
+ this.updateResults(false);
1482
+ },
1483
+
1484
+ // abstract
1485
+ clearSearch: function () {
1486
+
1487
+ },
1488
+
1489
+ //abstract
1490
+ getMaximumSelectionSize: function() {
1491
+ return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1492
+ },
1493
+
1494
+ // abstract
1495
+ ensureHighlightVisible: function () {
1496
+ var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1497
+
1498
+ index = this.highlight();
1499
+
1500
+ if (index < 0) return;
1501
+
1502
+ if (index == 0) {
1503
+
1504
+ // if the first element is highlighted scroll all the way to the top,
1505
+ // that way any unselectable headers above it will also be scrolled
1506
+ // into view
1507
+
1508
+ results.scrollTop(0);
1509
+ return;
1510
+ }
1511
+
1512
+ children = this.findHighlightableChoices().find('.select2-result-label');
1513
+
1514
+ child = $(children[index]);
1515
+
1516
+ topOffset = (child.offset() || {}).top || 0;
1517
+
1518
+ hb = topOffset + child.outerHeight(true);
1519
+
1520
+ // if this is the last child lets also make sure select2-more-results is visible
1521
+ if (index === children.length - 1) {
1522
+ more = results.find("li.select2-more-results");
1523
+ if (more.length > 0) {
1524
+ hb = more.offset().top + more.outerHeight(true);
1525
+ }
1526
+ }
1527
+
1528
+ rb = results.offset().top + results.outerHeight(true);
1529
+ if (hb > rb) {
1530
+ results.scrollTop(results.scrollTop() + (hb - rb));
1531
+ }
1532
+ y = topOffset - results.offset().top;
1533
+
1534
+ // make sure the top of the element is visible
1535
+ if (y < 0 && child.css('display') != 'none' ) {
1536
+ results.scrollTop(results.scrollTop() + y); // y is negative
1537
+ }
1538
+ },
1539
+
1540
+ // abstract
1541
+ findHighlightableChoices: function() {
1542
+ return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1543
+ },
1544
+
1545
+ // abstract
1546
+ moveHighlight: function (delta) {
1547
+ var choices = this.findHighlightableChoices(),
1548
+ index = this.highlight();
1549
+
1550
+ while (index > -1 && index < choices.length) {
1551
+ index += delta;
1552
+ var choice = $(choices[index]);
1553
+ if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1554
+ this.highlight(index);
1555
+ break;
1556
+ }
1557
+ }
1558
+ },
1559
+
1560
+ // abstract
1561
+ highlight: function (index) {
1562
+ var choices = this.findHighlightableChoices(),
1563
+ choice,
1564
+ data;
1565
+
1566
+ if (arguments.length === 0) {
1567
+ return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1568
+ }
1569
+
1570
+ if (index >= choices.length) index = choices.length - 1;
1571
+ if (index < 0) index = 0;
1572
+
1573
+ this.removeHighlight();
1574
+
1575
+ choice = $(choices[index]);
1576
+ choice.addClass("select2-highlighted");
1577
+
1578
+ // ensure assistive technology can determine the active choice
1579
+ this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1580
+
1581
+ this.ensureHighlightVisible();
1582
+
1583
+ this.liveRegion.text(choice.text());
1584
+
1585
+ data = choice.data("select2-data");
1586
+ if (data) {
1587
+ this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1588
+ }
1589
+ },
1590
+
1591
+ removeHighlight: function() {
1592
+ this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1593
+ },
1594
+
1595
+ touchMoved: function() {
1596
+ this._touchMoved = true;
1597
+ },
1598
+
1599
+ clearTouchMoved: function() {
1600
+ this._touchMoved = false;
1601
+ },
1602
+
1603
+ // abstract
1604
+ countSelectableResults: function() {
1605
+ return this.findHighlightableChoices().length;
1606
+ },
1607
+
1608
+ // abstract
1609
+ highlightUnderEvent: function (event) {
1610
+ var el = $(event.target).closest(".select2-result-selectable");
1611
+ if (el.length > 0 && !el.is(".select2-highlighted")) {
1612
+ var choices = this.findHighlightableChoices();
1613
+ this.highlight(choices.index(el));
1614
+ } else if (el.length == 0) {
1615
+ // if we are over an unselectable item remove all highlights
1616
+ this.removeHighlight();
1617
+ }
1618
+ },
1619
+
1620
+ // abstract
1621
+ loadMoreIfNeeded: function () {
1622
+ var results = this.results,
1623
+ more = results.find("li.select2-more-results"),
1624
+ below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1625
+ page = this.resultsPage + 1,
1626
+ self=this,
1627
+ term=this.search.val(),
1628
+ context=this.context;
1629
+
1630
+ if (more.length === 0) return;
1631
+ below = more.offset().top - results.offset().top - results.height();
1632
+
1633
+ if (below <= this.opts.loadMorePadding) {
1634
+ more.addClass("select2-active");
1635
+ this.opts.query({
1636
+ element: this.opts.element,
1637
+ term: term,
1638
+ page: page,
1639
+ context: context,
1640
+ matcher: this.opts.matcher,
1641
+ callback: this.bind(function (data) {
1642
+
1643
+ // ignore a response if the select2 has been closed before it was received
1644
+ if (!self.opened()) return;
1645
+
1646
+
1647
+ self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1648
+ self.postprocessResults(data, false, false);
1649
+
1650
+ if (data.more===true) {
1651
+ more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, self.opts.element, page+1));
1652
+ window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1653
+ } else {
1654
+ more.remove();
1655
+ }
1656
+ self.positionDropdown();
1657
+ self.resultsPage = page;
1658
+ self.context = data.context;
1659
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
1660
+ })});
1661
+ }
1662
+ },
1663
+
1664
+ /**
1665
+ * Default tokenizer function which does nothing
1666
+ */
1667
+ tokenize: function() {
1668
+
1669
+ },
1670
+
1671
+ /**
1672
+ * @param initial whether or not this is the call to this method right after the dropdown has been opened
1673
+ */
1674
+ // abstract
1675
+ updateResults: function (initial) {
1676
+ var search = this.search,
1677
+ results = this.results,
1678
+ opts = this.opts,
1679
+ data,
1680
+ self = this,
1681
+ input,
1682
+ term = search.val(),
1683
+ lastTerm = $.data(this.container, "select2-last-term"),
1684
+ // sequence number used to drop out-of-order responses
1685
+ queryNumber;
1686
+
1687
+ // prevent duplicate queries against the same term
1688
+ if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1689
+
1690
+ $.data(this.container, "select2-last-term", term);
1691
+
1692
+ // if the search is currently hidden we do not alter the results
1693
+ if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1694
+ return;
1695
+ }
1696
+
1697
+ function postRender() {
1698
+ search.removeClass("select2-active");
1699
+ self.positionDropdown();
1700
+ if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1701
+ self.liveRegion.text(results.text());
1702
+ }
1703
+ else {
1704
+ self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));
1705
+ }
1706
+ }
1707
+
1708
+ function render(html) {
1709
+ results.html(html);
1710
+ postRender();
1711
+ }
1712
+
1713
+ queryNumber = ++this.queryCount;
1714
+
1715
+ var maxSelSize = this.getMaximumSelectionSize();
1716
+ if (maxSelSize >=1) {
1717
+ data = this.data();
1718
+ if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1719
+ render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1720
+ return;
1721
+ }
1722
+ }
1723
+
1724
+ if (search.val().length < opts.minimumInputLength) {
1725
+ if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1726
+ render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1727
+ } else {
1728
+ render("");
1729
+ }
1730
+ if (initial && this.showSearch) this.showSearch(true);
1731
+ return;
1732
+ }
1733
+
1734
+ if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1735
+ if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1736
+ render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1737
+ } else {
1738
+ render("");
1739
+ }
1740
+ return;
1741
+ }
1742
+
1743
+ if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1744
+ render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1745
+ }
1746
+
1747
+ search.addClass("select2-active");
1748
+
1749
+ this.removeHighlight();
1750
+
1751
+ // give the tokenizer a chance to pre-process the input
1752
+ input = this.tokenize();
1753
+ if (input != undefined && input != null) {
1754
+ search.val(input);
1755
+ }
1756
+
1757
+ this.resultsPage = 1;
1758
+
1759
+ opts.query({
1760
+ element: opts.element,
1761
+ term: search.val(),
1762
+ page: this.resultsPage,
1763
+ context: null,
1764
+ matcher: opts.matcher,
1765
+ callback: this.bind(function (data) {
1766
+ var def; // default choice
1767
+
1768
+ // ignore old responses
1769
+ if (queryNumber != this.queryCount) {
1770
+ return;
1771
+ }
1772
+
1773
+ // ignore a response if the select2 has been closed before it was received
1774
+ if (!this.opened()) {
1775
+ this.search.removeClass("select2-active");
1776
+ return;
1777
+ }
1778
+
1779
+ // handle ajax error
1780
+ if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1781
+ render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1782
+ return;
1783
+ }
1784
+
1785
+ // save context, if any
1786
+ this.context = (data.context===undefined) ? null : data.context;
1787
+ // create a default choice and prepend it to the list
1788
+ if (this.opts.createSearchChoice && search.val() !== "") {
1789
+ def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1790
+ if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1791
+ if ($(data.results).filter(
1792
+ function () {
1793
+ return equal(self.id(this), self.id(def));
1794
+ }).length === 0) {
1795
+ this.opts.createSearchChoicePosition(data.results, def);
1796
+ }
1797
+ }
1798
+ }
1799
+
1800
+ if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1801
+ render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1802
+ return;
1803
+ }
1804
+
1805
+ results.empty();
1806
+ self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1807
+
1808
+ if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
1809
+ results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
1810
+ window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1811
+ }
1812
+
1813
+ this.postprocessResults(data, initial);
1814
+
1815
+ postRender();
1816
+
1817
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
1818
+ })});
1819
+ },
1820
+
1821
+ // abstract
1822
+ cancel: function () {
1823
+ this.close();
1824
+ },
1825
+
1826
+ // abstract
1827
+ blur: function () {
1828
+ // if selectOnBlur == true, select the currently highlighted option
1829
+ if (this.opts.selectOnBlur)
1830
+ this.selectHighlighted({noFocus: true});
1831
+
1832
+ this.close();
1833
+ this.container.removeClass("select2-container-active");
1834
+ // synonymous to .is(':focus'), which is available in jquery >= 1.6
1835
+ if (this.search[0] === document.activeElement) { this.search.blur(); }
1836
+ this.clearSearch();
1837
+ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1838
+ },
1839
+
1840
+ // abstract
1841
+ focusSearch: function () {
1842
+ focus(this.search);
1843
+ },
1844
+
1845
+ // abstract
1846
+ selectHighlighted: function (options) {
1847
+ if (this._touchMoved) {
1848
+ this.clearTouchMoved();
1849
+ return;
1850
+ }
1851
+ var index=this.highlight(),
1852
+ highlighted=this.results.find(".select2-highlighted"),
1853
+ data = highlighted.closest('.select2-result').data("select2-data");
1854
+
1855
+ if (data) {
1856
+ this.highlight(index);
1857
+ this.onSelect(data, options);
1858
+ } else if (options && options.noFocus) {
1859
+ this.close();
1860
+ }
1861
+ },
1862
+
1863
+ // abstract
1864
+ getPlaceholder: function () {
1865
+ var placeholderOption;
1866
+ return this.opts.element.attr("placeholder") ||
1867
+ this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
1868
+ this.opts.element.data("placeholder") ||
1869
+ this.opts.placeholder ||
1870
+ ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
1871
+ },
1872
+
1873
+ // abstract
1874
+ getPlaceholderOption: function() {
1875
+ if (this.select) {
1876
+ var firstOption = this.select.children('option').first();
1877
+ if (this.opts.placeholderOption !== undefined ) {
1878
+ //Determine the placeholder option based on the specified placeholderOption setting
1879
+ return (this.opts.placeholderOption === "first" && firstOption) ||
1880
+ (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
1881
+ } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
1882
+ //No explicit placeholder option specified, use the first if it's blank
1883
+ return firstOption;
1884
+ }
1885
+ }
1886
+ },
1887
+
1888
+ /**
1889
+ * Get the desired width for the container element. This is
1890
+ * derived first from option `width` passed to select2, then
1891
+ * the inline 'style' on the original element, and finally
1892
+ * falls back to the jQuery calculated element width.
1893
+ */
1894
+ // abstract
1895
+ initContainerWidth: function () {
1896
+ function resolveContainerWidth() {
1897
+ var style, attrs, matches, i, l, attr;
1898
+
1899
+ if (this.opts.width === "off") {
1900
+ return null;
1901
+ } else if (this.opts.width === "element"){
1902
+ return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
1903
+ } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
1904
+ // check if there is inline style on the element that contains width
1905
+ style = this.opts.element.attr('style');
1906
+ if (style !== undefined) {
1907
+ attrs = style.split(';');
1908
+ for (i = 0, l = attrs.length; i < l; i = i + 1) {
1909
+ attr = attrs[i].replace(/\s/g, '');
1910
+ matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
1911
+ if (matches !== null && matches.length >= 1)
1912
+ return matches[1];
1913
+ }
1914
+ }
1915
+
1916
+ if (this.opts.width === "resolve") {
1917
+ // next check if css('width') can resolve a width that is percent based, this is sometimes possible
1918
+ // when attached to input type=hidden or elements hidden via css
1919
+ style = this.opts.element.css('width');
1920
+ if (style.indexOf("%") > 0) return style;
1921
+
1922
+ // finally, fallback on the calculated width of the element
1923
+ return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
1924
+ }
1925
+
1926
+ return null;
1927
+ } else if ($.isFunction(this.opts.width)) {
1928
+ return this.opts.width();
1929
+ } else {
1930
+ return this.opts.width;
1931
+ }
1932
+ };
1933
+
1934
+ var width = resolveContainerWidth.call(this);
1935
+ if (width !== null) {
1936
+ this.container.css("width", width);
1937
+ }
1938
+ }
1939
+ });
1940
+
1941
+ SingleSelect2 = clazz(AbstractSelect2, {
1942
+
1943
+ // single
1944
+
1945
+ createContainer: function () {
1946
+ var container = $(document.createElement("div")).attr({
1947
+ "class": "select2-container"
1948
+ }).html([
1949
+ "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
1950
+ " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
1951
+ " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
1952
+ "</a>",
1953
+ "<label for='' class='select2-offscreen'></label>",
1954
+ "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
1955
+ "<div class='select2-drop select2-display-none'>",
1956
+ " <div class='select2-search'>",
1957
+ " <label for='' class='select2-offscreen'></label>",
1958
+ " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
1959
+ " aria-autocomplete='list' />",
1960
+ " </div>",
1961
+ " <ul class='select2-results' role='listbox'>",
1962
+ " </ul>",
1963
+ "</div>"].join(""));
1964
+ return container;
1965
+ },
1966
+
1967
+ // single
1968
+ enableInterface: function() {
1969
+ if (this.parent.enableInterface.apply(this, arguments)) {
1970
+ this.focusser.prop("disabled", !this.isInterfaceEnabled());
1971
+ }
1972
+ },
1973
+
1974
+ // single
1975
+ opening: function () {
1976
+ var el, range, len;
1977
+
1978
+ if (this.opts.minimumResultsForSearch >= 0) {
1979
+ this.showSearch(true);
1980
+ }
1981
+
1982
+ this.parent.opening.apply(this, arguments);
1983
+
1984
+ if (this.showSearchInput !== false) {
1985
+ // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
1986
+ // all other browsers handle this just fine
1987
+
1988
+ this.search.val(this.focusser.val());
1989
+ }
1990
+ if (this.opts.shouldFocusInput(this)) {
1991
+ this.search.focus();
1992
+ // move the cursor to the end after focussing, otherwise it will be at the beginning and
1993
+ // new text will appear *before* focusser.val()
1994
+ el = this.search.get(0);
1995
+ if (el.createTextRange) {
1996
+ range = el.createTextRange();
1997
+ range.collapse(false);
1998
+ range.select();
1999
+ } else if (el.setSelectionRange) {
2000
+ len = this.search.val().length;
2001
+ el.setSelectionRange(len, len);
2002
+ }
2003
+ }
2004
+
2005
+ // initializes search's value with nextSearchTerm (if defined by user)
2006
+ // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2007
+ if(this.search.val() === "") {
2008
+ if(this.nextSearchTerm != undefined){
2009
+ this.search.val(this.nextSearchTerm);
2010
+ this.search.select();
2011
+ }
2012
+ }
2013
+
2014
+ this.focusser.prop("disabled", true).val("");
2015
+ this.updateResults(true);
2016
+ this.opts.element.trigger($.Event("select2-open"));
2017
+ },
2018
+
2019
+ // single
2020
+ close: function () {
2021
+ if (!this.opened()) return;
2022
+ this.parent.close.apply(this, arguments);
2023
+
2024
+ this.focusser.prop("disabled", false);
2025
+
2026
+ if (this.opts.shouldFocusInput(this)) {
2027
+ this.focusser.focus();
2028
+ }
2029
+ },
2030
+
2031
+ // single
2032
+ focus: function () {
2033
+ if (this.opened()) {
2034
+ this.close();
2035
+ } else {
2036
+ this.focusser.prop("disabled", false);
2037
+ if (this.opts.shouldFocusInput(this)) {
2038
+ this.focusser.focus();
2039
+ }
2040
+ }
2041
+ },
2042
+
2043
+ // single
2044
+ isFocused: function () {
2045
+ return this.container.hasClass("select2-container-active");
2046
+ },
2047
+
2048
+ // single
2049
+ cancel: function () {
2050
+ this.parent.cancel.apply(this, arguments);
2051
+ this.focusser.prop("disabled", false);
2052
+
2053
+ if (this.opts.shouldFocusInput(this)) {
2054
+ this.focusser.focus();
2055
+ }
2056
+ },
2057
+
2058
+ // single
2059
+ destroy: function() {
2060
+ $("label[for='" + this.focusser.attr('id') + "']")
2061
+ .attr('for', this.opts.element.attr("id"));
2062
+ this.parent.destroy.apply(this, arguments);
2063
+
2064
+ cleanupJQueryElements.call(this,
2065
+ "selection",
2066
+ "focusser"
2067
+ );
2068
+ },
2069
+
2070
+ // single
2071
+ initContainer: function () {
2072
+
2073
+ var selection,
2074
+ container = this.container,
2075
+ dropdown = this.dropdown,
2076
+ idSuffix = nextUid(),
2077
+ elementLabel;
2078
+
2079
+ if (this.opts.minimumResultsForSearch < 0) {
2080
+ this.showSearch(false);
2081
+ } else {
2082
+ this.showSearch(true);
2083
+ }
2084
+
2085
+ this.selection = selection = container.find(".select2-choice");
2086
+
2087
+ this.focusser = container.find(".select2-focusser");
2088
+
2089
+ // add aria associations
2090
+ selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2091
+ this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2092
+ this.results.attr("id", "select2-results-"+idSuffix);
2093
+ this.search.attr("aria-owns", "select2-results-"+idSuffix);
2094
+
2095
+ // rewrite labels from original element to focusser
2096
+ this.focusser.attr("id", "s2id_autogen"+idSuffix);
2097
+
2098
+ elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2099
+
2100
+ this.focusser.prev()
2101
+ .text(elementLabel.text())
2102
+ .attr('for', this.focusser.attr('id'));
2103
+
2104
+ // Ensure the original element retains an accessible name
2105
+ var originalTitle = this.opts.element.attr("title");
2106
+ this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2107
+
2108
+ this.focusser.attr("tabindex", this.elementTabIndex);
2109
+
2110
+ // write label for search field using the label from the focusser element
2111
+ this.search.attr("id", this.focusser.attr('id') + '_search');
2112
+
2113
+ this.search.prev()
2114
+ .text($("label[for='" + this.focusser.attr('id') + "']").text())
2115
+ .attr('for', this.search.attr('id'));
2116
+
2117
+ this.search.on("keydown", this.bind(function (e) {
2118
+ if (!this.isInterfaceEnabled()) return;
2119
+
2120
+ // filter 229 keyCodes (input method editor is processing key input)
2121
+ if (229 == e.keyCode) return;
2122
+
2123
+ if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2124
+ // prevent the page from scrolling
2125
+ killEvent(e);
2126
+ return;
2127
+ }
2128
+
2129
+ switch (e.which) {
2130
+ case KEY.UP:
2131
+ case KEY.DOWN:
2132
+ this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2133
+ killEvent(e);
2134
+ return;
2135
+ case KEY.ENTER:
2136
+ this.selectHighlighted();
2137
+ killEvent(e);
2138
+ return;
2139
+ case KEY.TAB:
2140
+ this.selectHighlighted({noFocus: true});
2141
+ return;
2142
+ case KEY.ESC:
2143
+ this.cancel(e);
2144
+ killEvent(e);
2145
+ return;
2146
+ }
2147
+ }));
2148
+
2149
+ this.search.on("blur", this.bind(function(e) {
2150
+ // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2151
+ // without this the search field loses focus which is annoying
2152
+ if (document.activeElement === this.body.get(0)) {
2153
+ window.setTimeout(this.bind(function() {
2154
+ if (this.opened()) {
2155
+ this.search.focus();
2156
+ }
2157
+ }), 0);
2158
+ }
2159
+ }));
2160
+
2161
+ this.focusser.on("keydown", this.bind(function (e) {
2162
+ if (!this.isInterfaceEnabled()) return;
2163
+
2164
+ if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2165
+ return;
2166
+ }
2167
+
2168
+ if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2169
+ killEvent(e);
2170
+ return;
2171
+ }
2172
+
2173
+ if (e.which == KEY.DOWN || e.which == KEY.UP
2174
+ || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2175
+
2176
+ if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2177
+
2178
+ this.open();
2179
+ killEvent(e);
2180
+ return;
2181
+ }
2182
+
2183
+ if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2184
+ if (this.opts.allowClear) {
2185
+ this.clear();
2186
+ }
2187
+ killEvent(e);
2188
+ return;
2189
+ }
2190
+ }));
2191
+
2192
+
2193
+ installKeyUpChangeEvent(this.focusser);
2194
+ this.focusser.on("keyup-change input", this.bind(function(e) {
2195
+ if (this.opts.minimumResultsForSearch >= 0) {
2196
+ e.stopPropagation();
2197
+ if (this.opened()) return;
2198
+ this.open();
2199
+ }
2200
+ }));
2201
+
2202
+ selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2203
+ if (!this.isInterfaceEnabled()) return;
2204
+ this.clear();
2205
+ killEventImmediately(e);
2206
+ this.close();
2207
+ this.selection.focus();
2208
+ }));
2209
+
2210
+ selection.on("mousedown touchstart", this.bind(function (e) {
2211
+ // Prevent IE from generating a click event on the body
2212
+ reinsertElement(selection);
2213
+
2214
+ if (!this.container.hasClass("select2-container-active")) {
2215
+ this.opts.element.trigger($.Event("select2-focus"));
2216
+ }
2217
+
2218
+ if (this.opened()) {
2219
+ this.close();
2220
+ } else if (this.isInterfaceEnabled()) {
2221
+ this.open();
2222
+ }
2223
+
2224
+ killEvent(e);
2225
+ }));
2226
+
2227
+ dropdown.on("mousedown touchstart", this.bind(function() {
2228
+ if (this.opts.shouldFocusInput(this)) {
2229
+ this.search.focus();
2230
+ }
2231
+ }));
2232
+
2233
+ selection.on("focus", this.bind(function(e) {
2234
+ killEvent(e);
2235
+ }));
2236
+
2237
+ this.focusser.on("focus", this.bind(function(){
2238
+ if (!this.container.hasClass("select2-container-active")) {
2239
+ this.opts.element.trigger($.Event("select2-focus"));
2240
+ }
2241
+ this.container.addClass("select2-container-active");
2242
+ })).on("blur", this.bind(function() {
2243
+ if (!this.opened()) {
2244
+ this.container.removeClass("select2-container-active");
2245
+ this.opts.element.trigger($.Event("select2-blur"));
2246
+ }
2247
+ }));
2248
+ this.search.on("focus", this.bind(function(){
2249
+ if (!this.container.hasClass("select2-container-active")) {
2250
+ this.opts.element.trigger($.Event("select2-focus"));
2251
+ }
2252
+ this.container.addClass("select2-container-active");
2253
+ }));
2254
+
2255
+ this.initContainerWidth();
2256
+ this.opts.element.addClass("select2-offscreen");
2257
+ this.setPlaceholder();
2258
+
2259
+ },
2260
+
2261
+ // single
2262
+ clear: function(triggerChange) {
2263
+ var data=this.selection.data("select2-data");
2264
+ if (data) { // guard against queued quick consecutive clicks
2265
+ var evt = $.Event("select2-clearing");
2266
+ this.opts.element.trigger(evt);
2267
+ if (evt.isDefaultPrevented()) {
2268
+ return;
2269
+ }
2270
+ var placeholderOption = this.getPlaceholderOption();
2271
+ this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2272
+ this.selection.find(".select2-chosen").empty();
2273
+ this.selection.removeData("select2-data");
2274
+ this.setPlaceholder();
2275
+
2276
+ if (triggerChange !== false){
2277
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2278
+ this.triggerChange({removed:data});
2279
+ }
2280
+ }
2281
+ },
2282
+
2283
+ /**
2284
+ * Sets selection based on source element's value
2285
+ */
2286
+ // single
2287
+ initSelection: function () {
2288
+ var selected;
2289
+ if (this.isPlaceholderOptionSelected()) {
2290
+ this.updateSelection(null);
2291
+ this.close();
2292
+ this.setPlaceholder();
2293
+ } else {
2294
+ var self = this;
2295
+ this.opts.initSelection.call(null, this.opts.element, function(selected){
2296
+ if (selected !== undefined && selected !== null) {
2297
+ self.updateSelection(selected);
2298
+ self.close();
2299
+ self.setPlaceholder();
2300
+ self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
2301
+ }
2302
+ });
2303
+ }
2304
+ },
2305
+
2306
+ isPlaceholderOptionSelected: function() {
2307
+ var placeholderOption;
2308
+ if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2309
+ return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2310
+ || (this.opts.element.val() === "")
2311
+ || (this.opts.element.val() === undefined)
2312
+ || (this.opts.element.val() === null);
2313
+ },
2314
+
2315
+ // single
2316
+ prepareOpts: function () {
2317
+ var opts = this.parent.prepareOpts.apply(this, arguments),
2318
+ self=this;
2319
+
2320
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
2321
+ // install the selection initializer
2322
+ opts.initSelection = function (element, callback) {
2323
+ var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2324
+ // a single select box always has a value, no need to null check 'selected'
2325
+ callback(self.optionToData(selected));
2326
+ };
2327
+ } else if ("data" in opts) {
2328
+ // install default initSelection when applied to hidden input and data is local
2329
+ opts.initSelection = opts.initSelection || function (element, callback) {
2330
+ var id = element.val();
2331
+ //search in data by id, storing the actual matching item
2332
+ var match = null;
2333
+ opts.query({
2334
+ matcher: function(term, text, el){
2335
+ var is_match = equal(id, opts.id(el));
2336
+ if (is_match) {
2337
+ match = el;
2338
+ }
2339
+ return is_match;
2340
+ },
2341
+ callback: !$.isFunction(callback) ? $.noop : function() {
2342
+ callback(match);
2343
+ }
2344
+ });
2345
+ };
2346
+ }
2347
+
2348
+ return opts;
2349
+ },
2350
+
2351
+ // single
2352
+ getPlaceholder: function() {
2353
+ // if a placeholder is specified on a single select without a valid placeholder option ignore it
2354
+ if (this.select) {
2355
+ if (this.getPlaceholderOption() === undefined) {
2356
+ return undefined;
2357
+ }
2358
+ }
2359
+
2360
+ return this.parent.getPlaceholder.apply(this, arguments);
2361
+ },
2362
+
2363
+ // single
2364
+ setPlaceholder: function () {
2365
+ var placeholder = this.getPlaceholder();
2366
+
2367
+ if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2368
+
2369
+ // check for a placeholder option if attached to a select
2370
+ if (this.select && this.getPlaceholderOption() === undefined) return;
2371
+
2372
+ this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2373
+
2374
+ this.selection.addClass("select2-default");
2375
+
2376
+ this.container.removeClass("select2-allowclear");
2377
+ }
2378
+ },
2379
+
2380
+ // single
2381
+ postprocessResults: function (data, initial, noHighlightUpdate) {
2382
+ var selected = 0, self = this, showSearchInput = true;
2383
+
2384
+ // find the selected element in the result list
2385
+
2386
+ this.findHighlightableChoices().each2(function (i, elm) {
2387
+ if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2388
+ selected = i;
2389
+ return false;
2390
+ }
2391
+ });
2392
+
2393
+ // and highlight it
2394
+ if (noHighlightUpdate !== false) {
2395
+ if (initial === true && selected >= 0) {
2396
+ this.highlight(selected);
2397
+ } else {
2398
+ this.highlight(0);
2399
+ }
2400
+ }
2401
+
2402
+ // hide the search box if this is the first we got the results and there are enough of them for search
2403
+
2404
+ if (initial === true) {
2405
+ var min = this.opts.minimumResultsForSearch;
2406
+ if (min >= 0) {
2407
+ this.showSearch(countResults(data.results) >= min);
2408
+ }
2409
+ }
2410
+ },
2411
+
2412
+ // single
2413
+ showSearch: function(showSearchInput) {
2414
+ if (this.showSearchInput === showSearchInput) return;
2415
+
2416
+ this.showSearchInput = showSearchInput;
2417
+
2418
+ this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2419
+ this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2420
+ //add "select2-with-searchbox" to the container if search box is shown
2421
+ $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2422
+ },
2423
+
2424
+ // single
2425
+ onSelect: function (data, options) {
2426
+
2427
+ if (!this.triggerSelect(data)) { return; }
2428
+
2429
+ var old = this.opts.element.val(),
2430
+ oldData = this.data();
2431
+
2432
+ this.opts.element.val(this.id(data));
2433
+ this.updateSelection(data);
2434
+
2435
+ this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2436
+
2437
+ this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2438
+ this.close();
2439
+
2440
+ if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2441
+ this.focusser.focus();
2442
+ }
2443
+
2444
+ if (!equal(old, this.id(data))) {
2445
+ this.triggerChange({ added: data, removed: oldData });
2446
+ }
2447
+ },
2448
+
2449
+ // single
2450
+ updateSelection: function (data) {
2451
+
2452
+ var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2453
+
2454
+ this.selection.data("select2-data", data);
2455
+
2456
+ container.empty();
2457
+ if (data !== null) {
2458
+ formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2459
+ }
2460
+ if (formatted !== undefined) {
2461
+ container.append(formatted);
2462
+ }
2463
+ cssClass=this.opts.formatSelectionCssClass(data, container);
2464
+ if (cssClass !== undefined) {
2465
+ container.addClass(cssClass);
2466
+ }
2467
+
2468
+ this.selection.removeClass("select2-default");
2469
+
2470
+ if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2471
+ this.container.addClass("select2-allowclear");
2472
+ }
2473
+ },
2474
+
2475
+ // single
2476
+ val: function () {
2477
+ var val,
2478
+ triggerChange = false,
2479
+ data = null,
2480
+ self = this,
2481
+ oldData = this.data();
2482
+
2483
+ if (arguments.length === 0) {
2484
+ return this.opts.element.val();
2485
+ }
2486
+
2487
+ val = arguments[0];
2488
+
2489
+ if (arguments.length > 1) {
2490
+ triggerChange = arguments[1];
2491
+ }
2492
+
2493
+ if (this.select) {
2494
+ this.select
2495
+ .val(val)
2496
+ .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2497
+ data = self.optionToData(elm);
2498
+ return false;
2499
+ });
2500
+ this.updateSelection(data);
2501
+ this.setPlaceholder();
2502
+ if (triggerChange) {
2503
+ this.triggerChange({added: data, removed:oldData});
2504
+ }
2505
+ } else {
2506
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2507
+ if (!val && val !== 0) {
2508
+ this.clear(triggerChange);
2509
+ return;
2510
+ }
2511
+ if (this.opts.initSelection === undefined) {
2512
+ throw new Error("cannot call val() if initSelection() is not defined");
2513
+ }
2514
+ this.opts.element.val(val);
2515
+ this.opts.initSelection(this.opts.element, function(data){
2516
+ self.opts.element.val(!data ? "" : self.id(data));
2517
+ self.updateSelection(data);
2518
+ self.setPlaceholder();
2519
+ if (triggerChange) {
2520
+ self.triggerChange({added: data, removed:oldData});
2521
+ }
2522
+ });
2523
+ }
2524
+ },
2525
+
2526
+ // single
2527
+ clearSearch: function () {
2528
+ this.search.val("");
2529
+ this.focusser.val("");
2530
+ },
2531
+
2532
+ // single
2533
+ data: function(value) {
2534
+ var data,
2535
+ triggerChange = false;
2536
+
2537
+ if (arguments.length === 0) {
2538
+ data = this.selection.data("select2-data");
2539
+ if (data == undefined) data = null;
2540
+ return data;
2541
+ } else {
2542
+ if (arguments.length > 1) {
2543
+ triggerChange = arguments[1];
2544
+ }
2545
+ if (!value) {
2546
+ this.clear(triggerChange);
2547
+ } else {
2548
+ data = this.data();
2549
+ this.opts.element.val(!value ? "" : this.id(value));
2550
+ this.updateSelection(value);
2551
+ if (triggerChange) {
2552
+ this.triggerChange({added: value, removed:data});
2553
+ }
2554
+ }
2555
+ }
2556
+ }
2557
+ });
2558
+
2559
+ MultiSelect2 = clazz(AbstractSelect2, {
2560
+
2561
+ // multi
2562
+ createContainer: function () {
2563
+ var container = $(document.createElement("div")).attr({
2564
+ "class": "select2-container select2-container-multi"
2565
+ }).html([
2566
+ "<ul class='select2-choices'>",
2567
+ " <li class='select2-search-field'>",
2568
+ " <label for='' class='select2-offscreen'></label>",
2569
+ " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2570
+ " </li>",
2571
+ "</ul>",
2572
+ "<div class='select2-drop select2-drop-multi select2-display-none'>",
2573
+ " <ul class='select2-results'>",
2574
+ " </ul>",
2575
+ "</div>"].join(""));
2576
+ return container;
2577
+ },
2578
+
2579
+ // multi
2580
+ prepareOpts: function () {
2581
+ var opts = this.parent.prepareOpts.apply(this, arguments),
2582
+ self=this;
2583
+
2584
+ // TODO validate placeholder is a string if specified
2585
+
2586
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
2587
+ // install the selection initializer
2588
+ opts.initSelection = function (element, callback) {
2589
+
2590
+ var data = [];
2591
+
2592
+ element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2593
+ data.push(self.optionToData(elm));
2594
+ });
2595
+ callback(data);
2596
+ };
2597
+ } else if ("data" in opts) {
2598
+ // install default initSelection when applied to hidden input and data is local
2599
+ opts.initSelection = opts.initSelection || function (element, callback) {
2600
+ var ids = splitVal(element.val(), opts.separator);
2601
+ //search in data by array of ids, storing matching items in a list
2602
+ var matches = [];
2603
+ opts.query({
2604
+ matcher: function(term, text, el){
2605
+ var is_match = $.grep(ids, function(id) {
2606
+ return equal(id, opts.id(el));
2607
+ }).length;
2608
+ if (is_match) {
2609
+ matches.push(el);
2610
+ }
2611
+ return is_match;
2612
+ },
2613
+ callback: !$.isFunction(callback) ? $.noop : function() {
2614
+ // reorder matches based on the order they appear in the ids array because right now
2615
+ // they are in the order in which they appear in data array
2616
+ var ordered = [];
2617
+ for (var i = 0; i < ids.length; i++) {
2618
+ var id = ids[i];
2619
+ for (var j = 0; j < matches.length; j++) {
2620
+ var match = matches[j];
2621
+ if (equal(id, opts.id(match))) {
2622
+ ordered.push(match);
2623
+ matches.splice(j, 1);
2624
+ break;
2625
+ }
2626
+ }
2627
+ }
2628
+ callback(ordered);
2629
+ }
2630
+ });
2631
+ };
2632
+ }
2633
+
2634
+ return opts;
2635
+ },
2636
+
2637
+ // multi
2638
+ selectChoice: function (choice) {
2639
+
2640
+ var selected = this.container.find(".select2-search-choice-focus");
2641
+ if (selected.length && choice && choice[0] == selected[0]) {
2642
+
2643
+ } else {
2644
+ if (selected.length) {
2645
+ this.opts.element.trigger("choice-deselected", selected);
2646
+ }
2647
+ selected.removeClass("select2-search-choice-focus");
2648
+ if (choice && choice.length) {
2649
+ this.close();
2650
+ choice.addClass("select2-search-choice-focus");
2651
+ this.opts.element.trigger("choice-selected", choice);
2652
+ }
2653
+ }
2654
+ },
2655
+
2656
+ // multi
2657
+ destroy: function() {
2658
+ $("label[for='" + this.search.attr('id') + "']")
2659
+ .attr('for', this.opts.element.attr("id"));
2660
+ this.parent.destroy.apply(this, arguments);
2661
+
2662
+ cleanupJQueryElements.call(this,
2663
+ "searchContainer",
2664
+ "selection"
2665
+ );
2666
+ },
2667
+
2668
+ // multi
2669
+ initContainer: function () {
2670
+
2671
+ var selector = ".select2-choices", selection;
2672
+
2673
+ this.searchContainer = this.container.find(".select2-search-field");
2674
+ this.selection = selection = this.container.find(selector);
2675
+
2676
+ var _this = this;
2677
+ this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
2678
+ //killEvent(e);
2679
+ _this.search[0].focus();
2680
+ _this.selectChoice($(this));
2681
+ });
2682
+
2683
+ // rewrite labels from original element to focusser
2684
+ this.search.attr("id", "s2id_autogen"+nextUid());
2685
+
2686
+ this.search.prev()
2687
+ .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2688
+ .attr('for', this.search.attr('id'));
2689
+
2690
+ this.search.on("input paste", this.bind(function() {
2691
+ if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2692
+ if (!this.isInterfaceEnabled()) return;
2693
+ if (!this.opened()) {
2694
+ this.open();
2695
+ }
2696
+ }));
2697
+
2698
+ this.search.attr("tabindex", this.elementTabIndex);
2699
+
2700
+ this.keydowns = 0;
2701
+ this.search.on("keydown", this.bind(function (e) {
2702
+ if (!this.isInterfaceEnabled()) return;
2703
+
2704
+ ++this.keydowns;
2705
+ var selected = selection.find(".select2-search-choice-focus");
2706
+ var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2707
+ var next = selected.next(".select2-search-choice:not(.select2-locked)");
2708
+ var pos = getCursorInfo(this.search);
2709
+
2710
+ if (selected.length &&
2711
+ (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2712
+ var selectedChoice = selected;
2713
+ if (e.which == KEY.LEFT && prev.length) {
2714
+ selectedChoice = prev;
2715
+ }
2716
+ else if (e.which == KEY.RIGHT) {
2717
+ selectedChoice = next.length ? next : null;
2718
+ }
2719
+ else if (e.which === KEY.BACKSPACE) {
2720
+ if (this.unselect(selected.first())) {
2721
+ this.search.width(10);
2722
+ selectedChoice = prev.length ? prev : next;
2723
+ }
2724
+ } else if (e.which == KEY.DELETE) {
2725
+ if (this.unselect(selected.first())) {
2726
+ this.search.width(10);
2727
+ selectedChoice = next.length ? next : null;
2728
+ }
2729
+ } else if (e.which == KEY.ENTER) {
2730
+ selectedChoice = null;
2731
+ }
2732
+
2733
+ this.selectChoice(selectedChoice);
2734
+ killEvent(e);
2735
+ if (!selectedChoice || !selectedChoice.length) {
2736
+ this.open();
2737
+ }
2738
+ return;
2739
+ } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2740
+ || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2741
+
2742
+ this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2743
+ killEvent(e);
2744
+ return;
2745
+ } else {
2746
+ this.selectChoice(null);
2747
+ }
2748
+
2749
+ if (this.opened()) {
2750
+ switch (e.which) {
2751
+ case KEY.UP:
2752
+ case KEY.DOWN:
2753
+ this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2754
+ killEvent(e);
2755
+ return;
2756
+ case KEY.ENTER:
2757
+ this.selectHighlighted();
2758
+ killEvent(e);
2759
+ return;
2760
+ case KEY.TAB:
2761
+ this.selectHighlighted({noFocus:true});
2762
+ this.close();
2763
+ return;
2764
+ case KEY.ESC:
2765
+ this.cancel(e);
2766
+ killEvent(e);
2767
+ return;
2768
+ }
2769
+ }
2770
+
2771
+ if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2772
+ || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2773
+ return;
2774
+ }
2775
+
2776
+ if (e.which === KEY.ENTER) {
2777
+ if (this.opts.openOnEnter === false) {
2778
+ return;
2779
+ } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2780
+ return;
2781
+ }
2782
+ }
2783
+
2784
+ this.open();
2785
+
2786
+ if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2787
+ // prevent the page from scrolling
2788
+ killEvent(e);
2789
+ }
2790
+
2791
+ if (e.which === KEY.ENTER) {
2792
+ // prevent form from being submitted
2793
+ killEvent(e);
2794
+ }
2795
+
2796
+ }));
2797
+
2798
+ this.search.on("keyup", this.bind(function (e) {
2799
+ this.keydowns = 0;
2800
+ this.resizeSearch();
2801
+ })
2802
+ );
2803
+
2804
+ this.search.on("blur", this.bind(function(e) {
2805
+ this.container.removeClass("select2-container-active");
2806
+ this.search.removeClass("select2-focused");
2807
+ this.selectChoice(null);
2808
+ if (!this.opened()) this.clearSearch();
2809
+ e.stopImmediatePropagation();
2810
+ this.opts.element.trigger($.Event("select2-blur"));
2811
+ }));
2812
+
2813
+ this.container.on("click", selector, this.bind(function (e) {
2814
+ if (!this.isInterfaceEnabled()) return;
2815
+ if ($(e.target).closest(".select2-search-choice").length > 0) {
2816
+ // clicked inside a select2 search choice, do not open
2817
+ return;
2818
+ }
2819
+ this.selectChoice(null);
2820
+ this.clearPlaceholder();
2821
+ if (!this.container.hasClass("select2-container-active")) {
2822
+ this.opts.element.trigger($.Event("select2-focus"));
2823
+ }
2824
+ this.open();
2825
+ this.focusSearch();
2826
+ e.preventDefault();
2827
+ }));
2828
+
2829
+ this.container.on("focus", selector, this.bind(function () {
2830
+ if (!this.isInterfaceEnabled()) return;
2831
+ if (!this.container.hasClass("select2-container-active")) {
2832
+ this.opts.element.trigger($.Event("select2-focus"));
2833
+ }
2834
+ this.container.addClass("select2-container-active");
2835
+ this.dropdown.addClass("select2-drop-active");
2836
+ this.clearPlaceholder();
2837
+ }));
2838
+
2839
+ this.initContainerWidth();
2840
+ this.opts.element.addClass("select2-offscreen");
2841
+
2842
+ // set the placeholder if necessary
2843
+ this.clearSearch();
2844
+ },
2845
+
2846
+ // multi
2847
+ enableInterface: function() {
2848
+ if (this.parent.enableInterface.apply(this, arguments)) {
2849
+ this.search.prop("disabled", !this.isInterfaceEnabled());
2850
+ }
2851
+ },
2852
+
2853
+ // multi
2854
+ initSelection: function () {
2855
+ var data;
2856
+ if (this.opts.element.val() === "" && this.opts.element.text() === "") {
2857
+ this.updateSelection([]);
2858
+ this.close();
2859
+ // set the placeholder if necessary
2860
+ this.clearSearch();
2861
+ }
2862
+ if (this.select || this.opts.element.val() !== "") {
2863
+ var self = this;
2864
+ this.opts.initSelection.call(null, this.opts.element, function(data){
2865
+ if (data !== undefined && data !== null) {
2866
+ self.updateSelection(data);
2867
+ self.close();
2868
+ // set the placeholder if necessary
2869
+ self.clearSearch();
2870
+ }
2871
+ });
2872
+ }
2873
+ },
2874
+
2875
+ // multi
2876
+ clearSearch: function () {
2877
+ var placeholder = this.getPlaceholder(),
2878
+ maxWidth = this.getMaxSearchWidth();
2879
+
2880
+ if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
2881
+ this.search.val(placeholder).addClass("select2-default");
2882
+ // stretch the search box to full width of the container so as much of the placeholder is visible as possible
2883
+ // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
2884
+ this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
2885
+ } else {
2886
+ this.search.val("").width(10);
2887
+ }
2888
+ },
2889
+
2890
+ // multi
2891
+ clearPlaceholder: function () {
2892
+ if (this.search.hasClass("select2-default")) {
2893
+ this.search.val("").removeClass("select2-default");
2894
+ }
2895
+ },
2896
+
2897
+ // multi
2898
+ opening: function () {
2899
+ this.clearPlaceholder(); // should be done before super so placeholder is not used to search
2900
+ this.resizeSearch();
2901
+
2902
+ this.parent.opening.apply(this, arguments);
2903
+
2904
+ this.focusSearch();
2905
+
2906
+ // initializes search's value with nextSearchTerm (if defined by user)
2907
+ // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2908
+ if(this.search.val() === "") {
2909
+ if(this.nextSearchTerm != undefined){
2910
+ this.search.val(this.nextSearchTerm);
2911
+ this.search.select();
2912
+ }
2913
+ }
2914
+
2915
+ this.updateResults(true);
2916
+ if (this.opts.shouldFocusInput(this)) {
2917
+ this.search.focus();
2918
+ }
2919
+ this.opts.element.trigger($.Event("select2-open"));
2920
+ },
2921
+
2922
+ // multi
2923
+ close: function () {
2924
+ if (!this.opened()) return;
2925
+ this.parent.close.apply(this, arguments);
2926
+ },
2927
+
2928
+ // multi
2929
+ focus: function () {
2930
+ this.close();
2931
+ this.search.focus();
2932
+ },
2933
+
2934
+ // multi
2935
+ isFocused: function () {
2936
+ return this.search.hasClass("select2-focused");
2937
+ },
2938
+
2939
+ // multi
2940
+ updateSelection: function (data) {
2941
+ var ids = [], filtered = [], self = this;
2942
+
2943
+ // filter out duplicates
2944
+ $(data).each(function () {
2945
+ if (indexOf(self.id(this), ids) < 0) {
2946
+ ids.push(self.id(this));
2947
+ filtered.push(this);
2948
+ }
2949
+ });
2950
+ data = filtered;
2951
+
2952
+ this.selection.find(".select2-search-choice").remove();
2953
+ $(data).each(function () {
2954
+ self.addSelectedChoice(this);
2955
+ });
2956
+ self.postprocessResults();
2957
+ },
2958
+
2959
+ // multi
2960
+ tokenize: function() {
2961
+ var input = this.search.val();
2962
+ input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
2963
+ if (input != null && input != undefined) {
2964
+ this.search.val(input);
2965
+ if (input.length > 0) {
2966
+ this.open();
2967
+ }
2968
+ }
2969
+
2970
+ },
2971
+
2972
+ // multi
2973
+ onSelect: function (data, options) {
2974
+
2975
+ if (!this.triggerSelect(data) || data.text === "") { return; }
2976
+
2977
+ this.addSelectedChoice(data);
2978
+
2979
+ this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
2980
+
2981
+ // keep track of the search's value before it gets cleared
2982
+ this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2983
+
2984
+ this.clearSearch();
2985
+ this.updateResults();
2986
+
2987
+ if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
2988
+
2989
+ if (this.opts.closeOnSelect) {
2990
+ this.close();
2991
+ this.search.width(10);
2992
+ } else {
2993
+ if (this.countSelectableResults()>0) {
2994
+ this.search.width(10);
2995
+ this.resizeSearch();
2996
+ if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
2997
+ // if we reached max selection size repaint the results so choices
2998
+ // are replaced with the max selection reached message
2999
+ this.updateResults(true);
3000
+ } else {
3001
+ // initializes search's value with nextSearchTerm and update search result
3002
+ if(this.nextSearchTerm != undefined){
3003
+ this.search.val(this.nextSearchTerm);
3004
+ this.updateResults();
3005
+ this.search.select();
3006
+ }
3007
+ }
3008
+ this.positionDropdown();
3009
+ } else {
3010
+ // if nothing left to select close
3011
+ this.close();
3012
+ this.search.width(10);
3013
+ }
3014
+ }
3015
+
3016
+ // since its not possible to select an element that has already been
3017
+ // added we do not need to check if this is a new element before firing change
3018
+ this.triggerChange({ added: data });
3019
+
3020
+ if (!options || !options.noFocus)
3021
+ this.focusSearch();
3022
+ },
3023
+
3024
+ // multi
3025
+ cancel: function () {
3026
+ this.close();
3027
+ this.focusSearch();
3028
+ },
3029
+
3030
+ addSelectedChoice: function (data) {
3031
+ var enableChoice = !data.locked,
3032
+ enabledItem = $(
3033
+ "<li class='select2-search-choice'>" +
3034
+ " <div></div>" +
3035
+ " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3036
+ "</li>"),
3037
+ disabledItem = $(
3038
+ "<li class='select2-search-choice select2-locked'>" +
3039
+ "<div></div>" +
3040
+ "</li>");
3041
+ var choice = enableChoice ? enabledItem : disabledItem,
3042
+ id = this.id(data),
3043
+ val = this.getVal(),
3044
+ formatted,
3045
+ cssClass;
3046
+
3047
+ formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3048
+ if (formatted != undefined) {
3049
+ choice.find("div").replaceWith("<div>"+formatted+"</div>");
3050
+ }
3051
+ cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3052
+ if (cssClass != undefined) {
3053
+ choice.addClass(cssClass);
3054
+ }
3055
+
3056
+ if(enableChoice){
3057
+ choice.find(".select2-search-choice-close")
3058
+ .on("mousedown", killEvent)
3059
+ .on("click dblclick", this.bind(function (e) {
3060
+ if (!this.isInterfaceEnabled()) return;
3061
+
3062
+ this.unselect($(e.target));
3063
+ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3064
+ killEvent(e);
3065
+ this.close();
3066
+ this.focusSearch();
3067
+ })).on("focus", this.bind(function () {
3068
+ if (!this.isInterfaceEnabled()) return;
3069
+ this.container.addClass("select2-container-active");
3070
+ this.dropdown.addClass("select2-drop-active");
3071
+ }));
3072
+ }
3073
+
3074
+ choice.data("select2-data", data);
3075
+ choice.insertBefore(this.searchContainer);
3076
+
3077
+ val.push(id);
3078
+ this.setVal(val);
3079
+ },
3080
+
3081
+ // multi
3082
+ unselect: function (selected) {
3083
+ var val = this.getVal(),
3084
+ data,
3085
+ index;
3086
+ selected = selected.closest(".select2-search-choice");
3087
+
3088
+ if (selected.length === 0) {
3089
+ throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3090
+ }
3091
+
3092
+ data = selected.data("select2-data");
3093
+
3094
+ if (!data) {
3095
+ // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3096
+ // and invoked on an element already removed
3097
+ return;
3098
+ }
3099
+
3100
+ var evt = $.Event("select2-removing");
3101
+ evt.val = this.id(data);
3102
+ evt.choice = data;
3103
+ this.opts.element.trigger(evt);
3104
+
3105
+ if (evt.isDefaultPrevented()) {
3106
+ return false;
3107
+ }
3108
+
3109
+ while((index = indexOf(this.id(data), val)) >= 0) {
3110
+ val.splice(index, 1);
3111
+ this.setVal(val);
3112
+ if (this.select) this.postprocessResults();
3113
+ }
3114
+
3115
+ selected.remove();
3116
+
3117
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3118
+ this.triggerChange({ removed: data });
3119
+
3120
+ return true;
3121
+ },
3122
+
3123
+ // multi
3124
+ postprocessResults: function (data, initial, noHighlightUpdate) {
3125
+ var val = this.getVal(),
3126
+ choices = this.results.find(".select2-result"),
3127
+ compound = this.results.find(".select2-result-with-children"),
3128
+ self = this;
3129
+
3130
+ choices.each2(function (i, choice) {
3131
+ var id = self.id(choice.data("select2-data"));
3132
+ if (indexOf(id, val) >= 0) {
3133
+ choice.addClass("select2-selected");
3134
+ // mark all children of the selected parent as selected
3135
+ choice.find(".select2-result-selectable").addClass("select2-selected");
3136
+ }
3137
+ });
3138
+
3139
+ compound.each2(function(i, choice) {
3140
+ // hide an optgroup if it doesn't have any selectable children
3141
+ if (!choice.is('.select2-result-selectable')
3142
+ && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3143
+ choice.addClass("select2-selected");
3144
+ }
3145
+ });
3146
+
3147
+ if (this.highlight() == -1 && noHighlightUpdate !== false){
3148
+ self.highlight(0);
3149
+ }
3150
+
3151
+ //If all results are chosen render formatNoMatches
3152
+ if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3153
+ if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3154
+ if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3155
+ this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3156
+ }
3157
+ }
3158
+ }
3159
+
3160
+ },
3161
+
3162
+ // multi
3163
+ getMaxSearchWidth: function() {
3164
+ return this.selection.width() - getSideBorderPadding(this.search);
3165
+ },
3166
+
3167
+ // multi
3168
+ resizeSearch: function () {
3169
+ var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3170
+ sideBorderPadding = getSideBorderPadding(this.search);
3171
+
3172
+ minimumWidth = measureTextWidth(this.search) + 10;
3173
+
3174
+ left = this.search.offset().left;
3175
+
3176
+ maxWidth = this.selection.width();
3177
+ containerLeft = this.selection.offset().left;
3178
+
3179
+ searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3180
+
3181
+ if (searchWidth < minimumWidth) {
3182
+ searchWidth = maxWidth - sideBorderPadding;
3183
+ }
3184
+
3185
+ if (searchWidth < 40) {
3186
+ searchWidth = maxWidth - sideBorderPadding;
3187
+ }
3188
+
3189
+ if (searchWidth <= 0) {
3190
+ searchWidth = minimumWidth;
3191
+ }
3192
+
3193
+ this.search.width(Math.floor(searchWidth));
3194
+ },
3195
+
3196
+ // multi
3197
+ getVal: function () {
3198
+ var val;
3199
+ if (this.select) {
3200
+ val = this.select.val();
3201
+ return val === null ? [] : val;
3202
+ } else {
3203
+ val = this.opts.element.val();
3204
+ return splitVal(val, this.opts.separator);
3205
+ }
3206
+ },
3207
+
3208
+ // multi
3209
+ setVal: function (val) {
3210
+ var unique;
3211
+ if (this.select) {
3212
+ this.select.val(val);
3213
+ } else {
3214
+ unique = [];
3215
+ // filter out duplicates
3216
+ $(val).each(function () {
3217
+ if (indexOf(this, unique) < 0) unique.push(this);
3218
+ });
3219
+ this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3220
+ }
3221
+ },
3222
+
3223
+ // multi
3224
+ buildChangeDetails: function (old, current) {
3225
+ var current = current.slice(0),
3226
+ old = old.slice(0);
3227
+
3228
+ // remove intersection from each array
3229
+ for (var i = 0; i < current.length; i++) {
3230
+ for (var j = 0; j < old.length; j++) {
3231
+ if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3232
+ current.splice(i, 1);
3233
+ if(i>0){
3234
+ i--;
3235
+ }
3236
+ old.splice(j, 1);
3237
+ j--;
3238
+ }
3239
+ }
3240
+ }
3241
+
3242
+ return {added: current, removed: old};
3243
+ },
3244
+
3245
+
3246
+ // multi
3247
+ val: function (val, triggerChange) {
3248
+ var oldData, self=this;
3249
+
3250
+ if (arguments.length === 0) {
3251
+ return this.getVal();
3252
+ }
3253
+
3254
+ oldData=this.data();
3255
+ if (!oldData.length) oldData=[];
3256
+
3257
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3258
+ if (!val && val !== 0) {
3259
+ this.opts.element.val("");
3260
+ this.updateSelection([]);
3261
+ this.clearSearch();
3262
+ if (triggerChange) {
3263
+ this.triggerChange({added: this.data(), removed: oldData});
3264
+ }
3265
+ return;
3266
+ }
3267
+
3268
+ // val is a list of ids
3269
+ this.setVal(val);
3270
+
3271
+ if (this.select) {
3272
+ this.opts.initSelection(this.select, this.bind(this.updateSelection));
3273
+ if (triggerChange) {
3274
+ this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3275
+ }
3276
+ } else {
3277
+ if (this.opts.initSelection === undefined) {
3278
+ throw new Error("val() cannot be called if initSelection() is not defined");
3279
+ }
3280
+
3281
+ this.opts.initSelection(this.opts.element, function(data){
3282
+ var ids=$.map(data, self.id);
3283
+ self.setVal(ids);
3284
+ self.updateSelection(data);
3285
+ self.clearSearch();
3286
+ if (triggerChange) {
3287
+ self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3288
+ }
3289
+ });
3290
+ }
3291
+ this.clearSearch();
3292
+ },
3293
+
3294
+ // multi
3295
+ onSortStart: function() {
3296
+ if (this.select) {
3297
+ throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3298
+ }
3299
+
3300
+ // collapse search field into 0 width so its container can be collapsed as well
3301
+ this.search.width(0);
3302
+ // hide the container
3303
+ this.searchContainer.hide();
3304
+ },
3305
+
3306
+ // multi
3307
+ onSortEnd:function() {
3308
+
3309
+ var val=[], self=this;
3310
+
3311
+ // show search and move it to the end of the list
3312
+ this.searchContainer.show();
3313
+ // make sure the search container is the last item in the list
3314
+ this.searchContainer.appendTo(this.searchContainer.parent());
3315
+ // since we collapsed the width in dragStarted, we resize it here
3316
+ this.resizeSearch();
3317
+
3318
+ // update selection
3319
+ this.selection.find(".select2-search-choice").each(function() {
3320
+ val.push(self.opts.id($(this).data("select2-data")));
3321
+ });
3322
+ this.setVal(val);
3323
+ this.triggerChange();
3324
+ },
3325
+
3326
+ // multi
3327
+ data: function(values, triggerChange) {
3328
+ var self=this, ids, old;
3329
+ if (arguments.length === 0) {
3330
+ return this.selection
3331
+ .children(".select2-search-choice")
3332
+ .map(function() { return $(this).data("select2-data"); })
3333
+ .get();
3334
+ } else {
3335
+ old = this.data();
3336
+ if (!values) { values = []; }
3337
+ ids = $.map(values, function(e) { return self.opts.id(e); });
3338
+ this.setVal(ids);
3339
+ this.updateSelection(values);
3340
+ this.clearSearch();
3341
+ if (triggerChange) {
3342
+ this.triggerChange(this.buildChangeDetails(old, this.data()));
3343
+ }
3344
+ }
3345
+ }
3346
+ });
3347
+
3348
+ $.fn.select2 = function () {
3349
+
3350
+ var args = Array.prototype.slice.call(arguments, 0),
3351
+ opts,
3352
+ select2,
3353
+ method, value, multiple,
3354
+ allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3355
+ valueMethods = ["opened", "isFocused", "container", "dropdown"],
3356
+ propertyMethods = ["val", "data"],
3357
+ methodsMap = { search: "externalSearch" };
3358
+
3359
+ this.each(function () {
3360
+ if (args.length === 0 || typeof(args[0]) === "object") {
3361
+ opts = args.length === 0 ? {} : $.extend({}, args[0]);
3362
+ opts.element = $(this);
3363
+
3364
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
3365
+ multiple = opts.element.prop("multiple");
3366
+ } else {
3367
+ multiple = opts.multiple || false;
3368
+ if ("tags" in opts) {opts.multiple = multiple = true;}
3369
+ }
3370
+
3371
+ select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3372
+ select2.init(opts);
3373
+ } else if (typeof(args[0]) === "string") {
3374
+
3375
+ if (indexOf(args[0], allowedMethods) < 0) {
3376
+ throw "Unknown method: " + args[0];
3377
+ }
3378
+
3379
+ value = undefined;
3380
+ select2 = $(this).data("select2");
3381
+ if (select2 === undefined) return;
3382
+
3383
+ method=args[0];
3384
+
3385
+ if (method === "container") {
3386
+ value = select2.container;
3387
+ } else if (method === "dropdown") {
3388
+ value = select2.dropdown;
3389
+ } else {
3390
+ if (methodsMap[method]) method = methodsMap[method];
3391
+
3392
+ value = select2[method].apply(select2, args.slice(1));
3393
+ }
3394
+ if (indexOf(args[0], valueMethods) >= 0
3395
+ || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3396
+ return false; // abort the iteration, ready to return first matched value
3397
+ }
3398
+ } else {
3399
+ throw "Invalid arguments to select2 plugin: " + args;
3400
+ }
3401
+ });
3402
+ return (value === undefined) ? this : value;
3403
+ };
3404
+
3405
+ // plugin defaults, accessible to users
3406
+ $.fn.select2.defaults = {
3407
+ width: "copy",
3408
+ loadMorePadding: 0,
3409
+ closeOnSelect: true,
3410
+ openOnEnter: true,
3411
+ containerCss: {},
3412
+ dropdownCss: {},
3413
+ containerCssClass: "",
3414
+ dropdownCssClass: "",
3415
+ formatResult: function(result, container, query, escapeMarkup) {
3416
+ var markup=[];
3417
+ markMatch(result.text, query.term, markup, escapeMarkup);
3418
+ return markup.join("");
3419
+ },
3420
+ formatSelection: function (data, container, escapeMarkup) {
3421
+ return data ? escapeMarkup(data.text) : undefined;
3422
+ },
3423
+ sortResults: function (results, container, query) {
3424
+ return results;
3425
+ },
3426
+ formatResultCssClass: function(data) {return data.css;},
3427
+ formatSelectionCssClass: function(data, container) {return undefined;},
3428
+ minimumResultsForSearch: 0,
3429
+ minimumInputLength: 0,
3430
+ maximumInputLength: null,
3431
+ maximumSelectionSize: 0,
3432
+ id: function (e) { return e == undefined ? null : e.id; },
3433
+ matcher: function(term, text) {
3434
+ return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3435
+ },
3436
+ separator: ",",
3437
+ tokenSeparators: [],
3438
+ tokenizer: defaultTokenizer,
3439
+ escapeMarkup: defaultEscapeMarkup,
3440
+ blurOnChange: false,
3441
+ selectOnBlur: false,
3442
+ adaptContainerCssClass: function(c) { return c; },
3443
+ adaptDropdownCssClass: function(c) { return null; },
3444
+ nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3445
+ searchInputPlaceholder: '',
3446
+ createSearchChoicePosition: 'top',
3447
+ shouldFocusInput: function (instance) {
3448
+ // Attempt to detect touch devices
3449
+ var supportsTouchEvents = (('ontouchstart' in window) ||
3450
+ (navigator.msMaxTouchPoints > 0));
3451
+
3452
+ // Only devices which support touch events should be special cased
3453
+ if (!supportsTouchEvents) {
3454
+ return true;
3455
+ }
3456
+
3457
+ // Never focus the input if search is disabled
3458
+ if (instance.opts.minimumResultsForSearch < 0) {
3459
+ return false;
3460
+ }
3461
+
3462
+ return true;
3463
+ }
3464
+ };
3465
+
3466
+ $.fn.select2.locales = [];
3467
+
3468
+ $.fn.select2.locales['en'] = {
3469
+ formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
3470
+ formatNoMatches: function () { return "No matches found"; },
3471
+ formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3472
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3473
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3474
+ formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3475
+ formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3476
+ formatSearching: function () { return "Searching…"; },
3477
+ };
3478
+
3479
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3480
+
3481
+ $.fn.select2.ajaxDefaults = {
3482
+ transport: $.ajax,
3483
+ params: {
3484
+ type: "GET",
3485
+ cache: false,
3486
+ dataType: "json"
3487
+ }
3488
+ };
3489
+
3490
+ // exports
3491
+ window.Select2 = {
3492
+ query: {
3493
+ ajax: ajax,
3494
+ local: local,
3495
+ tags: tags
3496
+ }, util: {
3497
+ debounce: debounce,
3498
+ markMatch: markMatch,
3499
+ escapeMarkup: defaultEscapeMarkup,
3500
+ stripDiacritics: stripDiacritics
3501
+ }, "class": {
3502
+ "abstract": AbstractSelect2,
3503
+ "single": SingleSelect2,
3504
+ "multi": MultiSelect2
3505
+ }
3506
+ };
3507
+
3508
+ }(jQuery));
drkfr/js/vendor/select2/select2.min.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Copyright 2014 Igor Vaynberg
3
+
4
+ Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
5
+
6
+ This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
+ General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
+ use of this software only upon the condition that you accept all of the terms of either the Apache
9
+ License or the GPL License.
10
+
11
+ You may obtain a copy of the Apache License and the GPL License at:
12
+
13
+ http://www.apache.org/licenses/LICENSE-2.0
14
+ http://www.gnu.org/licenses/gpl-2.0.html
15
+
16
+ Unless required by applicable law or agreed to in writing, software distributed under the Apache License
17
+ or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18
+ either express or implied. See the Apache License and the GPL License for the specific language governing
19
+ permissions and limitations under the Apache License and the GPL License.
20
+ */
21
+ !function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo("body");var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(b,c){var d,e,f;if(null===b||b.length<1)return[];for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=i;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!h){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);h=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),h.attr("class","select2-sizer"),a("body").append(h)}return h.text(b.val()),h.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push("<span class='select2-match'>"),c.push(d(a.substring(e,e+f))),c.push("</span>"),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,h,j,k,i={x:0,y:0},c={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case c.LEFT:case c.RIGHT:case c.UP:case c.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case c.SHIFT:case c.CTRL:case c.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="<div class='select2-measure-scrollbar'></div>",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};j=a(document),g=function(){var a=1;return function(){return a++}}(),d=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,f=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a("<span>",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+g()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a("body"),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(f),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",f,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",f,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",f,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",f,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",f,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",f,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.nextSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),k=k||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&a.each(function(){this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeClass("select2-offscreen").removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show()),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,f,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a <select> element.")}),c=a.extend({},{populateResults:function(d,e,f){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,f);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("<li></li>"),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+g()),t.attr("role","option"),v=c.formatResult(o,t,f,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("<ul></ul>"),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(f=c.id,c.id=function(a){return a[f]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element)),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var t,u,v,w,x,b=this.dropdown,c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),g=a(window),h=g.width(),i=g.height(),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,o=l>=m+f,p=c.top-f>=g.scrollTop(),q=b.outerWidth(!1),r=j>=n+q,s=b.hasClass("select2-drop-above");s?(u=!0,!p&&o&&(v=!0,u=!1)):(u=!1,!o&&p&&(v=!0,u=!0)),v&&(b.hide(),c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,q=b.outerWidth(!1),r=j>=n+q,b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(x=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),q=b.outerWidth(!1)+(x.scrollHeight===x.clientHeight?0:k.width),q>e?e=q:q=e,f=b.outerHeight(!1),r=j>=n+q):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(t=this.body.offset(),m-=t.top,n-=t.left),r||(n=c.left+this.container.outerWidth(!1)-q),w={left:n,width:e},u?(w.top=c.top-f,w.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(w.top=m,w.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),w=a.extend(w,K(this.opts.dropdownCss,this.opts.element)),b.css(w)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),j.on("mousemove.select2Event",function(a){i.x=a.pageX,i.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0==f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),j.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!0),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d<c.length;){d+=b;var e=a(c[d]);if(e.hasClass("select2-result-selectable")&&!e.hasClass("select2-disabled")&&!e.hasClass("select2-selected")){this.highlight(d);
22
+ break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).text(K(e.opts.formatLoadMore,e.opts.element,d+1)),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find(".select2-result-selectable").length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("<li class='select2-selection-limit'>"+K(f.formatSelectionTooBig,f.element,o)+"</li>"),void 0;if(d.val().length<f.minimumInputLength)return J(f.formatInputTooShort,"formatInputTooShort")?n("<li class='select2-no-results'>"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+"</li>"):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("<li class='select2-no-results'>"+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+"</li>"):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("<li class='select2-searching'>"+K(f.formatSearching,f.element)+"</li>"),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return n("<li class='select2-ajax-error'>"+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+"</li>"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("<li class='select2-no-results'>"+K(f.formatNoMatches,f.element,d.val())+"</li>"),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("<li class='select2-more-results'>"+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+"</li>"),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),e=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>"," <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>"," <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>","</a>","<label for='' class='select2-offscreen'></label>","<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />","<div class='select2-drop select2-display-none'>"," <div class='select2-search'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'"," aria-autocomplete='list' />"," </div>"," <ul class='select2-results' role='listbox'>"," </ul>","</div>"].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,h,d=this.container,e=this.dropdown,f=g();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+f),this.focusser.attr("aria-labelledby","select2-chosen-"+f),this.results.attr("id","select2-results-"+f),this.search.attr("aria-owns","select2-results-"+f),this.focusser.attr("id","s2id_autogen"+f),h=a("label[for='"+this.opts.element.attr("id")+"']"),this.focusser.prev().text(h.text()).attr("for",this.focusser.attr("id"));var i=this.opts.element.attr("title");this.opts.element.attr("title",i||h.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),e.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["<ul class='select2-choices'>"," <li class='select2-search-field'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>"," </li>","</ul>","<div class='select2-drop select2-drop-multi select2-display-none'>"," <ul class='select2-results'>"," </ul>","</div>"].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c<e.length;c++)for(var g=e[c],h=0;h<f.length;h++){var i=f[h];if(r(g,b.id(i))){a.push(i),f.splice(h,1);break}}d(a)}:a.noop})}),b},selectChoice:function(a){var b=this.container.find(".select2-search-choice-focus");b.length&&a&&a[0]==b[0]||(b.length&&this.opts.element.trigger("choice-deselected",b),b.removeClass("select2-search-choice-focus"),a&&a.length&&(this.close(),a.addClass("select2-search-choice-focus"),this.opts.element.trigger("choice-selected",a)))},destroy:function(){a("label[for='"+this.search.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"searchContainer","selection")},initContainer:function(){var d,b=".select2-choices";this.searchContainer=this.container.find(".select2-search-field"),this.selection=d=this.container.find(b);var e=this;this.selection.on("click",".select2-search-choice:not(.select2-locked)",function(){e.search[0].focus(),e.selectChoice(a(this))}),this.search.attr("id","s2id_autogen"+g()),this.search.prev().text(a("label[for='"+this.opts.element.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("input paste",this.bind(function(){this.search.attr("placeholder")&&0==this.search.val().length||this.isInterfaceEnabled()&&(this.opened()||this.open())})),this.search.attr("tabindex",this.elementTabIndex),this.keydowns=0,this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){++this.keydowns;var b=d.find(".select2-search-choice-focus"),e=b.prev(".select2-search-choice:not(.select2-locked)"),f=b.next(".select2-search-choice:not(.select2-locked)"),g=z(this.search);if(b.length&&(a.which==c.LEFT||a.which==c.RIGHT||a.which==c.BACKSPACE||a.which==c.DELETE||a.which==c.ENTER)){var h=b;return a.which==c.LEFT&&e.length?h=e:a.which==c.RIGHT?h=f.length?f:null:a.which===c.BACKSPACE?this.unselect(b.first())&&(this.search.width(10),h=e.length?e:f):a.which==c.DELETE?this.unselect(b.first())&&(this.search.width(10),h=f.length?f:null):a.which==c.ENTER&&(h=null),this.selectChoice(h),A(a),h&&h.length||this.open(),void 0}if((a.which===c.BACKSPACE&&1==this.keydowns||a.which==c.LEFT)&&0==g.offset&&!g.length)return this.selectChoice(d.find(".select2-search-choice:not(.select2-locked)").last()),A(a),void 0;if(this.selectChoice(null),this.opened())switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),this.close(),void 0;case c.ESC:return this.cancel(a),A(a),void 0}if(a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.BACKSPACE&&a.which!==c.ESC){if(a.which===c.ENTER){if(this.opts.openOnEnter===!1)return;if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return}this.open(),(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)&&A(a),a.which===c.ENTER&&A(a)}}})),this.search.on("keyup",this.bind(function(){this.keydowns=0,this.resizeSearch()})),this.search.on("blur",this.bind(function(b){this.container.removeClass("select2-container-active"),this.search.removeClass("select2-focused"),this.selectChoice(null),this.opened()||this.clearSearch(),b.stopImmediatePropagation(),this.opts.element.trigger(a.Event("select2-blur"))})),this.container.on("click",b,this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").length>0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("<li class='select2-search-choice'> <div></div> <a href='#' class='select2-search-choice-close' tabindex='-1'></a></li>"),f=a("<li class='select2-search-choice select2-locked'><div></div></li>"),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith("<div>"+j+"</div>"),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("<li class='select2-no-results'>"+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"</li>")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c<b.length;c++)for(var d=0;d<a.length;d++)r(this.opts.id(b[c]),this.opts.id(a[d]))&&(b.splice(c,1),c>0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."
23
+ },formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":d,single:e,multi:f}}}}(jQuery);
drkfr/js/vendor/select2/select2.png ADDED
Binary file
drkfr/js/vendor/select2/select2_locale_ar.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Arabic translation.
3
+ *
4
+ * Author: Adel KEDJOUR <adel@kedjour.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ar'] = {
10
+ formatNoMatches: function () { return "لم يتم العثور على مطابقات"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; },
13
+ formatSelectionTooBig: function (limit) { if (n == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return n == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + n + " إختيارات فقط"; },
14
+ formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
15
+ formatSearching: function () { return "البحث…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_az.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Azerbaijani translation.
3
+ *
4
+ * Author: Farhad Safarov <farhad.safarov@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['az'] = {
10
+ formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; },
11
+ formatNoMatches: function () { return "Nəticə tapılmadı"; },
12
+ formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; },
13
+ formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; },
14
+ formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; },
15
+ formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; },
16
+ formatSearching: function () { return "Axtarılır…"; }
17
+ };
18
+
19
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['az']);
20
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_bg.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Bulgarian translation.
3
+ *
4
+ * @author Lubomir Vikev <lubomirvikev@gmail.com>
5
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+
10
+ $.fn.select2.locales['bg'] = {
11
+ formatNoMatches: function () { return "Няма намерени съвпадения"; },
12
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); },
13
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); },
14
+ formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); },
15
+ formatLoadMore: function (pageNumber) { return "Зареждат се още…"; },
16
+ formatSearching: function () { return "Търсене…"; }
17
+ };
18
+
19
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']);
20
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ca.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Catalan translation.
3
+ *
4
+ * Author: David Planella <david.planella@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ca'] = {
10
+ formatNoMatches: function () { return "No s'ha trobat cap coincidència"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; },
13
+ formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); },
14
+ formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; },
15
+ formatSearching: function () { return "S'està cercant…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_cs.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Czech translation.
3
+ *
4
+ * Author: Michal Marek <ahoj@michal-marek.cz>
5
+ * Author - sklonovani: David Vallner <david@vallner.net>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+ // use text for the numbers 2 through 4
10
+ var smallNumbers = {
11
+ 2: function(masc) { return (masc ? "dva" : "dvě"); },
12
+ 3: function() { return "tři"; },
13
+ 4: function() { return "čtyři"; }
14
+ }
15
+ $.fn.select2.locales['cs'] = {
16
+ formatNoMatches: function () { return "Nenalezeny žádné položky"; },
17
+ formatInputTooShort: function (input, min) {
18
+ var n = min - input.length;
19
+ if (n == 1) {
20
+ return "Prosím zadejte ještě jeden znak";
21
+ } else if (n <= 4) {
22
+ return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
23
+ } else {
24
+ return "Prosím zadejte ještě dalších "+n+" znaků";
25
+ }
26
+ },
27
+ formatInputTooLong: function (input, max) {
28
+ var n = input.length - max;
29
+ if (n == 1) {
30
+ return "Prosím zadejte o jeden znak méně";
31
+ } else if (n <= 4) {
32
+ return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
33
+ } else {
34
+ return "Prosím zadejte o "+n+" znaků méně";
35
+ }
36
+ },
37
+ formatSelectionTooBig: function (limit) {
38
+ if (limit == 1) {
39
+ return "Můžete zvolit jen jednu položku";
40
+ } else if (limit <= 4) {
41
+ return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
42
+ } else {
43
+ return "Můžete zvolit maximálně "+limit+" položek";
44
+ }
45
+ },
46
+ formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; },
47
+ formatSearching: function () { return "Vyhledávání…"; }
48
+ };
49
+
50
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']);
51
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_da.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Danish translation.
3
+ *
4
+ * Author: Anders Jenbo <anders@jenbo.dk>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['da'] = {
10
+ formatNoMatches: function () { return "Ingen resultater fundet"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; },
13
+ formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); },
14
+ formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; },
15
+ formatSearching: function () { return "Søger…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['da']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_de.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 German translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['de'] = {
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
+ formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; }
15
+ };
16
+
17
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['de']);
18
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_el.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Greek translation.
3
+ *
4
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['el'] = {
10
+ formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
13
+ formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); },
14
+ formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; },
15
+ formatSearching: function () { return "Αναζήτηση…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['el']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_en.js.template ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 <Language> translation.
3
+ *
4
+ * Author: Your Name <your@email>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['en'] = {
10
+ formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
11
+ formatNoMatches: function () { return "No matches found"; },
12
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
13
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
14
+ formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
15
+ formatLoadMore: function (pageNumber) { return "Loading more results…"; },
16
+ formatSearching: function () { return "Searching…"; }
17
+ };
18
+
19
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
20
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_es.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Spanish translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['es'] = {
8
+ formatNoMatches: function () { return "No se encontraron resultados"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); },
10
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); },
11
+ formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
12
+ formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; },
13
+ formatSearching: function () { return "Buscando…"; }
14
+ };
15
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['es']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_et.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Estonian translation.
3
+ *
4
+ * Author: Kuldar Kalvik <kuldar@kalvik.ee>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['et'] = {
10
+ formatNoMatches: function () { return "Tulemused puuduvad"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; },
13
+ formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; },
14
+ formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; },
15
+ formatSearching: function () { return "Otsin.."; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['et']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_eu.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Basque translation.
3
+ *
4
+ * Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['eu'] = {
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
+
44
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']);
45
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_fa.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Persian translation.
3
+ *
4
+ * Author: Ali Choopan <choopan@arsh.co>
5
+ * Author: Ebrahim Byagowi <ebrahim@gnu.org>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+
10
+ $.fn.select2.locales['fa'] = {
11
+ formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; },
12
+ formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; },
13
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; },
14
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; },
15
+ formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; },
16
+ formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; },
17
+ formatSearching: function () { return "در حال جستجو…"; }
18
+ };
19
+
20
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']);
21
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_fi.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Finnish translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+ $.fn.select2.locales['fi'] = {
7
+ formatNoMatches: function () {
8
+ return "Ei tuloksia";
9
+ },
10
+ formatInputTooShort: function (input, min) {
11
+ var n = min - input.length;
12
+ return "Ole hyvä ja anna " + n + " merkkiä lisää";
13
+ },
14
+ formatInputTooLong: function (input, max) {
15
+ var n = input.length - max;
16
+ return "Ole hyvä ja anna " + n + " merkkiä vähemmän";
17
+ },
18
+ formatSelectionTooBig: function (limit) {
19
+ return "Voit valita ainoastaan " + limit + " kpl";
20
+ },
21
+ formatLoadMore: function (pageNumber) {
22
+ return "Ladataan lisää tuloksia…";
23
+ },
24
+ formatSearching: function () {
25
+ return "Etsitään…";
26
+ }
27
+ };
28
+
29
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']);
30
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_fr.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 French translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['fr'] = {
8
+ formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; },
9
+ formatNoMatches: function () { return "Aucun résultat trouvé"; },
10
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; },
11
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); },
12
+ formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); },
13
+ formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; },
14
+ formatSearching: function () { return "Recherche en cours…"; }
15
+ };
16
+
17
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']);
18
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_gl.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Galician translation
3
+ *
4
+ * Author: Leandro Regueiro <leandro.regueiro@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['gl'] = {
10
+ formatNoMatches: function () {
11
+ return "Non se atoparon resultados";
12
+ },
13
+ formatInputTooShort: function (input, min) {
14
+ var n = min - input.length;
15
+ if (n === 1) {
16
+ return "Engada un carácter";
17
+ } else {
18
+ return "Engada " + n + " caracteres";
19
+ }
20
+ },
21
+ formatInputTooLong: function (input, max) {
22
+ var n = input.length - max;
23
+ if (n === 1) {
24
+ return "Elimine un carácter";
25
+ } else {
26
+ return "Elimine " + n + " caracteres";
27
+ }
28
+ },
29
+ formatSelectionTooBig: function (limit) {
30
+ if (limit === 1 ) {
31
+ return "Só pode seleccionar un elemento";
32
+ } else {
33
+ return "Só pode seleccionar " + limit + " elementos";
34
+ }
35
+ },
36
+ formatLoadMore: function (pageNumber) {
37
+ return "Cargando máis resultados…";
38
+ },
39
+ formatSearching: function () {
40
+ return "Buscando…";
41
+ }
42
+ };
43
+
44
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']);
45
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_he.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Hebrew translation.
3
+ *
4
+ * Author: Yakir Sitbon <http://www.yakirs.net/>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['he'] = {
10
+ formatNoMatches: function () { return "לא נמצאו התאמות"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; },
13
+ formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; },
14
+ formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; },
15
+ formatSearching: function () { return "מחפש…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['he']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_hr.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Croatian translation.
3
+ *
4
+ * @author Edi Modrić <edi.modric@gmail.com>
5
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+
10
+ $.fn.select2.locales['hr'] = {
11
+ formatNoMatches: function () { return "Nema rezultata"; },
12
+ formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); },
13
+ formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; },
14
+ formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; },
15
+ formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; },
16
+ formatSearching: function () { return "Pretraga…"; }
17
+ };
18
+
19
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']);
20
+
21
+ function character (n) {
22
+ return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova");
23
+ }
24
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_hu.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Hungarian translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['hu'] = {
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 + " karakterrel 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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_id.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Indonesian translation.
3
+ *
4
+ * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['id'] = {
10
+ formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); },
13
+ formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); },
14
+ formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
15
+ formatSearching: function () { return "Mencari…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['id']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_is.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Icelandic translation.
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['is'] = {
8
+ formatNoMatches: function () { return "Ekkert fannst"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; },
10
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); },
11
+ formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; },
12
+ formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; },
13
+ formatSearching: function () { return "Leita…"; }
14
+ };
15
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['is']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_it.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Italian translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['it'] = {
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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['it']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ja.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Japanese translation.
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['ja'] = {
8
+ formatNoMatches: function () { return "該当なし"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; },
10
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; },
11
+ formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; },
12
+ formatLoadMore: function (pageNumber) { return "読込中・・・"; },
13
+ formatSearching: function () { return "検索中・・・"; }
14
+ };
15
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ka.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Georgian (Kartuli) translation.
3
+ *
4
+ * Author: Dimitri Kurashvili dimakura@gmail.com
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ka'] = {
10
+ formatNoMatches: function () { return "ვერ მოიძებნა"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; },
13
+ formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; },
14
+ formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; },
15
+ formatSearching: function () { return "ძებნა…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ko.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Korean translation.
3
+ *
4
+ * @author Swen Mun <longfinfunnel@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ko'] = {
10
+ formatNoMatches: function () { return "결과 없음"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; },
13
+ formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; },
14
+ formatLoadMore: function (pageNumber) { return "불러오는 중…"; },
15
+ formatSearching: function () { return "검색 중…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_lt.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Lithuanian translation.
3
+ *
4
+ * @author CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
5
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+
10
+ $.fn.select2.locales['lt'] = {
11
+ formatNoMatches: function () { return "Atitikmenų nerasta"; },
12
+ formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); },
13
+ formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); },
14
+ formatSelectionTooBig: function (limit) {
15
+ return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą");
16
+ },
17
+ formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; },
18
+ formatSearching: function () { return "Ieškoma…"; }
19
+ };
20
+
21
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']);
22
+
23
+ function character (n) {
24
+ return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į");
25
+ }
26
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_lv.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Latvian translation.
3
+ *
4
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['lv'] = {
10
+ formatNoMatches: function () { return "Sakritību nav"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; },
13
+ formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); },
14
+ formatLoadMore: function (pageNumber) { return "Datu ielāde…"; },
15
+ formatSearching: function () { return "Meklēšana…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_mk.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Macedonian translation.
3
+ *
4
+ * Author: Marko Aleksic <psybaron@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['mk'] = {
10
+ formatNoMatches: function () { return "Нема пронајдено совпаѓања"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); },
13
+ formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); },
14
+ formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; },
15
+ formatSearching: function () { return "Пребарување…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ms.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Malay translation.
3
+ *
4
+ * Author: Kepoweran <kepoweran@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ms'] = {
10
+ formatNoMatches: function () { return "Tiada padanan yang ditemui"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; },
13
+ formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; },
14
+ formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; },
15
+ formatSearching: function () { return "Mencari…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_nl.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Dutch translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['nl'] = {
8
+ formatNoMatches: function () { return "Geen resultaten gevonden"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; },
10
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; },
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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_no.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Norwegian translation.
3
+ *
4
+ * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['no'] = {
10
+ formatNoMatches: function () { return "Ingen treff"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
13
+ formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
14
+ formatLoadMore: function (pageNumber) { return "Laster flere resultater…"; },
15
+ formatSearching: function () { return "Søker…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['no']);
19
+ })(jQuery);
20
+
drkfr/js/vendor/select2/select2_locale_pl.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Polish translation.
3
+ *
4
+ * @author Jan Kondratowicz <jan@kondratowicz.pl>
5
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
6
+ * @author Michał Połtyn <mike@poltyn.com>
7
+ */
8
+ (function ($) {
9
+ "use strict";
10
+
11
+ $.fn.select2.locales['pl'] = {
12
+ formatNoMatches: function () { return "Brak wyników"; },
13
+ formatInputTooShort: function (input, min) { return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); },
14
+ formatInputTooLong: function (input, max) { return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); },
15
+ formatSelectionTooBig: function (limit) { return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); },
16
+ formatLoadMore: function (pageNumber) { return "Ładowanie wyników…"; },
17
+ formatSearching: function () { return "Szukanie…"; }
18
+ };
19
+
20
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']);
21
+
22
+ function character (n, word, pluralSuffix) {
23
+ return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów");
24
+ }
25
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_pt-BR.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Brazilian Portuguese translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['pt-BR'] = {
8
+ formatNoMatches: function () { return "Nenhum resultado encontrado"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite mais " + 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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_pt-PT.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Portuguese (Portugal) translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['pt-PT'] = {
8
+ formatNoMatches: function () { return "Nenhum resultado encontrado"; },
9
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
10
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ro.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Romanian translation.
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+
7
+ $.fn.select2.locales['ro'] = {
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
+
16
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']);
17
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_rs.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Serbian translation.
3
+ *
4
+ * @author Limon Monte <limon.monte@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['rs'] = {
10
+ formatNoMatches: function () { return "Ništa nije pronađeno"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
13
+ formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); },
14
+ formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; },
15
+ formatSearching: function () { return "Pretraga…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ru.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Russian translation.
3
+ *
4
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['ru'] = {
10
+ formatNoMatches: function () { return "Совпадений не найдено"; },
11
+ formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); },
12
+ formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; },
13
+ formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); },
14
+ formatLoadMore: function (pageNumber) { return "Загрузка данных…"; },
15
+ formatSearching: function () { return "Поиск…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']);
19
+
20
+ function character (n) {
21
+ return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов");
22
+ }
23
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_sk.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Slovak translation.
3
+ *
4
+ * Author: David Vallner <david@vallner.net>
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
+ $.fn.select2.locales['sk'] = {
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
+
49
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']);
50
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_sv.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Swedish translation.
3
+ *
4
+ * Author: Jens Rantil <jens.rantil@telavox.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['sv'] = {
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
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_th.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Thai translation.
3
+ *
4
+ * Author: Atsawin Chaowanakritsanakul <joke@nakhon.net>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['th'] = {
10
+ formatNoMatches: function () { return "ไม่พบข้อมูล"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; },
13
+ formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; },
14
+ formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; },
15
+ formatSearching: function () { return "กำลังค้นข้อมูล…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['th']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_tr.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Turkish translation.
3
+ *
4
+ * Author: Salim KAYABAŞI <salim.kayabasi@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['tr'] = {
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
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']);
19
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_ug-CN.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Uyghur translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+ $.fn.select2.locales['ug-CN'] = {
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
+
15
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']);
16
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_uk.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Ukrainian translation.
3
+ *
4
+ * @author bigmihail <bigmihail@bigmir.net>
5
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
6
+ */
7
+ (function ($) {
8
+ "use strict";
9
+
10
+ $.fn.select2.locales['uk'] = {
11
+ formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; },
12
+ formatNoMatches: function () { return "Нічого не знайдено"; },
13
+ formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); },
14
+ formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; },
15
+ formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); },
16
+ formatLoadMore: function (pageNumber) { return "Завантаження даних…"; },
17
+ formatSearching: function () { return "Пошук…"; }
18
+ };
19
+
20
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']);
21
+
22
+ function character (n, word) {
23
+ return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів");
24
+ }
25
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_vi.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Vietnamese translation.
3
+ *
4
+ * Author: Long Nguyen <olragon@gmail.com>
5
+ */
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ $.fn.select2.locales['vi'] = {
10
+ formatNoMatches: function () { return "Không tìm thấy kết quả"; },
11
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự" + (n == 1 ? "" : "s"); },
12
+ formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); },
13
+ formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); },
14
+ formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; },
15
+ formatSearching: function () { return "Đang tìm…"; }
16
+ };
17
+
18
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']);
19
+ })(jQuery);
20
+
drkfr/js/vendor/select2/select2_locale_zh-CN.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Chinese translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+ $.fn.select2.locales['zh-CN'] = {
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
+
15
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']);
16
+ })(jQuery);
drkfr/js/vendor/select2/select2_locale_zh-TW.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Select2 Traditional Chinese translation
3
+ */
4
+ (function ($) {
5
+ "use strict";
6
+ $.fn.select2.locales['zh-TW'] = {
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
+
15
+ $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']);
16
+ })(jQuery);
drkfr/js/vendor/select2/select2x2.png ADDED
Binary file
drkfr/phpunit.xml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <phpunit
2
+ bootstrap="tests/bootstrap.php"
3
+ backupGlobals="false"
4
+ colors="true"
5
+ convertErrorsToExceptions="true"
6
+ convertNoticesToExceptions="true"
7
+ convertWarningsToExceptions="true"
8
+ >
9
+ <testsuites>
10
+ <testsuite>
11
+ <directory prefix="test" suffix=".php">./tests/</directory>
12
+ </testsuite>
13
+ </testsuites>
14
+ </phpunit>
img/links/customlink.png ADDED
Binary file
img/links/facebook.png ADDED
Binary file
img/links/googleplus.png ADDED
Binary file
img/links/linkedin.png ADDED
Binary file
img/links/twitter.png ADDED
Binary file
readme.txt ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Team Members ===
2
+ Tags: team, my team, our team, grid, shortcode, responsive, members, staff, people, showcase, employees, simple, founders
3
+ Requires at least: 3.6
4
+ Tested up to: 4.0
5
+ Stable tag: trunk
6
+ License: GPL2
7
+ License URI: http://www.gnu.org/licenses/gpl.html
8
+
9
+ A responsive and clean way to display your team. Create members, add their positions, bios (and more...) and copy-paste the shortcode anywhere.
10
+
11
+ == Description ==
12
+ [View demo & instructions](http://wpdarko.com/team-members/)
13
+
14
+ This plugin adds a “Teams” section to the admin panel which allows you to showcase your staff/employees/people on your website the easy way. You can quickly add members to your team(s), add their picture, position, bios, social links, re-order them at anytime and display them anywhere with a simple shortcode. What you see is what you get, and it’s totally free.
15
+
16
+ = Rate and review =
17
+ We love to hear from our users, please take the time to rate this plugin and tell us what you think about it!
18
+
19
+ = Free vs PRO version? =
20
+ The free version of the Team Members plugin is **not limited** and does not contain any ad.
21
+
22
+ The [PRO version](http://wpdarko.com/items/team-members-pro/) gives you access to a lot of new features: Pictures’ shape, enabling/disabling picture borders, picture position. It also allows you to add filters to your pictures, set a color for each member instead of one general color for everybody (good for distinguishing your staff). One more link can be added to each member.
23
+
24
+ = Author =
25
+ [WP Darko](http://wpdarko.com/) is one more great place to find exclusive WordPress themes & plugins.
26
+
27
+ = Available fields/options =
28
+ * Firstname
29
+ * Lastname
30
+ * Description/bio
31
+ * Picture
32
+ * Social links (FB, Twitter…)
33
+ * Color
34
+
35
+ = Usage =
36
+ Go to [the plugin's page](http://wpdarko.com/team-members/) if you need more information on how to use this plugin.
37
+
38
+ = Support =
39
+ Find help in [our forums](http://wpdarko.com/forum/plugins/team-members/) for this plugin (we’ll answer you fast, promise).
40
+
41
+ == Installation ==
42
+
43
+ = Installation =
44
+ 1. In your WordPress admin panel, go to Plugins > New Plugin
45
+ 2. Find our Team Members plugin by WP Darko and click Install now
46
+ 3. Alternatively, download the plugin and upload the contents of team-members.zip to your plugins directory, which usually is /wp-content/plugins/
47
+ 4. Activate the plugin
48
+
49
+ = Usage =
50
+ Go to [the plugin's page](http://wpdarko.com/team-members/) for information on how to use it.
51
+
52
+ == Frequently Asked Questions ==
53
+
54
+ = Example & Support =
55
+ Go to [the plugin's page](http://wpdarko.com/team-members/) for information on how to use this plugin.
56
+
57
+ = Where can I get help with this plugin? =
58
+ Find help in [our forums](http://wpdarko.com/forum/plugins/team-members/) for this plugin (we’ll answer you fast, promise).
59
+
60
+ = Free vs PRO version? =
61
+ The free version of the Team Members plugin is **not limited** and does not contain any ad.
62
+
63
+ The [PRO version](http://wpdarko.com/items/team-members-pro/) gives you access to a lot of new features: Pictures’ shape, enabling/disabling picture borders, picture position. It also allows you to add filters to your pictures, set a color for each member instead of one general color for everybody (good for distinguishing your staff). One more link can be added to each member.
64
+
65
+ == Screenshots ==
66
+ 1. Team Members (front view - 3 per line)
67
+ 2. Team Members (front view - 4 per line)
68
+ 3. Creating members (admin view)
69
+
70
+ == Changelog ==
71
+ = 1.0.1 =
72
+ * SAFE UPDATE: No data loss for those upgrading from version 1.0 or higher
73
+ * Preparing for PRO version
74
+
75
+ = 1.0 =
76
+ * Responsive Team Members custom type/shortcode
tmm.php ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Name: Team Members
4
+ * Plugin URI: http://wpdarko.com/team-members/
5
+ * Description: A responsive, simple and clean way to display your team. Create new members, add their positions, bios, social links and copy-paste the shortcode into any post/page. Find support and information on the <a href="http://wpdarko.com/team-members/">plugin's page</a>. This free version is NOT limited and does not contain any ad. Check out the <a href='http://wpdarko.com/team-members-pro/'>PRO version</a> for more great features.
6
+ * Version: 1.0.1
7
+ * Author: WP Darko
8
+ * Author URI: http://wpdarko.com
9
+ * License: GPL2
10
+ */
11
+
12
+ function tmm_free_pro_check() {
13
+ if (is_plugin_active('team-members-pro/tmm_pro.php')) {
14
+
15
+ function my_admin_notice(){
16
+ echo '<div class="updated">
17
+ <p><strong>PRO</strong> version is activated.</p>
18
+ </div>';
19
+ }
20
+ add_action('admin_notices', 'my_admin_notice');
21
+
22
+ deactivate_plugins(__FILE__);
23
+ }
24
+ }
25
+
26
+ add_action( 'admin_init', 'tmm_free_pro_check' );
27
+
28
+ /* adds stylesheet and script */
29
+ add_action( 'wp_enqueue_scripts', 'add_tmm_scripts' );
30
+ function add_tmm_scripts() {
31
+ wp_enqueue_style( 'tmm', plugins_url('css/tmm_custom_style.min.css', __FILE__));
32
+ }
33
+
34
+ add_action( 'init', 'create_tmm_type' );
35
+
36
+ function create_tmm_type() {
37
+ register_post_type( 'tmm',
38
+ array(
39
+ 'labels' => array(
40
+ 'name' => 'Teams',
41
+ 'singular_name' => 'Team'
42
+ ),
43
+ 'public' => true,
44
+ 'has_archive' => false,
45
+ 'hierarchical' => false,
46
+ 'capabilities' => array(
47
+ 'edit_post' => 'update_core',
48
+ 'read_post' => 'update_core',
49
+ 'delete_post' => 'update_core',
50
+ 'edit_posts' => 'update_core',
51
+ 'edit_others_posts' => 'update_core',
52
+ 'publish_posts' => 'update_core',
53
+ 'read_private_posts' => 'update_core'
54
+ ),
55
+ 'supports' => array( 'title' ),
56
+ 'menu_icon' => 'dashicons-plus',
57
+ )
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Define the metabox and field configurations.
63
+ *
64
+ * @param array $meta_boxes
65
+ * @return array
66
+ */
67
+ function tmm_metaboxes( array $meta_boxes ) {
68
+ $fields = array(
69
+ array( 'id' => 'tmm_content_head', 'name' => 'Staff details', 'type' => 'title' ),
70
+ array( 'id' => 'tmm_firstname', 'name' => 'Firstname', 'type' => 'text', 'cols' => 4 ),
71
+ array( 'id' => 'tmm_lastname', 'name' => 'Lastname', 'type' => 'text', 'cols' => 4),
72
+ array( 'id' => 'tmm_job', 'name' => 'Job/role', 'type' => 'text', 'cols' => 4),
73
+ array( 'id' => 'tmm_photo', 'name' => 'Photo', 'type' => 'image', 'cols' => 3),
74
+ array( 'id' => 'tmm_desc', 'name' => 'Description/bio', 'type' => 'textarea', 'rows' => 8, 'cols' => 9),
75
+ array( 'id' => 'tmm_links_head', 'name' => 'Links', 'type' => 'title' ),
76
+ array(
77
+ 'id' => 'tmm_sc_type1',
78
+ 'type' => 'select',
79
+ 'desc' => 'Icon',
80
+ 'cols' => 3,
81
+ 'options' => array(
82
+ 'nada' => '-',
83
+ 'twitter' => 'Twitter',
84
+ 'linkedin' => 'LinkedIn',
85
+ 'googleplus' => 'Google+',
86
+ 'facebook' => 'Facebook',
87
+ 'customlink' => 'Other links',
88
+ )
89
+ ),
90
+ array( 'id' => 'tmm_sc_title1', 'desc' => 'Title', 'type' => 'text', 'cols' => 4),
91
+ array( 'id' => 'tmm_sc_url1', 'default' => 'http://', 'desc' => 'URL', 'type' => 'text', 'cols' => 5),
92
+ array(
93
+ 'id' => 'tmm_sc_type2',
94
+ 'type' => 'select',
95
+ 'cols' => 3,
96
+ 'options' => array(
97
+ 'nada' => '-',
98
+ 'twitter' => 'Twitter',
99
+ 'linkedin' => 'LinkedIn',
100
+ 'googleplus' => 'Google+',
101
+ 'facebook' => 'Facebook',
102
+ 'customlink' => 'Other links',
103
+ )
104
+ ),
105
+ array( 'id' => 'tmm_sc_title2', 'type' => 'text', 'cols' => 4),
106
+ array( 'id' => 'tmm_sc_url2', 'default' => 'http://', 'type' => 'text', 'cols' => 5),
107
+ array(
108
+ 'id' => 'tmm_sc_type3',
109
+ 'type' => 'select',
110
+ 'cols' => 3,
111
+ 'options' => array(
112
+ 'nada' => '-',
113
+ 'twitter' => 'Twitter',
114
+ 'linkedin' => 'LinkedIn',
115
+ 'googleplus' => 'Google+',
116
+ 'facebook' => 'Facebook',
117
+ 'customlink' => 'Other links',
118
+ )
119
+ ),
120
+ array( 'id' => 'tmm_sc_title3', 'type' => 'text', 'cols' => 4),
121
+ array( 'id' => 'tmm_sc_url3', 'default' => 'http://', 'type' => 'text', 'cols' => 5),
122
+ );
123
+
124
+ $group_settings = array(
125
+ array( 'id' => 'tmm_columns', 'name' => 'Number of columns', 'type' => 'text', 'desc' => 'Number of members to show per line.' ),
126
+ array( 'id' => 'tmm_color', 'name' => 'Main color', 'type' => 'colorpicker', 'default' => '#57c9e0' ),
127
+ array(
128
+ 'id' => 'tmm_columns',
129
+ 'type' => 'select',
130
+ 'desc' => 'Number of members to show per line.',
131
+ 'options' => array(
132
+ '3' => '3',
133
+ '4' => '4',
134
+ )
135
+ ),
136
+ );
137
+ // Example of repeatable group. Using all fields.
138
+ // For this example, copy fields from $fields, update I
139
+ $group_fields = $fields;
140
+ foreach ( $group_fields as &$field ) {
141
+ $field['id'] = str_replace( 'field', 'gfield', $field['id'] );
142
+ }
143
+ $meta_boxes[] = array(
144
+ 'title' => 'Create/remove/sort team members',
145
+ 'pages' => 'tmm',
146
+ 'fields' => array(
147
+ array(
148
+ 'id' => 'tmm_head',
149
+ 'type' => 'group',
150
+ 'repeatable' => true,
151
+ 'sortable' => true,
152
+ 'fields' => $group_fields,
153
+ 'desc' => 'Create new members here and drag and drop to reorder.',
154
+ )
155
+ )
156
+ );
157
+ $meta_boxes[] = array(
158
+ 'title' => 'Settings',
159
+ 'pages' => 'tmm',
160
+ 'context' => 'side',
161
+ 'priority' => 'high',
162
+ 'fields' => array(
163
+ array(
164
+ 'id' => 'tmm_settings_head',
165
+ 'type' => 'group',
166
+ 'fields' => $group_settings,
167
+ )
168
+ )
169
+ );
170
+
171
+
172
+ function tmm_pro_side_meta() {
173
+ return "<p style='font-size:14px; color:#333; font-style:normal;'>This free version is <strong>NOT</strong> limited and does <strong>not</strong> contain any ad. Check out the <a href='http://wpdarko.com/items/team-members-pro/'><span style='color:#61d1aa !important;'>PRO version</span></a> for more great features.</p>";
174
+ }
175
+
176
+ $meta_boxes[] = array(
177
+ 'title' => 'Meet The Team PRO',
178
+ 'pages' => 'tmm',
179
+ 'context' => 'side',
180
+ 'priority' => 'low',
181
+ 'fields' => array(
182
+ array(
183
+ 'id' => 'tmm_pro_head',
184
+ 'type' => 'group',
185
+ 'desc' => tmm_pro_side_meta(),
186
+ )
187
+ )
188
+ );
189
+
190
+ return $meta_boxes;
191
+ }
192
+ add_filter( 'drkfr_meta_boxes', 'tmm_metaboxes' );
193
+
194
+ if (!class_exists('drkfr_Meta_Box')) {
195
+ require_once( 'drkfr/custom-meta-boxes.php' );
196
+ }
197
+
198
+ //shortcode columns
199
+ add_action( 'manage_tmm_posts_custom_column' , 'dktmm_custom_columns', 10, 2 );
200
+
201
+ function dktmm_custom_columns( $column, $post_id ) {
202
+ switch ( $column ) {
203
+ case 'shortcode' :
204
+ global $post;
205
+ $slug = '' ;
206
+ $slug = $post->post_name;
207
+
208
+
209
+ $shortcode = '<span style="border: solid 3px lightgray; background:white; padding:7px; font-size:17px; line-height:40px;">[tmm name="'.$slug.'"]</strong>';
210
+ echo $shortcode;
211
+ break;
212
+ }
213
+ }
214
+
215
+ function add_tmm_columns($columns) {
216
+ return array_merge($columns,
217
+ array('shortcode' => __('Shortcode'),
218
+ ));
219
+ }
220
+ add_filter('manage_tmm_posts_columns' , 'add_tmm_columns');
221
+
222
+ //tmm shortcode
223
+ function tmm_sc($atts) {
224
+ extract(shortcode_atts(array(
225
+ "name" => ''
226
+ ), $atts));
227
+
228
+ query_posts( array( 'post_type' => 'tmm', 'name' => $name, ) );
229
+ if ( have_posts() ) : while ( have_posts() ) : the_post();
230
+
231
+ global $post;
232
+
233
+ $members = get_post_meta( get_the_id(), 'tmm_head', false );
234
+ $options = get_post_meta( get_the_id(), 'tmm_settings_head', false );
235
+
236
+ foreach ($options as $key => $option) {
237
+ $tmm_columns = $option['tmm_columns'];
238
+ $tmm_color = $option['tmm_color'];
239
+ }
240
+
241
+ $output .= '<div class="tmm tmm_'.$name.'">';
242
+ $output .= '<div class="tmm_'.$tmm_columns.'_columns">';
243
+ $output .= '
244
+ <div class="tmm_wrap">
245
+ ';
246
+
247
+ $counter = 1;
248
+ $cols = $tmm_columns;
249
+
250
+ foreach ($members as $key => $member) {
251
+
252
+ if ( $counter % $cols == 1 || $counter == 1 ) {
253
+ $output .= '<div class="tmm_three_entries">';
254
+ }
255
+
256
+ $output .= '<div class="tmm_member" style="border-top:'.$tmm_color.' solid 5px;">';
257
+ $output .= wp_get_attachment_image( $member['tmm_photo'] );
258
+ $output .= '<div class="tmm_textblock">';
259
+ $output .= '<div class="tmm_names">';
260
+ $output .= '<div class="tmm_fname">'.$member['tmm_firstname'].'</div>';
261
+ $output .= '&nbsp;';
262
+ $output .= '<div class="tmm_lname">'.$member['tmm_lastname'].'</div>';
263
+ $output .= '</div>';
264
+ $output .= '<div class="tmm_job">'.$member['tmm_job'].'</div>';
265
+ $output .= '<div class="tmm_desc">'.$member['tmm_desc'].'</div>';
266
+ $output .= '<div class="tmm_scblock">';
267
+ if ($member['tmm_sc_type1'] != 'nada') {
268
+ $output .= '<a class="tmm_sociallink" href="'.$member['tmm_sc_url1'].'" title="'.$member['tmm_sc_title1'].'">';
269
+ $output .= '<img src="'.plugins_url('img/links/', __FILE__).$member['tmm_sc_type1'].'.png"/>';
270
+ $output .= '</a>';
271
+ }
272
+
273
+ if ($member['tmm_sc_type2'] != 'nada') {
274
+ $output .= '<a class="tmm_sociallink" href="'.$member['tmm_sc_url2'].'" title="'.$member['tmm_sc_title2'].'">';
275
+ $output .= '<img src="'.plugins_url('img/links/', __FILE__).$member['tmm_sc_type2'].'.png"/>';
276
+ $output .= '</a>';
277
+ }
278
+
279
+ if ($member['tmm_sc_type3'] != 'nada') {
280
+ $output .= '<a class="tmm_sociallink" href="'.$member['tmm_sc_url3'].'" title="'.$member['tmm_sc_title3'].'">';
281
+ $output .= '<img src="'.plugins_url('img/links/', __FILE__).$member['tmm_sc_type3'].'.png"/>';
282
+ $output .= '</a>';
283
+ }
284
+ $output .= '</div>';
285
+ $output .= '</div>';
286
+ $output .= '</div>';
287
+
288
+ if ($counter % $cols == 0) {
289
+ $output .= '</div>';
290
+ }
291
+ $counter++;
292
+ }
293
+ $output .= '<div class="clearer"></div></div>';
294
+ $output .= '</div>';
295
+ $output .= '</div>';
296
+
297
+
298
+ endwhile; endif; wp_reset_query();
299
+
300
+ return $output;
301
+
302
+ }
303
+ add_shortcode("tmm", "tmm_sc");
304
+
305
+ ?>