If Menu – Visibility control for Menu Items - Version 0.8.3

Version Description

Release Date - 22 February 2018

  • Fixed - Support for PHP <
Download this release

Release Info

Developer andrei.igna
Plugin Icon 128x128 If Menu – Visibility control for Menu Items
Version 0.8.3
Comparing to
See all releases

Code changes from version 0.2.1 to 0.8.3

assets/icon-visibility.svg ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <svg fill="#50a92f" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 0h24v24H0z" fill="none"/>
3
+ <path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/>
4
+ </svg>
assets/if-menu-site.css ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ @keyframes ifMenuFadeIn {
3
+ from {
4
+ opacity: 0;
5
+ transform: translate3d(20%, 0, 0);
6
+ }
7
+ to {
8
+ opacity: 1;
9
+ transform: translate3d(0, 0, 0);
10
+ }
11
+ }
12
+
13
+ .if-menu-peek {
14
+ position: relative;
15
+ }
16
+
17
+ .if-menu-peek a {
18
+ opacity: 0.8;
19
+ }
20
+
21
+ .if-menu-peek::before {
22
+ content: "If Menu peek";
23
+ position: absolute;
24
+ text-align: center;
25
+ top: 50%;
26
+ left: calc(100% + 15px);
27
+ background: #f6f9fc;
28
+ box-shadow: 0 0 0 1px rgba(136,152,170,.1), 0 15px 35px 0 rgba(49,49,93,.1), 0 5px 15px 0 rgba(0,0,0,.08);
29
+ border-radius: 4px;
30
+ width: 140px;
31
+ margin-top: -17px;
32
+ padding: 10px 15px;
33
+ font-size: 14px;
34
+ opacity: 0;
35
+ pointer-events: none;
36
+ }
37
+
38
+ .if-menu-peek:hover::before {
39
+ animation: ifMenuFadeIn ease-in-out .2s forwards;
40
+ }
41
+
42
+ .if-menu-peek::after {
43
+ content: "";
44
+ position: absolute;
45
+ width: 20px;
46
+ height: 17px;
47
+ background: url(icon-visibility.svg);
48
+ color: rgb(80,169,47);
49
+ background-size: cover;
50
+ top: -14px;
51
+ right: -15px;
52
+ border-radius: 50%;
53
+ }
assets/if-menu.css ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /* IF MENU global styles */
3
+
4
+ .if-menu-green {
5
+ color: #50a92f;
6
+ }
7
+
8
+ .if-menu-red {
9
+ color: #e04c4c;
10
+ }
11
+
12
+ .if-menu-purple {
13
+ color: #8b6cfb;
14
+ }
15
+
16
+ @keyframes ifMenufadeIn {
17
+ from {
18
+ opacity: 0;
19
+ transform: translate3d(0, -30%, 0);
20
+ }
21
+ to {
22
+ opacity: 1;
23
+ transform: translate3d(0, 0, 0);
24
+ }
25
+ }
26
+
27
+ .if-menu-dialog {
28
+ border-radius: 5px;
29
+ }
30
+
31
+ .if-menu-dialog .ui-dialog-titlebar {
32
+ border-radius: 5px 5px 0 0;
33
+ padding: 3rem 0;
34
+ background: url(plan-premium.png);
35
+ background-size: cover;
36
+ }
37
+
38
+ .if-menu-dialog .ui-dialog-titlebar-close {
39
+ color: #fff;
40
+ }
41
+
42
+ .if-menu-dialog .ui-dialog-title {
43
+ text-align: center;
44
+ display: block;
45
+ color: #fff;
46
+ font-size: 2rem;
47
+ text-shadow: 0px 0px 30px rgb(0, 0, 0);
48
+ }
49
+
50
+ .if-menu-help {
51
+ float: right;
52
+ }
53
+
54
+ .if-menu-help span {
55
+ text-decoration: none;
56
+ color: #c0c0c0;
57
+ }
58
+
59
+
60
+
61
+ /* IF MENU page */
62
+
63
+ .if-menu-wrap ul {
64
+ list-style: circle;
65
+ padding-left: 20px;
66
+ }
67
+
68
+ .if-menu-wrap .list li {
69
+ line-height: 1.4rem;
70
+ }
71
+
72
+ .if-menu-wrap .about-text {
73
+ margin-right: 0;
74
+ min-height: auto;
75
+ }
76
+
77
+ .if-menu-wrap .two-col,
78
+ .if-menu-wrap .three-col {
79
+ align-items: flex-start;
80
+ }
81
+
82
+ .if-menu-wrap .pricing-plan-section h3 {
83
+ margin-bottom: 2rem;
84
+ }
85
+
86
+ .if-menu-wrap .pricing-plan-section .price {
87
+ float: right;
88
+ font-size: 30px;
89
+ }
90
+
91
+ .if-menu-wrap .pricing-plan-section .price small {
92
+ color: #777;
93
+ }
94
+
95
+ .if-menu-wrap .pricing-plan-section .pricing-cell {
96
+ background: #f9f9f9;
97
+ border-radius: 0.5rem;
98
+ padding: 2rem;
99
+ border: 2px solid #f0f0f0;
100
+ box-shadow: 0px 2px 4px -2px rgba(0,0,0,0.15);
101
+ transition: 0.2s;
102
+ cursor: default;
103
+ }
104
+
105
+ .if-menu-wrap .pricing-plan-section .pricing-cell a {
106
+ text-decoration: none;
107
+ }
108
+
109
+ .if-menu-wrap .pricing-plan-section .pricing-cell:hover {
110
+ transform: translateY(-2px);
111
+ box-shadow: 0 12px 23px rgba(0,0,0,0.05);
112
+ }
113
+
114
+ .if-menu-wrap .pricing-plan-section .pricing-cell.selected {
115
+ border-color: #0073aa;
116
+ }
117
+
118
+ .if-menu-wrap .pricing-plan-section ul {
119
+ padding: 0;
120
+ }
121
+
122
+ .if-menu-wrap .pricing-plan-section li {
123
+ padding: 0.5rem 0 0.5rem 1.2rem;
124
+ border-bottom: 1px solid #efefef;
125
+ position: relative;
126
+ margin: 0;
127
+ list-style: none;
128
+ }
129
+
130
+ .if-menu-wrap .pricing-plan-section li:last-child {
131
+ border-bottom: 0;
132
+ }
133
+
134
+ .if-menu-wrap .pricing-plan-section li:before {
135
+ content: "✓";
136
+ position: absolute;
137
+ color: #0073aa;
138
+ left: 0;
139
+ }
140
+
141
+ .if-menu-wrap .pricing-plan-section ul ul {
142
+ margin-top: 0.5rem;
143
+ }
144
+
145
+ .if-menu-wrap .pricing-plan-section li li {
146
+ margin: 0;
147
+ border: 0;
148
+ padding-left: 1rem;
149
+ }
150
+
151
+ .if-menu-wrap .pricing-plan-section li li:before {
152
+ color: #cfcfcf;
153
+ content: "›";
154
+ }
155
+
156
+ .if-menu-wrap .pricing-plan-section p {
157
+ text-align: center;
158
+ margin: 1.5rem 0 0;
159
+ }
160
+
161
+
162
+
163
+ /* IF MENU APPEARANCE MENUS page */
164
+
165
+ .if-menu-conditions {
166
+ border-left: 1px solid #ddd;
167
+ clear: both;
168
+ overflow: hidden;
169
+ margin-left: 7px;
170
+ padding-left: 10px;
171
+ border-bottom-left-radius: 6px;
172
+ }
173
+
174
+ .if-menu-conditions .if-menu-condition {
175
+ position: relative;
176
+ padding: 3px 0px;
177
+ width: calc(100% - 14px);
178
+ color: #0d2b3e;
179
+ animation: ifMenufadeIn 0.2s ease-in-out both;
180
+ }
181
+
182
+ .if-menu-conditions .if-menu-condition-rule {
183
+ display: inline-block;
184
+ background: #f5f7f7;
185
+ border-radius: 5px;
186
+ }
187
+
188
+ .if-menu-conditions .if-menu-condition:before {
189
+ content: "";
190
+ position: absolute;
191
+ top: 10px;
192
+ left: -10px;
193
+ width: 0;
194
+ height: 0;
195
+ border-top: 5px solid transparent;
196
+ border-bottom: 5px solid transparent;
197
+ border-left: 5px solid #ddd;
198
+ }
199
+
200
+ .if-menu-condition select {
201
+ border: 0;
202
+ box-shadow: none;
203
+ background: transparent;
204
+ }
205
+
206
+ .if-menu-condition .select2-container--default .select2-selection--multiple {
207
+ background: #f5f7f7;
208
+ border: 0;
209
+ margin-top: 5px;
210
+ }
211
+
212
+ .if-menu-condition .select2-container--default.select2-container--focus .select2-selection--multiple {
213
+ background: #f5f7f7;
214
+ border: 0;
215
+ margin-top: 5px;
216
+ }
217
+
218
+ .if-menu-condition .select2-container--default .select2-search--inline .select2-search__field {
219
+ line-height: 22px;
220
+ }
221
+
222
+ .if-menu-condition .select2-container--default .select2-selection--multiple .select2-selection__choice {
223
+ color: #8b6cfb;
224
+ border: 0 !important;
225
+ line-height: 22px;
226
+ }
227
+
228
+ .select2-dropdown {
229
+ border-color: #f5f7f7;
230
+ }
231
+
232
+ .if-menu-condition .menu-item-if-menu-condition-type {
233
+ width: 60px;
234
+ color: #50a92f;
235
+ }
236
+
237
+ .if-menu-condition .menu-item-if-menu-condition-type[data-val="hide"] {
238
+ width: 60px;
239
+ color: #e04c4c;
240
+ }
241
+
242
+ .if-menu-condition .menu-item-if-menu-condition {
243
+ width: 225px;
244
+ color: #8b6cfb;
245
+ }
246
+
247
+ .if-menu-condition .menu-item-if-menu-enable-next {
248
+ width: 55px;
249
+ text-align-last: center;
250
+ color: #71aee6;
251
+ appearance: none;
252
+ -webkit-appearance: none;
253
+ background: #f5f7f7;
254
+ border-radius: 5px;
255
+ }
256
+
257
+ .if-menu-condition .menu-item-if-menu-enable-next::-ms-expand {
258
+ display: none;
259
+ }
260
+
261
+ .if-menu-condition .menu-item-if-menu-enable-next option {
262
+ direction: rtl;
263
+ }
assets/if-menu.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function($) {
2
+
3
+
4
+ // Show or hide conditions section
5
+ $('body').on('change', '.menu-item-if-menu-enable', function() {
6
+ $( this ).closest( '.if-menu-enable' ).next().toggle( $( this ).prop( 'checked' ) );
7
+
8
+ if ( ! $( this ).prop( 'checked' ) ) {
9
+ var firstCondition = $( this ).closest( '.if-menu-enable' ).next().find('p:first');
10
+ firstCondition.find('.menu-item-if-menu-enable-next').val('false');
11
+ firstCondition.nextAll().remove();
12
+ }
13
+ });
14
+
15
+
16
+ // Show or hide conditions section for multiple rules
17
+ $('body').on( 'change', '.menu-item-if-menu-enable-next', function() {
18
+ var elCondition = $( this ).closest( '.if-menu-condition' );
19
+
20
+ if ($(this).val() === 'false') {
21
+ elCondition.nextAll().remove();
22
+ } else if (!elCondition.next().length) {
23
+ var newCondition = elCondition.clone().appendTo(elCondition.parent());
24
+ newCondition.find('select').removeAttr('data-val').find('option:selected').removeAttr('selected');
25
+ newCondition.find('.menu-item-if-menu-options, .select2').remove();
26
+ }
27
+ });
28
+
29
+
30
+ // Check if menu extra fields are actually displayed
31
+ if ($('#menu-to-edit li').length !== $('#menu-to-edit li .if-menu-enable').length) {
32
+ $('<div class="notice error is-dismissible if-menu-notice"><p>' + IfMenu.conflictErrorMessage + '</p></div>').insertAfter('.wp-header-end');
33
+ }
34
+
35
+
36
+ // Store current value in data-val attribute (used for CSS styling)
37
+ $('body').on('change', '.menu-item-if-menu-condition-type', function() {
38
+ $(this).attr('data-val', $(this).val());
39
+ });
40
+
41
+
42
+ // Display multiple options
43
+ $('.menu-item-if-menu-options').select2();
44
+ $('body').on('change', '.menu-item-if-menu-condition', function() {
45
+ var options = $(this).find('option:selected').data('options'),
46
+ elCondition = $(this).closest('.if-menu-condition');
47
+
48
+ elCondition.find('.menu-item-if-menu-options').select2('destroy').remove();
49
+
50
+ if (options && !!IfMenu.plan && IfMenu.plan.plan === 'premium') {
51
+ $('<select class="menu-item-if-menu-options" name="menu-item-if-menu-options[' + elCondition.data('menu-item-id') + '][' + elCondition.index() + '][]" style="width: 305px" multiple></select>')
52
+ .appendTo(elCondition)
53
+ .select2({data: $.map(options, function(value, index) {
54
+ return {
55
+ id: index,
56
+ text: value
57
+ };
58
+ })});
59
+ } else if (options && (!IfMenu.plan || IfMenu.plan.plan !== 'premium')) {
60
+ $(this).find(':selected').removeAttr('selected');
61
+ $(this).find(':first').attr('selected', true);
62
+ $('.if-menu-dialog-premium').dialog({
63
+ dialogClass: 'if-menu-dialog',
64
+ draggable: false,
65
+ modal: true,
66
+ width: 450,
67
+ open: function(event, ui) {
68
+ console.log(event);
69
+ console.log(ui);
70
+ }
71
+ });
72
+ }
73
+ });
74
+
75
+
76
+ // Store current value in data-val attribute (used for CSS styling)
77
+ $('.if-menu-dialog-btn').click(function() {
78
+ if ($(this).data('action') === 'get-premium') {
79
+ window.onbeforeunload = function() {};
80
+ }
81
+
82
+ $(this).closest('.ui-dialog-content').dialog('close');
83
+ });
84
+
85
+
86
+ });
assets/plan-premium.png ADDED
Binary file
assets/select2.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
assets/select2.min.js ADDED
@@ -0,0 +1 @@
 
1
+ /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k<a.length;k++)if("."===(m=a[k]))a.splice(k,1),k-=1;else if(".."===m){if(0===k||1===k&&".."===a[2]||".."===a[k-1])continue;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o<c.length;o+=1)if(n=p(c[o],t),"require"===(k=n.f))w[o]=q.require(a);else if("exports"===k)w[o]=q.exports(a),v=!0;else if("module"===k)h=w[o]=q.module(a);else if(e(r,k)||e(s,k)||e(u,k))w[o]=j(k);else{if(!n.p)throw new Error(a+" missing "+k);n.p.load(n.n,g(f,!0),i(k),{}),w[o]=r[k]}m=d?d.apply(r[a],w):void 0,a&&(h&&h.exports!==b&&h.exports!==r[a]?r[a]=h.exports:m===b&&v||(r[a]=m))}else a&&(r[a]=d)},a=c=o=function(a,c,d,e,f){if("string"==typeof a)return q[a]?q[a](c):j(p(a,l(c)).f);if(!a.splice){if(t=a,t.deps&&o(t.deps,t.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?n(b,a,c,d):setTimeout(function(){n(b,a,c,d)},4),o},o.config=function(a){return o(a)},a._defined=r,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(r,a)||e(s,a)||(s[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){"function"==typeof b[d]&&("constructor"!==d&&c.push(d))}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){return Array.prototype.unshift.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;c<d;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;c<a;c++){b+=Math.floor(36*Math.random()).toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return(e!==f||"hidden"!==f&&"visible"!==f)&&("scroll"===e||"scroll"===f||(d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth))},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){b.find(".select2-results").append(a)},c.prototype.sort=function(a){return this.options.get("sorter")(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()});b.$results.find(".select2-results__option[aria-selected]").each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):h-g<0&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");if("true"===c.attr("aria-selected"))return void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{}));d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2");a(".select2.select2-container--open").each(function(){var b=a(this);this!=d[0]&&b.data("element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id;if(b.length>1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||c.which!=b.DELETE&&c.which!=b.BACKSPACE||this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var b=e.$searchContainer.prev(".select2-selection__choice");if(b.length>0){var d=b.data("data");e.searchRemoveChoice(d),a.preventDefault()}}});var f=document.documentMode,g=f&&f<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(g)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple")){if(a.selected=!1,c(a.element).is("option"))return a.element.selected=!1,void this.$element.trigger("change");this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})}},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this;this.$element.children().each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),void 0!==a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(null!=(b=c.data(a[0],"data")))return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){return this.options.get("matcher")(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0);if((i.text||"").toUpperCase()===(b.term||"").toUpperCase()||j)return!f&&(a.data=g,void c(a))}if(f)return!0;var k=e.createTag(b);if(null!=k){var l=e.option(k);l.attr("data-select2-tag",!0),e.addOptions([l]),e.insertTag(g,k)}a.results=g,c(a)}var e=this;if(this._removeOldTags(),null==b.term||null!=b.page)return void a.call(this,b,c);a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){this._lastTag;this.$element.find("option[data-select2-tag]").each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b);if(!g.$element.find("option").filter(function(){return a(this).val()===c.id}).length){var d=g.option(c);d.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([d])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",b.term.length<this.minimumInputLength)return void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return!(a(c.data.results)<this.minimumResultsForSearch)&&b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){return"Please enter "+(a.minimum-a.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}return D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(a){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(a){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var O=k.loadPath(this.defaults.amdLanguageBase+"en"),P=new k(l.language);P.extend(O),l.translations=P}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h<i;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
conditions.php DELETED
@@ -1,83 +0,0 @@
1
- <?php
2
-
3
- add_filter( 'if_menu_conditions', 'if_menu_basic_conditions' );
4
-
5
- function if_menu_basic_conditions( $conditions ) {
6
-
7
- $conditions[] = array(
8
- 'name' => __( 'User is logged in', 'if-menu' ),
9
- 'condition' => 'is_user_logged_in'
10
- );
11
-
12
- $conditions[] = array(
13
- 'name' => __( 'User is Admin', 'if-menu' ),
14
- 'condition' => 'if_menu_basic_condition_admin'
15
- );
16
-
17
- $conditions[] = array(
18
- 'name' => __( 'User is Editor', 'if-menu' ),
19
- 'condition' => 'if_menu_basic_condition_editor'
20
- );
21
-
22
- $conditions[] = array(
23
- 'name' => __( 'User is Subscriber', 'if-menu' ),
24
- 'condition' => 'if_menu_basic_condition_subscriber'
25
- );
26
-
27
- $conditions[] = array(
28
- 'name' => __( 'User is Author', 'if-menu' ),
29
- 'condition' => 'if_menu_basic_condition_author'
30
- );
31
-
32
- $conditions[] = array(
33
- 'name' => __( 'User is Contributor', 'if-menu' ),
34
- 'condition' => 'if_menu_basic_condition_contributor'
35
- );
36
-
37
- $conditions[] = array(
38
- 'name' => __( 'Front Page', 'if-menu' ),
39
- 'condition' => 'is_front_page'
40
- );
41
-
42
- $conditions[] = array(
43
- 'name' => __( 'Single Post', 'if-menu' ),
44
- 'condition' => 'is_single'
45
- );
46
-
47
- $conditions[] = array(
48
- 'name' => __( 'Page', 'if-menu' ),
49
- 'condition' => 'is_page'
50
- );
51
-
52
- return $conditions;
53
- }
54
-
55
- function if_menu_basic_condition_admin() {
56
- global $current_user;
57
- if( is_user_logged_in() ) return in_array( 'administrator', $current_user->roles );
58
- return false;
59
- }
60
-
61
- function if_menu_basic_condition_editor() {
62
- global $current_user;
63
- if( is_user_logged_in() ) foreach( array( 'administrator', 'editor' ) as $role ) if( in_array( $role, $current_user->roles ) ) return true;
64
- return false;
65
- }
66
-
67
- function if_menu_basic_condition_author() {
68
- global $current_user;
69
- if( is_user_logged_in() ) foreach( array( 'administrator', 'editor', 'author' ) as $role ) if( in_array( $role, $current_user->roles ) ) return true;
70
- return false;
71
- }
72
-
73
- function if_menu_basic_condition_contributor() {
74
- global $current_user;
75
- if( is_user_logged_in() ) foreach( array( 'administrator', 'editor', 'author', 'contributor' ) as $role ) if( in_array( $role, $current_user->roles ) ) return true;
76
- return false;
77
- }
78
-
79
- function if_menu_basic_condition_subscriber() {
80
- global $current_user;
81
- if( is_user_logged_in() ) foreach( array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ) as $role ) if( in_array( $role, $current_user->roles ) ) return true;
82
- return false;
83
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if-menu.js DELETED
@@ -1,7 +0,0 @@
1
- jQuery( function( $ ) {
2
-
3
- $( 'body' ).on( 'change', '.menu-item-if-menu-enable', function() {
4
- $( this ).closest( '.if-menu-enable' ).next().toggle( $( this ).prop( 'checked' ) );
5
- } );
6
-
7
- } );
 
 
 
 
 
 
 
if-menu.php CHANGED
@@ -1,179 +1,500 @@
1
- <?php
2
- /*
3
- Plugin Name: If Menu
4
- Plugin URI: http://wordpress.org/plugins/if-menu/
5
- Description: Show/hide menu items with conditional statements
6
- Version: 0.2.1
7
- Author: Andrei Igna
8
- Author URI: http://rokm.ro
9
- License: GPL2
10
- */
11
-
12
- /* Copyright 2012 More WordPress (email: andrei@rokm.ro)
13
-
14
- This program is free software; you can redistribute it and/or modify
15
- it under the terms of the GNU General Public License, version 2, as
16
- published by the Free Software Foundation.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26
- */
27
-
28
-
29
- class If_Menu {
30
-
31
- protected static $has_custom_walker = null;
32
-
33
- public static function init() {
34
- self::$has_custom_walker = 'Walker_Nav_Menu_Edit' !== apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit' );
35
-
36
- if( is_admin() && ! self::$has_custom_walker ) {
37
- add_action( 'admin_init', 'If_Menu::admin_init' );
38
- add_action( 'wp_update_nav_menu_item', 'If_Menu::wp_update_nav_menu_item', 10, 2 );
39
- add_filter( 'wp_edit_nav_menu_walker', create_function( '', 'return "If_Menu_Walker_Nav_Menu_Edit";' ) );
40
- } elseif( is_admin() && self::$has_custom_walker ) {
41
- add_action( 'admin_notices', 'If_Menu::admin_notices' );
42
- } elseif( ! is_admin() && ! self::$has_custom_walker ) {
43
- add_filter( 'wp_get_nav_menu_items', 'If_Menu::wp_get_nav_menu_items' );
44
- }
45
- }
46
-
47
- public static function admin_notices() {
48
- global $pagenow;
49
- if( current_user_can( 'edit_theme_options' ) && ( $pagenow == 'plugins.php' || $pagenow == 'nav-menus.php' ) ) {
50
- echo '<div class="updated"><p>' . __( '<b>If Menu</b> plugin detected another plugin(s) that modify the menus, and to don\'t break them <b>If Menu</b> plugin is disabled.', 'if-menu' ) . '</p></div>';
51
- }
52
- }
53
-
54
- public static function get_conditions( $for_testing = false ) {
55
- $conditions = apply_filters( 'if_menu_conditions', array() );
56
-
57
- if( $for_testing ) {
58
- $c2 = array();
59
- foreach( $conditions as $condition ) $c2[$condition['name']] = $condition;
60
- $conditions = $c2;
61
- }
62
-
63
- return $conditions;
64
- }
65
-
66
- public static function wp_get_nav_menu_items( $items ) {
67
- $conditions = If_Menu::get_conditions( $for_testing = true );
68
- $hidden_items = array();
69
-
70
- foreach( $items as $key => $item ) {
71
- if( in_array( $item->menu_item_parent, $hidden_items ) ) {
72
- unset( $items[$key] );
73
- $hidden_items[] = $item->ID;
74
- } elseif( get_post_meta( $item->ID, 'if_menu_enable', true ) ) {
75
- $condition_type = get_post_meta( $item->ID, 'if_menu_condition_type', true );
76
- $condition = get_post_meta( $item->ID, 'if_menu_condition', true );
77
-
78
- $condition_result = call_user_func( $conditions[$condition]['condition'], $item );
79
- if( $condition_type == 'show' ) $condition_result = ! $condition_result;
80
-
81
- if( $condition_result ) {
82
- unset( $items[$key] );
83
- $hidden_items[] = $item->ID;
84
- }
85
- }
86
- }
87
-
88
- return $items;
89
- }
90
-
91
- public static function admin_init() {
92
- global $pagenow;
93
- if( $pagenow == 'nav-menus.php' ) {
94
- wp_enqueue_script( 'if-menu-js', plugins_url( 'if-menu.js' , __FILE__ ), array( 'jquery' ) );
95
- }
96
- }
97
-
98
- public static function edit_menu_item_settings( $item ) {
99
- $conditions = If_Menu::get_conditions();
100
- $if_menu_enable = get_post_meta( $item->ID, 'if_menu_enable', true );
101
- $if_menu_condition_type = get_post_meta( $item->ID, 'if_menu_condition_type', true );
102
- $if_menu_condition = get_post_meta( $item->ID, 'if_menu_condition', true );
103
- ob_start();
104
- ?>
105
-
106
- <p class="if-menu-enable description description-wide">
107
- <label>
108
- <input <?php checked( $if_menu_enable, 1 ) ?> type="checkbox" value="1" class="menu-item-if-menu-enable" name="menu-item-if-menu-enable[<?php echo $item->ID; ?>]" />
109
- <?php _e( 'Enable Conditional Logic', 'if-menu' ) ?>
110
- </label>
111
- </p>
112
-
113
- <p class="if-menu-condition description description-wide" style="display: <?php echo $if_menu_enable ? 'block' : 'none' ?>">
114
- <select id="edit-menu-item-if-menu-condition-type-<?php echo $item->ID; ?>" name="menu-item-if-menu-condition-type[<?php echo $item->ID; ?>]">
115
- <option <?php selected( 'show', $if_menu_condition_type ) ?> value="show"><?php _e( 'Show', 'if-menu' ) ?></option>
116
- <option <?php selected( 'hide', $if_menu_condition_type ) ?> value="hide"><?php _e( 'Hide', 'if-menu' ) ?></option>
117
- </select>
118
- <?php _e('if', 'if-menu'); ?>
119
- <select id="edit-menu-item-if-menu-condition-<?php echo $item->ID; ?>" name="menu-item-if-menu-condition[<?php echo $item->ID; ?>]">
120
- <?php foreach( $conditions as $condition ): ?>
121
- <option <?php selected( $condition['name'], $if_menu_condition ) ?>><?php echo $condition['name']; ?></option>
122
- <?php endforeach ?>
123
- </select>
124
- </p>
125
-
126
- <?php
127
- $html = ob_get_clean();
128
- return $html;
129
- }
130
-
131
- public static function wp_update_nav_menu_item( $menu_id, $menu_item_db_id ) {
132
- $if_menu_enable = isset( $_POST['menu-item-if-menu-enable'][$menu_item_db_id] ) && $_POST['menu-item-if-menu-enable'][$menu_item_db_id] == 1;
133
- update_post_meta( $menu_item_db_id, 'if_menu_enable', $if_menu_enable ? 1 : 0 );
134
-
135
- if( $if_menu_enable ) {
136
- update_post_meta( $menu_item_db_id, 'if_menu_condition_type', $_POST['menu-item-if-menu-condition-type'][$menu_item_db_id] );
137
- update_post_meta( $menu_item_db_id, 'if_menu_condition', $_POST['menu-item-if-menu-condition'][$menu_item_db_id] );
138
- }
139
- }
140
-
141
- }
142
-
143
-
144
-
145
- /* ------------------------------------------------
146
- Custom Walker for nav items
147
- ------------------------------------------------ */
148
-
149
- require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
150
-
151
- class If_Menu_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {
152
-
153
- function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
154
- $desc_snipp = '<div class="menu-item-actions description-wide submitbox">';
155
- parent::start_el( $output, $item, $depth, $args, $id );
156
-
157
- $pos = strrpos( $output, $desc_snipp );
158
- if( $pos !== false ) {
159
- $output = substr_replace($output, If_Menu::edit_menu_item_settings( $item ) . $desc_snipp, $pos, strlen( $desc_snipp ) );
160
- }
161
- }
162
-
163
- }
164
-
165
-
166
-
167
- /* ------------------------------------------------
168
- Include default conditions for menu items
169
- ------------------------------------------------ */
170
-
171
- include 'conditions.php';
172
-
173
-
174
-
175
- /* ------------------------------------------------
176
- Run the plugin
177
- ------------------------------------------------ */
178
-
179
- add_action( 'init', 'If_Menu::init' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: If Menu
4
+ Plugin URI: https://wordpress.org/plugins/if-menu/
5
+ Description: Display tailored menu items to each visitor with visibility rules
6
+ Version: 0.8.3
7
+ Text Domain: if-menu
8
+ Author: Layered
9
+ Author URI: https://layered.studio
10
+ License: GPL2
11
+ */
12
+
13
+ /* Copyright 2012 Andrei Igna (email: andrei@rokm.ro)
14
+
15
+ This program is free software; you can redistribute it and/or modify
16
+ it under the terms of the GNU General Public License, version 2, as
17
+ published by the Free Software Foundation.
18
+
19
+ This program is distributed in the hope that it will be useful,
20
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ GNU General Public License for more details.
23
+
24
+ You should have received a copy of the GNU General Public License
25
+ along with this program; if not, write to the Free Software
26
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27
+ */
28
+
29
+
30
+ class If_Menu {
31
+
32
+ public static function init() {
33
+ global $pagenow;
34
+
35
+ load_plugin_textdomain('if-menu', false, dirname(plugin_basename(__FILE__)) . '/languages');
36
+
37
+ add_action('rest_api_init', 'If_Menu::restApi');
38
+
39
+ if (is_admin()) {
40
+ add_action('admin_enqueue_scripts', 'If_Menu::admin_init');
41
+ add_action('wp_update_nav_menu_item', 'If_Menu::wp_update_nav_menu_item', 10, 2);
42
+ add_filter('wp_edit_nav_menu_walker', 'If_Menu::customWalker', 500);
43
+ add_action('wp_nav_menu_item_custom_fields', 'If_Menu::menu_item_fields');
44
+ add_action('wp_nav_menu_item_custom_title', 'If_Menu::menu_item_title');
45
+ add_action('init', 'If_Menu::saveSettings');
46
+ add_action('admin_footer', 'If_Menu::adminFooter');
47
+ add_action('admin_menu', function() {
48
+ add_submenu_page('themes.php', 'If Menu', 'If Menu', 'edit_theme_options', 'if-menu', 'If_Menu::page');
49
+ });
50
+
51
+ if ($pagenow !== 'nav-menus.php') {
52
+ add_filter( 'wp_get_nav_menu_items', 'If_Menu::wp_get_nav_menu_items' );
53
+ }
54
+ } else {
55
+ add_filter( 'wp_get_nav_menu_items', 'If_Menu::wp_get_nav_menu_items' );
56
+ add_action('wp_enqueue_scripts', 'If_Menu::addAssets');
57
+ }
58
+ }
59
+
60
+ public static function get_conditions( $for_testing = false ) {
61
+ $conditions = apply_filters( 'if_menu_conditions', array() );
62
+
63
+ if ($for_testing) {
64
+ $c2 = array();
65
+ foreach ($conditions as $condition) {
66
+ $c2[$condition['id']] = $condition;
67
+ $c2[$condition['name']] = $condition;
68
+ if (isset($condition['alias'])) {
69
+ $c2[$condition['alias']] = $condition;
70
+ }
71
+ }
72
+ $conditions = $c2;
73
+ }
74
+
75
+ return $conditions;
76
+ }
77
+
78
+ public static function wp_get_nav_menu_items($items) {
79
+ $conditions = If_Menu::get_conditions($for_testing = true);
80
+ $hidden_items = array();
81
+
82
+ $canPeek = is_user_logged_in() && get_option('if-menu-peak') && current_user_can('edit_theme_options');
83
+
84
+ foreach ($items as $key => $item) {
85
+
86
+ if (in_array($item->menu_item_parent, $hidden_items)) {
87
+ if ($canPeek) {
88
+ $item->classes[] = 'if-menu-peek';
89
+ } else {
90
+ unset($items[$key]);
91
+ }
92
+ $hidden_items[] = $item->ID;
93
+ } else {
94
+ $enabled = get_post_meta($item->ID, 'if_menu_enable');
95
+
96
+ if ($enabled && $enabled[0] !== '0') {
97
+ $if_condition_types = get_post_meta($item->ID, 'if_menu_condition_type');
98
+ $if_conditions = get_post_meta($item->ID, 'if_menu_condition');
99
+ $ifMenuOptions = get_post_meta($item->ID, 'if_menu_options');
100
+
101
+ $eval = array();
102
+
103
+ foreach ($enabled as $index => $operator) {
104
+ $singleCondition = '';
105
+
106
+ if ($index) {
107
+ $singleCondition .= $operator . ' ';
108
+ }
109
+
110
+ $bit1 = $if_condition_types[$index] === 'show' ? 1 : 0;
111
+ $bit2 = $if_condition_types[$index] === 'show' ? 0 : 1;
112
+
113
+ $params = array($item);
114
+
115
+ if ($ifMenuOptions && isset($ifMenuOptions[$index])) {
116
+ $params[] = $ifMenuOptions[$index];
117
+ }
118
+
119
+ $singleCondition .= call_user_func_array($conditions[$if_conditions[$index]]['condition'], $params) ? $bit1 : $bit2;
120
+
121
+ $eval[] = $singleCondition;
122
+ }
123
+
124
+ if ((count($eval) === 1 && $eval[0] == 0) || (count($eval) > 1 && !eval('return ' . implode(' ', $eval) . ';'))) {
125
+ if ($canPeek) {
126
+ $item->classes[] = 'if-menu-peek';
127
+ } else {
128
+ unset($items[$key]);
129
+ }
130
+ $hidden_items[] = $item->ID;
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ return $items;
137
+ }
138
+
139
+ public static function admin_init() {
140
+ global $pagenow;
141
+
142
+ if ($pagenow == 'nav-menus.php') {
143
+ wp_enqueue_script('select2', plugins_url('assets/select2.min.js', __FILE__), array('jquery'), '4.0.5');
144
+ wp_enqueue_script('if-menu', plugins_url('assets/if-menu.js', __FILE__), array('select2', 'jquery-ui-dialog'), '0.8');
145
+
146
+ wp_enqueue_style('select2', plugins_url('assets/select2.min.css', __FILE__), array(), '4.0.5');
147
+ wp_enqueue_style('if-menu', plugins_url('assets/if-menu.css', __FILE__), array('wp-jquery-ui-dialog'), '0.8');
148
+
149
+ wp_localize_script('if-menu', 'IfMenu', array(
150
+ 'plan' => self::getPlan(),
151
+ 'conflictErrorMessage' => sprintf(
152
+ wp_kses(
153
+ __('<strong>If Menu</strong> detected a conflict with another plugin or theme (%s) and may not work as expected. <a href="%s" target="_blank">Read more about the issue here</a>', 'if-menu'),
154
+ array('a' => array('href' => array()), 'strong' => array())
155
+ ),
156
+ apply_filters('wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit'),
157
+ esc_url('https://wordpress.org/plugins/if-menu/faq/')
158
+ )
159
+ ));
160
+ }
161
+
162
+ if ($pagenow == 'themes.php') {
163
+ wp_enqueue_style('if-menu', plugins_url('assets/if-menu.css', __FILE__), '0.8');
164
+ }
165
+ }
166
+
167
+ public static function saveSettings() {
168
+ global $pagenow;
169
+
170
+ if ($pagenow == 'themes.php' && isset($_POST['if-menu-settings'])) {
171
+ update_option('if-menu-peak', $_POST['if-menu-peek']);
172
+ }
173
+ }
174
+
175
+ public static function adminFooter() {
176
+ ?>
177
+ <div class="if-menu-dialog-premium hidden" title="<?php _e('That\'s a Premium feature', 'if-menu') ?>">
178
+ <p><?php _e('Get <strong>If Menu Premium</strong> plan to enable integrations with third-party plugins, user location detection and priority support', 'if-menu') ?></p><br>
179
+ <p>
180
+ <a href="<?php echo admin_url('themes.php?page=if-menu') ?>" class="button button-primary pull-right if-menu-dialog-btn" data-action="get-premium"><?php _e('Get If Menu Premium', 'if-menu') ?></a>
181
+ <button class="button close if-menu-dialog-btn" data-action="close"><?php _e('Use Basic plan', 'if-menu') ?></button>
182
+ </p>
183
+ </div>
184
+ <?php
185
+ }
186
+
187
+ public static function page() {
188
+ $ifMenuPeek = get_option('if-menu-peak');
189
+ $plan = self::getPlan();
190
+ ?>
191
+
192
+ <div class="wrap about-wrap if-menu-wrap">
193
+ <h1>If Menu</h1>
194
+ <p class="about-text"><?php _e('Thanks for using <strong>If Menu</strong>! Now you can display tailored menu items to each visitor, based on visibility rules. Here are a few examples:', 'if-menu') ?></p>
195
+ <ul class="list">
196
+ <li><?php _e('Hide Login or Register links for logged-in users:', 'if-menu') ?> <code><span class="if-menu-red"><?php _e('Hide', 'if-menu') ?></span> <?php _e('if', 'if-menu') ?> <span class="if-menu-purple"><?php _e('User is logged in', 'if-menu') ?></span></code></li>
197
+ <li><?php _e('Display Logout link for logged-in users:', 'if-menu') ?> <code><span class="if-menu-green"><?php _e('Show', 'if-menu') ?></span> <?php _e('if', 'if-menu') ?> <span class="if-menu-purple"><?php _e('User is logged in', 'if-menu') ?></span></code></li>
198
+ <li><?php _e('Hide menu item on mobile devices:', 'if-menu') ?> <code><span class="if-menu-red"><?php _e('Hide', 'if-menu') ?></span> <?php _e('if', 'if-menu') ?> <span class="if-menu-purple"><?php _e('Mobile', 'if-menu') ?></span></code></li>
199
+ <li><?php _e('Display menu item for users in US and UK:', 'if-menu') ?> <code><span class="if-menu-green"><?php _e('Show', 'if-menu') ?></span> <?php _e('if', 'if-menu') ?> <span class="if-menu-purple"><?php _e('User from country: US, UK', 'if-menu') ?></span></code></li>
200
+ </ul>
201
+ <hr class="wp-header-end">
202
+
203
+ <div class="feature-section pricing-plan-section two-col">
204
+ <div class="col">
205
+ <div class="pricing-cell <?php if (!$plan || $plan['plan'] == 'free') echo 'selected' ?>">
206
+ <span class="price"><small><?php _e('Free', 'if-menu') ?></small></span>
207
+ <h3><?php _e('Basic', 'if-menu') ?></h3>
208
+
209
+ <ul>
210
+ <li>
211
+ <?php _e('Basic visibility rules:', 'if-menu') ?>
212
+ <ul>
213
+ <li><?php _e('User role - is Admin, Editor, Author or Shop Manager', 'if-menu') ?></li>
214
+ <li><?php _e('User state - visitor is logged in or out', 'if-menu') ?></li>
215
+ <li><?php _e('Visitor device - detect mobile or desktop', 'if-menu') ?></li>
216
+ </ul>
217
+ </li>
218
+ <li><?php _e('Support on WordPress forum', 'if-menu') ?></li>
219
+ </ul>
220
+
221
+ <p>
222
+ <?php if (!$plan || $plan['plan'] == 'free') : ?>
223
+ <button class="button disabled"><?php _e('Current plan', 'if-menu') ?></button>
224
+ <?php endif ?>
225
+ </p>
226
+ </div>
227
+ </div>
228
+
229
+ <div class="col">
230
+ <div class="pricing-cell <?php if ($plan && $plan['plan'] == 'premium') echo 'selected' ?>">
231
+ <span class="price">$15<small>/<?php _e('annually', 'if-menu') ?></small></span>
232
+ <h3><?php _e('Premium', 'if-menu') ?></h3>
233
+
234
+ <ul>
235
+ <li>
236
+ <?php _e('Advanced visibility rules:', 'if-menu') ?>
237
+ <ul>
238
+ <li><?php _e('Visitor location - detect visitor\'s country', 'if-menu') ?></li>
239
+ </ul>
240
+ </li>
241
+ <li>
242
+ <?php _e('3rd-party plugin integrations:', 'if-menu') ?>
243
+ <ul>
244
+ <li><a href="https://woocommerce.com/products/woocommerce-subscriptions" target="_blank">WooCommerce Subscriptions</a> - <?php _e('Customer has active subscription', 'if-menu') ?></li>
245
+ <li><a href="https://wordpress.org/plugins/groups" target="_blank">Groups</a> - <?php _e('Users are in a Group', 'if-menu') ?></li>
246
+ <li><a href="https://member.wishlistproducts.com" target="_blank">WishList Member</a> - <?php _e('Users above a Membership Level', 'if-menu') ?></li>
247
+ </ul>
248
+ </li>
249
+ <li><?php _e('Priority support', 'if-menu') ?></li>
250
+ </ul>
251
+
252
+ <p class="description">
253
+ <?php if ($plan && $plan['plan'] == 'premium') : ?>
254
+ <button class="button disabled"><?php _e('Current plan', 'if-menu') ?></button>
255
+ <br><br><small class="text-muted"><?php printf(__('Active until %s', 'if-menu'), date(get_option('date_format'), strtotime($plan['until']))) ?></small>
256
+ <?php else : ?>
257
+ <a href="https://wordpress.layered.studio/get-premium?site=<?php echo urlencode(site_url()) ?>&_nonce=<?php echo self::apiNonce('get-premium') ?>" class="button button-primary"><?php _e('Get premium', 'if-menu') ?></a>
258
+ <?php endif ?>
259
+ </p>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <hr>
265
+
266
+ <h3 class="title"><?php _e('Settings', 'if-menu') ?></h3>
267
+
268
+ <form method="post" action="">
269
+ <table class="form-table">
270
+ <tbody>
271
+ <tr>
272
+ <th scope="row"><?php _e('If Menu peek', 'if-menu') ?></th>
273
+ <td>
274
+ <fieldset>
275
+ <label><input type="checkbox" name="if-menu-peek" value="1" <?php checked($ifMenuPeek, 1) ?>> <?php _e('Enable If Menu peek', 'if-menu') ?></label><br>
276
+ </fieldset>
277
+ <p class="description"><?php _e('Let administrators preview hidden menu items on website (useful for testing)', 'if-menu') ?></p>
278
+ </td>
279
+ </tr>
280
+ <tr>
281
+ <th scope="row"></th>
282
+ <td>
283
+ <p class="submit"><input type="submit" name="if-menu-settings" id="submit" class="button button-primary" value="<?php _e('Save Changes', 'if-menu') ?>"></p>
284
+ </td>
285
+ </tr>
286
+ </tbody>
287
+ </table>
288
+ </form>
289
+
290
+ <hr>
291
+
292
+ <p class="text-right">
293
+ <strong>If Menu</strong>:
294
+ <a href="https://wordpress.org/plugins/if-menu/#faq" target="wpplugins"><?php _e('FAQs', 'if-menu') ?></a> &middot;
295
+ <a href="https://wordpress.org/plugins/if-menu/#reviews" target="wpplugins"><?php _e('Reviews', 'if-menu') ?></a> &middot;
296
+ <a href="https://wordpress.org/support/plugin/if-menu" target="wpplugins"><?php _e('Support', 'if-menu') ?></a>
297
+ </p>
298
+
299
+ </div>
300
+
301
+ <?php
302
+ }
303
+
304
+ public static function addAssets() {
305
+ wp_enqueue_style('if-menu-site-css', plugins_url('assets/if-menu-site.css', __FILE__));
306
+ }
307
+
308
+ public static function menu_item_fields($item_id) {
309
+ $conditions = If_Menu::get_conditions();
310
+ $if_menu_enable = get_post_meta( $item_id, 'if_menu_enable' );
311
+ $if_menu_condition_type = get_post_meta( $item_id, 'if_menu_condition_type' );
312
+ $if_menu_condition = get_post_meta( $item_id, 'if_menu_condition' );
313
+ $ifMenuOptions = get_post_meta($item_id, 'if_menu_options');
314
+
315
+ if (!count($if_menu_enable)) {
316
+ $if_menu_enable[] = 0;
317
+ $if_menu_condition_type[] = '';
318
+ $if_menu_condition[] = '';
319
+ }
320
+
321
+ $groupedConditions = array();
322
+ foreach ($conditions as $condition) {
323
+ $groupedConditions[isset($condition['group']) ? $condition['group'] : 'Custom'][] = $condition;
324
+ }
325
+ ?>
326
+
327
+ <p class="if-menu-enable description description-wide">
328
+ <a href="<?php echo admin_url('themes.php?page=if-menu') ?>" class="if-menu-help" title="<?php esc_attr_e('Visibility rule examples', 'if-menu') ?>"><span class="dashicons dashicons-editor-help"></span></a>
329
+ <label>
330
+ <input <?php if (isset($if_menu_enable[0])) checked( $if_menu_enable[0], 1 ) ?> type="checkbox" value="1" class="menu-item-if-menu-enable" name="menu-item-if-menu-enable[<?php echo esc_attr( $item_id ); ?>][]" />
331
+ <?php esc_html_e( 'Change menu item visibility', 'if-menu' ) ?>
332
+ </label>
333
+ </p>
334
+
335
+ <div class="if-menu-conditions" style="display: <?php echo $if_menu_enable[0] ? 'block' : 'none' ?>">
336
+ <?php for ($index = 0; $index < count($if_menu_enable); $index++) : ?>
337
+
338
+ <p class="if-menu-condition description description-wide" data-menu-item-id="<?php echo $item_id ?>">
339
+ <?php
340
+ $selectedCondition = null;
341
+ ?>
342
+ <span class="if-menu-condition-rule">
343
+ <select class="menu-item-if-menu-condition-type" id="edit-menu-item-if-menu-condition-type-<?php echo esc_attr( $item_id ); ?>" name="menu-item-if-menu-condition-type[<?php echo esc_html( $item_id ); ?>][]" data-val="<?php echo esc_html($if_menu_condition_type[$index]) ?>">
344
+ <option <?php selected( 'show', $if_menu_condition_type[$index] ) ?> value="show"><?php esc_html_e( 'Show', 'if-menu' ) ?></option>
345
+ <option <?php selected( 'hide', $if_menu_condition_type[$index] ) ?> value="hide"><?php esc_html_e( 'Hide', 'if-menu' ) ?></option>
346
+ </select>
347
+ <?php esc_html_e( 'if', 'if-menu' ); ?>
348
+ <select class="menu-item-if-menu-condition" id="edit-menu-item-if-menu-condition-<?php echo esc_attr( $item_id ); ?>" name="menu-item-if-menu-condition[<?php echo esc_attr( $item_id ); ?>][]">
349
+ <?php foreach ($groupedConditions as $group => $conditions) : ?>
350
+ <optgroup label="<?php echo esc_attr($group) ?>">
351
+ <?php foreach($conditions as $condition) : ?>
352
+ <?php
353
+ if ($condition['id'] === $if_menu_condition[$index]) {
354
+ $selectedCondition = $condition;
355
+ }
356
+ ?>
357
+ <option value="<?php echo $condition['id'] ?>" <?php selected($condition['id'], $if_menu_condition[$index]) ?> <?php selected($condition['name'], $if_menu_condition[$index]) ?> data-options='<?php if (isset($condition['options'])) echo json_encode($condition['options']) ?>'><?php echo esc_html($condition['name']) . (isset($condition['options']) ? ' &raquo;' : '') ?></option>
358
+ <?php endforeach ?>
359
+ </optgroup>
360
+ <?php endforeach ?>
361
+ </select>
362
+ </span>
363
+ <select class="menu-item-if-menu-enable-next" name="menu-item-if-menu-enable[<?php echo esc_attr( $item_id ); ?>][]">
364
+ <option value="false">+</option>
365
+ <option value="and" <?php if (isset($if_menu_enable[$index + 1])) selected( 'and', $if_menu_enable[$index + 1] ) ?>><?php esc_html_e( 'AND', 'if-menu' ) ?></option>
366
+ <option value="or" <?php if (isset($if_menu_enable[$index + 1])) selected( 'or', $if_menu_enable[$index + 1] ) ?>><?php esc_html_e( 'OR', 'if-menu' ) ?></option>-->
367
+ </select>
368
+ <?php if (isset($selectedCondition['options'])) : ?>
369
+ <select class="menu-item-if-menu-options" name="menu-item-if-menu-options[<?php echo esc_attr($item_id) ?>][<?php echo esc_attr($index) ?>][]" style="width: 305px" multiple>
370
+ <?php foreach ($selectedCondition['options'] as $value => $label) : ?>
371
+ <option value="<?php echo esc_attr($value) ?>" <?php if (in_array($value, $ifMenuOptions[$index])) echo 'selected' ?>><?php echo $label ?></option>
372
+ <?php endforeach ?>
373
+ </select>
374
+ <?php endif ?>
375
+ </p>
376
+
377
+ <?php endfor ?>
378
+ </div>
379
+
380
+ <?php
381
+ }
382
+
383
+ public static function menu_item_title( $item_id ) {
384
+ $if_menu_enabled = get_post_meta( $item_id, 'if_menu_enable' );
385
+
386
+ if ( count( $if_menu_enabled ) && $if_menu_enabled[0] !== '0' ) {
387
+ $conditionTypes = get_post_meta( $item_id, 'if_menu_condition_type' );
388
+ $conditions = get_post_meta( $item_id, 'if_menu_condition' );
389
+ $rules = If_Menu::get_conditions($for_testing = true);
390
+
391
+ if ( $conditionTypes[0] === 'show' ) {
392
+ $conditionTypes[0] = '';
393
+ }
394
+
395
+ echo '<span class="is-submenu">';
396
+ printf( __( '%s if %s', 'if-menu' ), $conditionTypes[0], $rules[$conditions[0]]['name'] );
397
+ if ( count( $if_menu_enabled ) > 1 ) {
398
+ printf( ' ' . _n( 'and %d more rule', 'and %d more rules', count( $if_menu_enabled ) - 1, 'if-menu' ), count( $if_menu_enabled ) - 1 );
399
+ }
400
+ echo '</span>';
401
+ }
402
+ }
403
+
404
+ public static function customWalker($walker) {
405
+ global $wp_version;
406
+
407
+ if (version_compare( $wp_version, '4.7.0', '>=')) {
408
+ require_once(plugin_dir_path(__FILE__) . 'src/if-menu-nav-menu-4.7.php');
409
+ } elseif ( version_compare( $wp_version, '4.5.0', '>=' ) ){
410
+ require_once(plugin_dir_path(__FILE__) . 'src/if-menu-nav-menu-4.5.php');
411
+ } else {
412
+ require_once(plugin_dir_path(__FILE__) . 'src/if-menu-nav-menu.php');
413
+ }
414
+
415
+ return 'If_Menu_Walker_Nav_Menu_Edit';
416
+ }
417
+
418
+ public static function wp_update_nav_menu_item( $menu_id, $menu_item_db_id ) {
419
+ if (isset($_POST['menu-item-if-menu-enable'])) {
420
+
421
+ delete_post_meta($menu_item_db_id, 'if_menu_enable');
422
+ delete_post_meta($menu_item_db_id, 'if_menu_condition_type');
423
+ delete_post_meta($menu_item_db_id, 'if_menu_condition');
424
+ delete_post_meta($menu_item_db_id, 'if_menu_options');
425
+
426
+ foreach ($_POST['menu-item-if-menu-enable'][$menu_item_db_id] as $index => $value) {
427
+ if (in_array( $value, array('1', 'and', 'or'))) {
428
+ add_post_meta($menu_item_db_id, 'if_menu_enable', $value);
429
+ add_post_meta($menu_item_db_id, 'if_menu_condition_type', $_POST['menu-item-if-menu-condition-type'][$menu_item_db_id][$index]);
430
+ add_post_meta($menu_item_db_id, 'if_menu_condition', $_POST['menu-item-if-menu-condition'][$menu_item_db_id][$index]);
431
+ if (isset($_POST['menu-item-if-menu-options']) && isset($_POST['menu-item-if-menu-options'][$menu_item_db_id]) && isset($_POST['menu-item-if-menu-options'][$menu_item_db_id][$index])) {
432
+ add_post_meta($menu_item_db_id, 'if_menu_options', array_unique($_POST['menu-item-if-menu-options'][$menu_item_db_id][$index]));
433
+ } else {
434
+ add_post_meta($menu_item_db_id, 'if_menu_options', 0);
435
+ }
436
+ } else {
437
+ break;
438
+ }
439
+ }
440
+ }
441
+ }
442
+
443
+ public static function apiNonce($action) {
444
+ $nonce = uniqid();
445
+ set_transient('if-menu-nonce-' . $action, $nonce, 600);
446
+ return $nonce;
447
+ }
448
+
449
+ public static function getPlan() {
450
+ if (true || isset($_REQUEST['if-menu-recheck-plan']) || false === ($plan = get_transient('if-menu-plan'))) {
451
+ $plan = false;
452
+ $request = wp_remote_get('https://wordpress.layered.studio/get-plan?site=' . urlencode(site_url()) . '&for=if-menu&_nonce=' . self::apiNonce('plan-check'));
453
+
454
+ if (!is_wp_error($request)) {
455
+ $data = json_decode(wp_remote_retrieve_body($request), true);
456
+ if (isset($data['plans'])) {
457
+ $plan = $data['plans']['if-menu'];
458
+ set_transient('if-menu-plan', $plan, 500);
459
+ }
460
+ }
461
+ }
462
+
463
+ return $plan;
464
+ }
465
+
466
+ public static function restApi() {
467
+ register_rest_route('if-menu/v1', '/did-you-made-this-request', array(
468
+ 'methods' => 'GET',
469
+ 'callback' => function() {
470
+ $action = isset($_REQUEST['action']) ? sanitize_key($_REQUEST['action']) : false;
471
+ $nonce = isset($_REQUEST['nonce']) ? sanitize_key($_REQUEST['nonce']) : false;
472
+ return array('valid' => $action && $nonce && $nonce === get_transient('if-menu-nonce-' . $action));
473
+ }
474
+ ) );
475
+ }
476
+
477
+ public static function pluginActivate() {
478
+ add_option('if-menu-peak', 0);
479
+ }
480
+
481
+ }
482
+
483
+
484
+
485
+ /* ------------------------------------------------
486
+ Include default visibility rules for menu items
487
+ ------------------------------------------------ */
488
+
489
+ include 'src/user-info.php';
490
+ include 'src/conditions-basic.php';
491
+ include 'src/conditions-multiple-options.php';
492
+
493
+
494
+
495
+ /* ------------------------------------------------
496
+ Run the plugin
497
+ ------------------------------------------------ */
498
+
499
+ register_activation_hook(__FILE__, array('If_Menu', 'pluginActivate'));
500
+ add_action('plugins_loaded', 'If_Menu::init');
languages/if-menu-de_DE.mo ADDED
Binary file
languages/if-menu-de_DE.po ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2016 If Menu
2
+ # This file is distributed under the same license as the If Menu package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: If Menu 0.4.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/if-menu\n"
7
+ "POT-Creation-Date: 2016-07-27 11:26+0300\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2016-07-27 11:39+0300\n"
12
+ "Language-Team: \n"
13
+ "X-Generator: Poedit 1.8.8\n"
14
+ "Last-Translator: \n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+ "Language: de\n"
17
+
18
+ #: if-menu.php:138
19
+ msgid "Enable Conditional Logic"
20
+ msgstr "Conditional Logik aktivieren"
21
+
22
+ #: if-menu.php:144
23
+ msgid "Show"
24
+ msgstr "Anzeigen"
25
+
26
+ #: if-menu.php:145
27
+ msgid "Hide"
28
+ msgstr "Verstecken"
29
+
30
+ #: if-menu.php:181
31
+ msgid "AND"
32
+ msgstr "UND"
33
+
34
+ #: if-menu.php:182
35
+ msgid "OR"
36
+ msgstr "ODER"
37
+
38
+ #: if-menu.php:203
39
+ msgid "%s if %s"
40
+ msgstr "%s wenn %s"
41
+
42
+ #: if-menu.php:203
43
+ msgid "and 1 more condition"
44
+ msgstr "und eine weitere Bedingung"
45
+
46
+ #: if-menu.php:203
47
+ msgid "and %d more conditions"
48
+ msgstr "und %d weitere Bedingungen"
49
+
50
+ #: if-menu.php:60
51
+ msgid ""
52
+ "<b>If Menu</b> plugin detected a conflict with another plugin or theme and "
53
+ "may not work as expected. <a href=\"%s\" target=\"_blank\">Read more about "
54
+ "the issue here</a>"
55
+ msgstr ""
56
+
57
+ #. Description of the plugin/theme
58
+ msgid "Show/hide menu items with conditional statements"
59
+ msgstr "Anzeigen/verstecken der Menüpunkte mit bedingten Anweisungen"
languages/if-menu-ro_RO.mo ADDED
Binary file
languages/if-menu-ro_RO.po ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2016 If Menu
2
+ # This file is distributed under the same license as the If Menu package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: If Menu 0.4.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/if-menu\n"
7
+ "POT-Creation-Date: 2016-07-27 11:21+0300\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2016-07-27 11:24+0300\n"
12
+ "Language-Team: \n"
13
+ "X-Generator: Poedit 1.8.8\n"
14
+ "Last-Translator: \n"
15
+ "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!"
16
+ "=0)))?2:1));\n"
17
+ "Language: ro\n"
18
+
19
+ #: if-menu.php:138
20
+ msgid "Enable Conditional Logic"
21
+ msgstr "Foloseste conditii"
22
+
23
+ #: if-menu.php:144
24
+ msgid "Show"
25
+ msgstr "Afiseaza"
26
+
27
+ #: if-menu.php:145
28
+ msgid "Hide"
29
+ msgstr "Ascunde"
30
+
31
+ #: if-menu.php:181
32
+ msgid "AND"
33
+ msgstr "ȘI"
34
+
35
+ #: if-menu.php:182
36
+ msgid "OR"
37
+ msgstr "SAU"
38
+
39
+ #: if-menu.php:203
40
+ msgid "%s if %s"
41
+ msgstr "%s daca %s"
42
+
43
+ #: if-menu.php:203
44
+ msgid "and 1 more condition"
45
+ msgstr "si inca o conditie"
46
+
47
+ #: if-menu.php:203
48
+ msgid "and %d more conditions"
49
+ msgstr "si inca %s conditii"
50
+
51
+ #: if-menu.php:60
52
+ msgid ""
53
+ "<b>If Menu</b> plugin detected a conflict with another plugin or theme and "
54
+ "may not work as expected. <a href=\"%s\" target=\"_blank\">Read more about "
55
+ "the issue here</a>"
56
+ msgstr ""
57
+ "Modulul <b>If Menu</b> a detectat un conflict cu un alt modul sau template "
58
+ "care incearca sa modifice meniuri si e posibil sa nu functioneze cum ar "
59
+ "trebui. <a href=\"%s\" target=\"_blank\">Citeste mai mult despre problema "
60
+ "aici</a>"
61
+
62
+ #. Description of the plugin/theme
63
+ msgid "Show/hide menu items with conditional statements"
64
+ msgstr "Afiseaza sau ascunde meniuri pe baza de conditii"
languages/if-menu.pot ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2016 If Menu
2
+ # This file is distributed under the same license as the If Menu package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: If Menu 0.4.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/if-menu\n"
7
+ "POT-Creation-Date: 2016-07-27 07:34:16+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+
15
+ #: if-menu.php:138
16
+ msgid "Enable Conditional Logic"
17
+ msgstr ""
18
+
19
+ #: if-menu.php:144
20
+ msgid "Show"
21
+ msgstr ""
22
+
23
+ #: if-menu.php:145
24
+ msgid "Hide"
25
+ msgstr ""
26
+
27
+ #: if-menu.php:181
28
+ msgid "AND"
29
+ msgstr ""
30
+
31
+ #: if-menu.php:182
32
+ msgid "OR"
33
+ msgstr ""
34
+
35
+ #: if-menu.php:203
36
+ msgid "%s if %s"
37
+ msgstr ""
38
+
39
+ #: if-menu.php:203
40
+ msgid "and 1 more condition"
41
+ msgstr ""
42
+
43
+ #: if-menu.php:203
44
+ msgid "and %d more conditions"
45
+ msgstr ""
46
+
47
+ #: if-menu.php:60
48
+ msgid "<b>If Menu</b> plugin detected a conflict with another plugin or theme and may not work as expected. <a href=\"%s\" target=\"_blank\">Read more about the issue here</a>"
49
+ msgstr ""
50
+
51
+ #. Description of the plugin/theme
52
+ msgid "Show/hide menu items with conditional statements"
53
+ msgstr ""
readme.md ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ If Menu
2
+ =========
3
+
4
+ **If Menu** is a WordPress plugin which adds extra functionality for menu items, making it easy to hide or display menu items based on user-defined rules. Example:
5
+
6
+ * Display a menu item only if current `User is logged in`
7
+ * Hide menu items if `visiting from mobile device`
8
+ * Display menu items just for `Admins and Editors`
9
+
10
+ The plugin is easy to use, each menu item will have a “Change menu item visibility” option which will enable the selection of rules.
11
+
12
+
13
+ ## Features
14
+
15
+ * Basic set of visibility rules
16
+ * User state `User is logged in`
17
+ * User roles `Admin` `Editor` `Author` etc
18
+ * Page type `Front page` `Single page` `Single post`
19
+ * Device `Is Mobile`
20
+ * Language `Is RTL`
21
+ * Multiple rules - mix multiple rules for a menu item visibility
22
+ * show if `User is logged in` AND `Device is mobile`
23
+ * show if `User is Admin` AND `Is front page`
24
+ * Support for adding your custom rules
25
+
26
+
27
+
28
+ ## Adding custom visibility rules in a plugin or theme
29
+
30
+ Custom visibility rules can be added easily by any plugin or theme.
31
+ Example of adding a new rule for displaying/hiding a menu item when current page is a custom-post-type.
32
+
33
+ ```
34
+ // theme's functions.php or plugin file
35
+ add_filter('if_menu_conditions', 'my_new_menu_conditions');
36
+
37
+ function my_new_menu_conditions($conditions) {
38
+
39
+ $conditions[] = array(
40
+ 'id' => 'single-my-custom-post-type', // unique ID for the condition
41
+ 'name' => __('Single my-CPT', 'i18n-domain'), // name of the condition
42
+ 'condition' => function($item) { // callback - must return Boolean
43
+ return is_singular('my-custom-post-type');
44
+ }
45
+ );
46
+
47
+ return $conditions;
48
+ }
49
+ ```
50
+
51
+
52
+
53
+ ## WordPress.org
54
+
55
+ Head over to [plugin's page on WordPress.org](https://wordpress.org/plugins/if-menu/) for more info, reviews and support
readme.txt CHANGED
@@ -1,80 +1,202 @@
1
- === If Menu ===
2
- Contributors: andrei.igna
3
- Tags: menu, if, conditional, statements, hide, show, dispaly
4
- Requires at least: 3.7
5
- Tested up to: 3.9.1
6
- Stable tag: trunk
7
- License: GPL2
8
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
-
10
- Show/hide menu items with conditional statements
11
-
12
- == Description ==
13
-
14
- Simple plugin that adds extra functionality to Menu Items. The plugin will allow to show or hide menu items based on condition statements (Is single page, User is Logged In, etc).
15
-
16
- The management is very easy, each menu item will have a "Enable Conditional Logic" check that will allow to select a conditional statement (Example in Screenshots)
17
-
18
- Basic conditional statements are included in the plugin, other will be included in future releases or can be added by another plugins or themes.
19
-
20
- Example of adding a new conditional statement is described in the FAQ section
21
-
22
- == Installation ==
23
-
24
- To install the plugin, follow the steps below
25
-
26
- 1. Upload `if-menu` to the `/wp-content/plugins/` directory
27
- 2. Activate the plugin through the 'Plugins' menu in WordPress
28
- 3. Enable conditional statements for your Menu Items in Appearance -> Menus page
29
-
30
- == Frequently Asked Questions ==
31
-
32
- = How can I add a conditinal statement for menu items? =
33
-
34
- New conditional statements can be added by any other plugins or themes.
35
-
36
- Example of adding a new conditional statement for disaplying/hiding a menu item when current page is a custom-post-type.
37
-
38
- `
39
- // theme's functions.php or plugin file
40
- add_filter( 'if_menu_conditions', 'my_new_menu_conditions' );
41
-
42
- function my_new_menu_conditions( $conditions ) {
43
- $conditions[] = array(
44
- 'name' => 'If single custom-post-type', // name of the condition
45
- 'condition' => function($item) { // callback - must return TRUE or FALSE
46
- return is_singular( 'my-custom-post-type' );
47
- }
48
- );
49
-
50
- return $conditions;
51
- }
52
- `
53
-
54
- = Where do I find conditional functions? =
55
-
56
- WordPress provides [a lot of functions](http://codex.wordpress.org/Conditional_Tags) which can be used to create conditional statements for almost any combination that a theme/plugin developer can think of.
57
-
58
- == Screenshots ==
59
-
60
- 1. Enable conditional statements for Menu Items
61
-
62
- == Changelog ==
63
-
64
- = 0.2.1 =
65
-
66
- Minor fixes
67
-
68
- * [Fix](https://twitter.com/joesegal/status/480386235249082368) - Editing menus - show/hide conditions when adding new item (thanks [Joseph Segal](https://twitter.com/joesegal))
69
-
70
- = 0.2 =
71
-
72
- Update for compatibility with newer versions of WordPress
73
-
74
- * [Feature](http://wordpress.org/support/topic/new-feature-power-to-the-conditions) - access to menu item object in condition callback (thanks [BramNL](http://wordpress.org/support/profile/bramnl))
75
- * [Fix](http://wordpress.org/support/topic/save-is-requested-before-leaving-menu-page) - alert for leaving page even if no changes were made for menus (thanks [Denny](http://wordpress.org/support/profile/ddahly))
76
- * Fix - update method in `Walker_Nav_Menu_Edit` to be compatible with newer version of WP
77
- * [Fix](http://wordpress.org/support/topic/bugfix-for-readmetxt) - example in Readme (thanks [BramNL](http://wordpress.org/support/profile/bramnl))
78
-
79
- = 0.1 =
80
- * Plugin release. Included basic menu conditional statements
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === If Menu ===
2
+ Contributors: andrei.igna
3
+ Tags: menu, visibility, roles, rules, hide, if, nav menu
4
+ Requires at least: 4
5
+ Tested up to: 4.9
6
+ Stable tag: trunk
7
+ License: GPL2
8
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
+
10
+ Display tailored menu items to each visitor with visibility rules
11
+
12
+ == Description ==
13
+
14
+ Display tailored menu items to each visitor, based on visibility rules. Here are a few examples:
15
+
16
+ * Display a menu item only if current `User is logged in`
17
+ * Hide menu items if `Device is mobile`
18
+ * Display menu items for `Admins and Editors`
19
+ * Hide Login or Register links for `Logged in Users`
20
+ * Display menu items for `Users from US and UK`
21
+
22
+ The plugin is easy to use, each menu item will have a new option “Change menu item visibility” which will enable the selection of rules (example in Screenshots)
23
+
24
+ ## Features
25
+
26
+ * Basic set of visibility rules
27
+ * User state `User is logged in`
28
+ * User roles `Admin` `Editor` `Author` etc
29
+ * Page type `Front page` `Single page` `Single post`
30
+ * Visitor device `Is Mobile`
31
+ * Advanced visibility rules - requires Premium plan
32
+ * Visitor location - detect visitor's Country
33
+ * 3rd-party plugin integrations - WooCommerce Subscriptions, Groups, WishList Member
34
+ * Multiple rules - mix multiple rules for a menu item visibility
35
+ * show if `User is logged in` AND `Device is mobile`
36
+ * show if `User is Admin` AND `Is front page`
37
+ * Support for adding your custom rules
38
+
39
+ Example of adding a new visibility rule is described in the FAQ section
40
+
41
+ == Installation ==
42
+
43
+ To install the plugin, follow the steps below
44
+
45
+ 1. Upload `if-menu` to the `/wp-content/plugins/` directory
46
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
47
+ 3. Enable visibility rules for your Menu Items in Appearance -> Menus page
48
+
49
+ == Frequently Asked Questions ==
50
+
51
+ = If Menu is broken, no visibility rules are available =
52
+
53
+ The code for modifying the menu items is limited and if other plugins/themes try to alter the menu items, this plugin will break.
54
+
55
+ This is an ongoing [issue with WordPress](http://core.trac.wordpress.org/ticket/18584) which hopefully will be fixed in a future release.
56
+
57
+ Try to use just one plugin that changes functionality for menu items.
58
+
59
+
60
+ = How can I add a custom visibility rule for menu items? =
61
+
62
+ New rules can be added by any other plugin or theme.
63
+
64
+ Example of adding a new custom rule for displaying/hiding a menu item when current page is a custom-post-type.
65
+
66
+ `
67
+ // theme's functions.php or plugin file
68
+ add_filter('if_menu_conditions', 'my_new_menu_conditions');
69
+
70
+ function my_new_menu_conditions($conditions) {
71
+ $conditions[] = array(
72
+ 'id' => 'single-my-custom-post-type', // unique ID for the rule
73
+ 'name' => __('Single my-custom-post-type', 'i18n-domain'), // name of the rule
74
+ 'condition' => function($item) { // callback - must return Boolean
75
+ return is_singular('my-custom-post-type');
76
+ }
77
+ );
78
+
79
+ return $conditions;
80
+ }
81
+ `
82
+
83
+ = Where can I find conditional functions? =
84
+
85
+ WordPress provides [a lot of functions](http://codex.wordpress.org/Conditional_Tags) which can be used to create custom rules for almost any combination that a theme/plugin developer can think of.
86
+
87
+ = Who made that really cool icon =
88
+
89
+ Got the icons from here https://dribbble.com/shots/1045549-Light-Switches-PSD, so giving the credit to Louie Mantia
90
+
91
+ == Screenshots ==
92
+
93
+ 1. Enable visibility rules for Menu Items
94
+ 2. Example of visibility rules
95
+
96
+ == Changelog ==
97
+
98
+ = 0.8.3 =
99
+ *Release Date - 22 February 2018*
100
+
101
+ * Fixed - Support for PHP <= 5.3, fixes error
102
+
103
+ = 0.8.2 =
104
+ *Release Date - 20 February 2018*
105
+
106
+ * Fixed - Support for older visibilty rule names, fixes PHP warning
107
+
108
+ = 0.8.1 =
109
+ *Release Date - 20 February 2018*
110
+
111
+ * Fixed - Better options checking, fixes PHP warning
112
+
113
+ = 0.8 =
114
+ *Release Date - 19 February 2018*
115
+
116
+ * Added - Visibility rules with multiple options. Requires Premium plan
117
+ * Added - Visibility rule - User country
118
+ * Added - Visibility rule - Is Super Admin on MultiSite
119
+ * Added - Visibility rule - User is in Group, integration with [Groups](https://wordpress.org/plugins/groups/) plugin
120
+ * Added - Visibility rule - User has subscription, integration with [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) plugin
121
+ * Added - Visibility rule - User membership level, integration with [WishList Member](https://member.wishlistproducts.com/) plugin
122
+ * Updated - Better conflict detection for Nav_Menu Walker
123
+ * Fixed - translation strings & function used
124
+
125
+ = 0.7 =
126
+ *Release Date - 18 September 2017*
127
+
128
+ * Enhancement - Nicer styling for visibility rules
129
+ * Added - Peek option - Let admins preview hidden menu items
130
+ * Added - Settings page
131
+
132
+ = 0.6.3 =
133
+ *Release Date - 17 August 2017*
134
+
135
+ * New visibility rule - Language Is RTL
136
+ * Fix - Single rule works on servers with Eval disabled
137
+
138
+ = 0.6.2 =
139
+ *Release Date - 8 August 2017*
140
+
141
+ * Fix - Backwards compatibility with PHP < 5.4
142
+
143
+ = 0.6.1 =
144
+ *Release Date - 7 August 2017*
145
+
146
+ * Improvement - Change labels & texts for easier use
147
+ * Improvement - Better compatibility with latest versions of WordPress
148
+ * Improvement - Better compatibility with translation plugins
149
+ * Fix - Detection for conflict with other plugins
150
+
151
+ = 0.6 =
152
+ *Release Date - 27 August 2016*
153
+
154
+ * Improvement - Dynamic conditions based on default & custom user roles (added by plugins or themes) [thanks Daniele](https://wordpress.org/support/topic/feature-request-custom-roles)
155
+ * Improvement - Grouped conditions by User, Page or other types
156
+ * Fix - Filter menu items in admin section
157
+ * Fix - Better menu items filter saving code
158
+
159
+ = 0.5 =
160
+ *Release Date - 20 August 2016*
161
+
162
+ * Improvement - Support for WordPress 4.6
163
+ * Feature - New condition checking logged in user for current site in Multi Site [requested here](https://wordpress.org/support/topic/multi-site-user-is-logged-in-conditi
164
+ on)
165
+ * Feature - Added support for multi conditions [thanks for this ideea](https://wordpress.org/support/topic/more-than-one-condition-operators-1)
166
+ * Improvement - RO & DE translations
167
+
168
+ = 0.4.1 =
169
+ *Release Date - 13 December 2015*
170
+
171
+ * Fix - Fixes [issue](https://wordpress.org/support/topic/cant-add-items-to-menu-with-plugin-enabled) with adding new menu items
172
+
173
+ = 0.4 =
174
+ *Release Date - 29 November 2015*
175
+
176
+ * Improved compatibility with other plugins/themes using a [shared action hook for menu item fields](https://core.trac.wordpress.org/ticket/18584#comment:37)
177
+ * Enhancement - show visibility status in menu item titles
178
+
179
+ = 0.3 =
180
+
181
+ Small update
182
+
183
+ * Plugin icon
184
+ * Set as compatible with WordPress 4
185
+
186
+ = 0.2.1 =
187
+
188
+ Minor fixes
189
+
190
+ * [Fix](https://twitter.com/joesegal/status/480386235249082368) - Editing menus - show/hide conditions when adding new item (thanks [Joseph Segal](https://twitter.com/joesegal))
191
+
192
+ = 0.2 =
193
+
194
+ Update for compatibility with newer versions of WordPress
195
+
196
+ * [Feature](http://wordpress.org/support/topic/new-feature-power-to-the-conditions) - access to menu item object in condition callback (thanks [BramNL](http://wordpress.org/support/profile/bramnl))
197
+ * [Fix](http://wordpress.org/support/topic/save-is-requested-before-leaving-menu-page) - alert for leaving page even if no changes were made for menus (thanks [Denny](http://wordpress.org/support/profile/ddahly))
198
+ * Fix - update method in `Walker_Nav_Menu_Edit` to be compatible with newer version of WP
199
+ * [Fix](http://wordpress.org/support/topic/bugfix-for-readmetxt) - example in Readme (thanks [BramNL](http://wordpress.org/support/profile/bramnl))
200
+
201
+ = 0.1 =
202
+ * Plugin release. Included basic menu conditional statements
src/conditions-basic.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ add_filter('if_menu_conditions', 'if_menu_basic_conditions');
4
+
5
+ function if_menu_basic_conditions($conditions) {
6
+ global $wp_roles;
7
+
8
+
9
+ // User roles
10
+ foreach ($wp_roles->role_names as $roleId => $role) {
11
+ $conditions[] = array(
12
+ 'id' => 'user-is-' . $roleId,
13
+ 'name' => sprintf(__('Is %s', 'if-menu'), $role),
14
+ 'alias' => sprintf(__('User is %s', 'if-menu'), $role),
15
+ 'condition' => function() use($roleId) {
16
+ global $current_user;
17
+ return is_user_logged_in() && in_array($roleId, $current_user->roles);
18
+ },
19
+ 'group' => __('User', 'if-menu')
20
+ );
21
+ }
22
+
23
+ if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE === true) {
24
+ $conditions[] = array(
25
+ 'id' => 'user-is-super-admin',
26
+ 'name' => sprintf(__('Is %s', 'if-menu'), 'Super Admin'),
27
+ 'condition' => 'is_super_admin',
28
+ 'group' => __('User', 'if-menu')
29
+ );
30
+ }
31
+
32
+
33
+ // User state
34
+ $conditions[] = array(
35
+ 'id' => 'user-logged-in',
36
+ 'name' => __('Is logged in', 'if-menu'),
37
+ 'alias' => __('User is logged in', 'if-menu'),
38
+ 'condition' => 'is_user_logged_in',
39
+ 'group' => __('User', 'if-menu')
40
+ );
41
+
42
+ if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE === true) {
43
+ $conditions[] = array(
44
+ 'id' => 'user-logged-in-current-site',
45
+ 'name' => __('Is logged in for current site', 'if-menu'),
46
+ 'condition' => function() {
47
+ return current_user_can('read');
48
+ },
49
+ 'group' => __('User', 'if-menu')
50
+ );
51
+ }
52
+
53
+
54
+ // Page type
55
+ $conditions[] = array(
56
+ 'id' => 'front-page',
57
+ 'name' => __('Front Page', 'if-menu'),
58
+ 'condition' => 'is_front_page',
59
+ 'group' => __('Page type', 'if-menu')
60
+ );
61
+
62
+ $conditions[] = array(
63
+ 'id' => 'single-post',
64
+ 'name' => __('Single Post', 'if-menu'),
65
+ 'condition' => 'is_single',
66
+ 'group' => __('Page type', 'if-menu')
67
+ );
68
+
69
+ $conditions[] = array(
70
+ 'id' => 'single-page',
71
+ 'name' => __('Page', 'if-menu'),
72
+ 'condition' => 'is_page',
73
+ 'group' => __('Page type', 'if-menu')
74
+ );
75
+
76
+
77
+ // Devices
78
+ $conditions[] = array(
79
+ 'id' => 'is-mobile',
80
+ 'name' => __('Mobile', 'if-menu'),
81
+ 'condition' => 'wp_is_mobile',
82
+ 'group' => __('Device', 'if-menu')
83
+ );
84
+
85
+
86
+ // Language
87
+ $conditions[] = array(
88
+ 'id' => 'language-is-rtl',
89
+ 'name' => __('Is RTL', 'if-menu'),
90
+ 'condition' => 'is_rtl',
91
+ 'group' => __('Language', 'if-menu')
92
+ );
93
+
94
+
95
+ return $conditions;
96
+ }
src/conditions-multiple-options.php ADDED
@@ -0,0 +1,366 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ add_filter('if_menu_conditions', 'ifMenuAdvancedConditions');
4
+
5
+ function ifMenuAdvancedConditions($conditions) {
6
+ $activePlugins = apply_filters('active_plugins', get_option('active_plugins'));
7
+
8
+
9
+ // User location
10
+ $conditions[] = array(
11
+ 'id' => 'user-location',
12
+ 'name' => __('From country', 'if-menu'),
13
+ 'options' => array(
14
+ 'AF' => __( 'Afghanistan', 'if-menu' ),
15
+ 'AX' => __( '&#197;land Islands', 'if-menu' ),
16
+ 'AL' => __( 'Albania', 'if-menu' ),
17
+ 'DZ' => __( 'Algeria', 'if-menu' ),
18
+ 'AS' => __( 'American Samoa', 'if-menu' ),
19
+ 'AD' => __( 'Andorra', 'if-menu' ),
20
+ 'AO' => __( 'Angola', 'if-menu' ),
21
+ 'AI' => __( 'Anguilla', 'if-menu' ),
22
+ 'AQ' => __( 'Antarctica', 'if-menu' ),
23
+ 'AG' => __( 'Antigua and Barbuda', 'if-menu' ),
24
+ 'AR' => __( 'Argentina', 'if-menu' ),
25
+ 'AM' => __( 'Armenia', 'if-menu' ),
26
+ 'AW' => __( 'Aruba', 'if-menu' ),
27
+ 'AU' => __( 'Australia', 'if-menu' ),
28
+ 'AT' => __( 'Austria', 'if-menu' ),
29
+ 'AZ' => __( 'Azerbaijan', 'if-menu' ),
30
+ 'BS' => __( 'Bahamas', 'if-menu' ),
31
+ 'BH' => __( 'Bahrain', 'if-menu' ),
32
+ 'BD' => __( 'Bangladesh', 'if-menu' ),
33
+ 'BB' => __( 'Barbados', 'if-menu' ),
34
+ 'BY' => __( 'Belarus', 'if-menu' ),
35
+ 'BE' => __( 'Belgium', 'if-menu' ),
36
+ 'PW' => __( 'Belau', 'if-menu' ),
37
+ 'BZ' => __( 'Belize', 'if-menu' ),
38
+ 'BJ' => __( 'Benin', 'if-menu' ),
39
+ 'BM' => __( 'Bermuda', 'if-menu' ),
40
+ 'BT' => __( 'Bhutan', 'if-menu' ),
41
+ 'BO' => __( 'Bolivia', 'if-menu' ),
42
+ 'BQ' => __( 'Bonaire, Saint Eustatius and Saba', 'if-menu' ),
43
+ 'BA' => __( 'Bosnia and Herzegovina', 'if-menu' ),
44
+ 'BW' => __( 'Botswana', 'if-menu' ),
45
+ 'BV' => __( 'Bouvet Island', 'if-menu' ),
46
+ 'BR' => __( 'Brazil', 'if-menu' ),
47
+ 'IO' => __( 'British Indian Ocean Territory', 'if-menu' ),
48
+ 'VG' => __( 'British Virgin Islands', 'if-menu' ),
49
+ 'BN' => __( 'Brunei', 'if-menu' ),
50
+ 'BG' => __( 'Bulgaria', 'if-menu' ),
51
+ 'BF' => __( 'Burkina Faso', 'if-menu' ),
52
+ 'BI' => __( 'Burundi', 'if-menu' ),
53
+ 'KH' => __( 'Cambodia', 'if-menu' ),
54
+ 'CM' => __( 'Cameroon', 'if-menu' ),
55
+ 'CA' => __( 'Canada', 'if-menu' ),
56
+ 'CV' => __( 'Cape Verde', 'if-menu' ),
57
+ 'KY' => __( 'Cayman Islands', 'if-menu' ),
58
+ 'CF' => __( 'Central African Republic', 'if-menu' ),
59
+ 'TD' => __( 'Chad', 'if-menu' ),
60
+ 'CL' => __( 'Chile', 'if-menu' ),
61
+ 'CN' => __( 'China', 'if-menu' ),
62
+ 'CX' => __( 'Christmas Island', 'if-menu' ),
63
+ 'CC' => __( 'Cocos (Keeling) Islands', 'if-menu' ),
64
+ 'CO' => __( 'Colombia', 'if-menu' ),
65
+ 'KM' => __( 'Comoros', 'if-menu' ),
66
+ 'CG' => __( 'Congo (Brazzaville)', 'if-menu' ),
67
+ 'CD' => __( 'Congo (Kinshasa)', 'if-menu' ),
68
+ 'CK' => __( 'Cook Islands', 'if-menu' ),
69
+ 'CR' => __( 'Costa Rica', 'if-menu' ),
70
+ 'HR' => __( 'Croatia', 'if-menu' ),
71
+ 'CU' => __( 'Cuba', 'if-menu' ),
72
+ 'CW' => __( 'Cura&ccedil;ao', 'if-menu' ),
73
+ 'CY' => __( 'Cyprus', 'if-menu' ),
74
+ 'CZ' => __( 'Czech Republic', 'if-menu' ),
75
+ 'DK' => __( 'Denmark', 'if-menu' ),
76
+ 'DJ' => __( 'Djibouti', 'if-menu' ),
77
+ 'DM' => __( 'Dominica', 'if-menu' ),
78
+ 'DO' => __( 'Dominican Republic', 'if-menu' ),
79
+ 'EC' => __( 'Ecuador', 'if-menu' ),
80
+ 'EG' => __( 'Egypt', 'if-menu' ),
81
+ 'SV' => __( 'El Salvador', 'if-menu' ),
82
+ 'GQ' => __( 'Equatorial Guinea', 'if-menu' ),
83
+ 'ER' => __( 'Eritrea', 'if-menu' ),
84
+ 'EE' => __( 'Estonia', 'if-menu' ),
85
+ 'ET' => __( 'Ethiopia', 'if-menu' ),
86
+ 'FK' => __( 'Falkland Islands', 'if-menu' ),
87
+ 'FO' => __( 'Faroe Islands', 'if-menu' ),
88
+ 'FJ' => __( 'Fiji', 'if-menu' ),
89
+ 'FI' => __( 'Finland', 'if-menu' ),
90
+ 'FR' => __( 'France', 'if-menu' ),
91
+ 'GF' => __( 'French Guiana', 'if-menu' ),
92
+ 'PF' => __( 'French Polynesia', 'if-menu' ),
93
+ 'TF' => __( 'French Southern Territories', 'if-menu' ),
94
+ 'GA' => __( 'Gabon', 'if-menu' ),
95
+ 'GM' => __( 'Gambia', 'if-menu' ),
96
+ 'GE' => __( 'Georgia', 'if-menu' ),
97
+ 'DE' => __( 'Germany', 'if-menu' ),
98
+ 'GH' => __( 'Ghana', 'if-menu' ),
99
+ 'GI' => __( 'Gibraltar', 'if-menu' ),
100
+ 'GR' => __( 'Greece', 'if-menu' ),
101
+ 'GL' => __( 'Greenland', 'if-menu' ),
102
+ 'GD' => __( 'Grenada', 'if-menu' ),
103
+ 'GP' => __( 'Guadeloupe', 'if-menu' ),
104
+ 'GU' => __( 'Guam', 'if-menu' ),
105
+ 'GT' => __( 'Guatemala', 'if-menu' ),
106
+ 'GG' => __( 'Guernsey', 'if-menu' ),
107
+ 'GN' => __( 'Guinea', 'if-menu' ),
108
+ 'GW' => __( 'Guinea-Bissau', 'if-menu' ),
109
+ 'GY' => __( 'Guyana', 'if-menu' ),
110
+ 'HT' => __( 'Haiti', 'if-menu' ),
111
+ 'HM' => __( 'Heard Island and McDonald Islands', 'if-menu' ),
112
+ 'HN' => __( 'Honduras', 'if-menu' ),
113
+ 'HK' => __( 'Hong Kong', 'if-menu' ),
114
+ 'HU' => __( 'Hungary', 'if-menu' ),
115
+ 'IS' => __( 'Iceland', 'if-menu' ),
116
+ 'IN' => __( 'India', 'if-menu' ),
117
+ 'ID' => __( 'Indonesia', 'if-menu' ),
118
+ 'IR' => __( 'Iran', 'if-menu' ),
119
+ 'IQ' => __( 'Iraq', 'if-menu' ),
120
+ 'IE' => __( 'Ireland', 'if-menu' ),
121
+ 'IM' => __( 'Isle of Man', 'if-menu' ),
122
+ 'IL' => __( 'Israel', 'if-menu' ),
123
+ 'IT' => __( 'Italy', 'if-menu' ),
124
+ 'CI' => __( 'Ivory Coast', 'if-menu' ),
125
+ 'JM' => __( 'Jamaica', 'if-menu' ),
126
+ 'JP' => __( 'Japan', 'if-menu' ),
127
+ 'JE' => __( 'Jersey', 'if-menu' ),
128
+ 'JO' => __( 'Jordan', 'if-menu' ),
129
+ 'KZ' => __( 'Kazakhstan', 'if-menu' ),
130
+ 'KE' => __( 'Kenya', 'if-menu' ),
131
+ 'KI' => __( 'Kiribati', 'if-menu' ),
132
+ 'KW' => __( 'Kuwait', 'if-menu' ),
133
+ 'KG' => __( 'Kyrgyzstan', 'if-menu' ),
134
+ 'LA' => __( 'Laos', 'if-menu' ),
135
+ 'LV' => __( 'Latvia', 'if-menu' ),
136
+ 'LB' => __( 'Lebanon', 'if-menu' ),
137
+ 'LS' => __( 'Lesotho', 'if-menu' ),
138
+ 'LR' => __( 'Liberia', 'if-menu' ),
139
+ 'LY' => __( 'Libya', 'if-menu' ),
140
+ 'LI' => __( 'Liechtenstein', 'if-menu' ),
141
+ 'LT' => __( 'Lithuania', 'if-menu' ),
142
+ 'LU' => __( 'Luxembourg', 'if-menu' ),
143
+ 'MO' => __( 'Macao S.A.R., China', 'if-menu' ),
144
+ 'MK' => __( 'Macedonia', 'if-menu' ),
145
+ 'MG' => __( 'Madagascar', 'if-menu' ),
146
+ 'MW' => __( 'Malawi', 'if-menu' ),
147
+ 'MY' => __( 'Malaysia', 'if-menu' ),
148
+ 'MV' => __( 'Maldives', 'if-menu' ),
149
+ 'ML' => __( 'Mali', 'if-menu' ),
150
+ 'MT' => __( 'Malta', 'if-menu' ),
151
+ 'MH' => __( 'Marshall Islands', 'if-menu' ),
152
+ 'MQ' => __( 'Martinique', 'if-menu' ),
153
+ 'MR' => __( 'Mauritania', 'if-menu' ),
154
+ 'MU' => __( 'Mauritius', 'if-menu' ),
155
+ 'YT' => __( 'Mayotte', 'if-menu' ),
156
+ 'MX' => __( 'Mexico', 'if-menu' ),
157
+ 'FM' => __( 'Micronesia', 'if-menu' ),
158
+ 'MD' => __( 'Moldova', 'if-menu' ),
159
+ 'MC' => __( 'Monaco', 'if-menu' ),
160
+ 'MN' => __( 'Mongolia', 'if-menu' ),
161
+ 'ME' => __( 'Montenegro', 'if-menu' ),
162
+ 'MS' => __( 'Montserrat', 'if-menu' ),
163
+ 'MA' => __( 'Morocco', 'if-menu' ),
164
+ 'MZ' => __( 'Mozambique', 'if-menu' ),
165
+ 'MM' => __( 'Myanmar', 'if-menu' ),
166
+ 'NA' => __( 'Namibia', 'if-menu' ),
167
+ 'NR' => __( 'Nauru', 'if-menu' ),
168
+ 'NP' => __( 'Nepal', 'if-menu' ),
169
+ 'NL' => __( 'Netherlands', 'if-menu' ),
170
+ 'NC' => __( 'New Caledonia', 'if-menu' ),
171
+ 'NZ' => __( 'New Zealand', 'if-menu' ),
172
+ 'NI' => __( 'Nicaragua', 'if-menu' ),
173
+ 'NE' => __( 'Niger', 'if-menu' ),
174
+ 'NG' => __( 'Nigeria', 'if-menu' ),
175
+ 'NU' => __( 'Niue', 'if-menu' ),
176
+ 'NF' => __( 'Norfolk Island', 'if-menu' ),
177
+ 'MP' => __( 'Northern Mariana Islands', 'if-menu' ),
178
+ 'KP' => __( 'North Korea', 'if-menu' ),
179
+ 'NO' => __( 'Norway', 'if-menu' ),
180
+ 'OM' => __( 'Oman', 'if-menu' ),
181
+ 'PK' => __( 'Pakistan', 'if-menu' ),
182
+ 'PS' => __( 'Palestinian Territory', 'if-menu' ),
183
+ 'PA' => __( 'Panama', 'if-menu' ),
184
+ 'PG' => __( 'Papua New Guinea', 'if-menu' ),
185
+ 'PY' => __( 'Paraguay', 'if-menu' ),
186
+ 'PE' => __( 'Peru', 'if-menu' ),
187
+ 'PH' => __( 'Philippines', 'if-menu' ),
188
+ 'PN' => __( 'Pitcairn', 'if-menu' ),
189
+ 'PL' => __( 'Poland', 'if-menu' ),
190
+ 'PT' => __( 'Portugal', 'if-menu' ),
191
+ 'PR' => __( 'Puerto Rico', 'if-menu' ),
192
+ 'QA' => __( 'Qatar', 'if-menu' ),
193
+ 'RE' => __( 'Reunion', 'if-menu' ),
194
+ 'RO' => __( 'Romania', 'if-menu' ),
195
+ 'RU' => __( 'Russia', 'if-menu' ),
196
+ 'RW' => __( 'Rwanda', 'if-menu' ),
197
+ 'BL' => __( 'Saint Barth&eacute;lemy', 'if-menu' ),
198
+ 'SH' => __( 'Saint Helena', 'if-menu' ),
199
+ 'KN' => __( 'Saint Kitts and Nevis', 'if-menu' ),
200
+ 'LC' => __( 'Saint Lucia', 'if-menu' ),
201
+ 'MF' => __( 'Saint Martin (French part)', 'if-menu' ),
202
+ 'SX' => __( 'Saint Martin (Dutch part)', 'if-menu' ),
203
+ 'PM' => __( 'Saint Pierre and Miquelon', 'if-menu' ),
204
+ 'VC' => __( 'Saint Vincent and the Grenadines', 'if-menu' ),
205
+ 'SM' => __( 'San Marino', 'if-menu' ),
206
+ 'ST' => __( 'S&atilde;o Tom&eacute; and Pr&iacute;ncipe', 'if-menu' ),
207
+ 'SA' => __( 'Saudi Arabia', 'if-menu' ),
208
+ 'SN' => __( 'Senegal', 'if-menu' ),
209
+ 'RS' => __( 'Serbia', 'if-menu' ),
210
+ 'SC' => __( 'Seychelles', 'if-menu' ),
211
+ 'SL' => __( 'Sierra Leone', 'if-menu' ),
212
+ 'SG' => __( 'Singapore', 'if-menu' ),
213
+ 'SK' => __( 'Slovakia', 'if-menu' ),
214
+ 'SI' => __( 'Slovenia', 'if-menu' ),
215
+ 'SB' => __( 'Solomon Islands', 'if-menu' ),
216
+ 'SO' => __( 'Somalia', 'if-menu' ),
217
+ 'ZA' => __( 'South Africa', 'if-menu' ),
218
+ 'GS' => __( 'South Georgia/Sandwich Islands', 'if-menu' ),
219
+ 'KR' => __( 'South Korea', 'if-menu' ),
220
+ 'SS' => __( 'South Sudan', 'if-menu' ),
221
+ 'ES' => __( 'Spain', 'if-menu' ),
222
+ 'LK' => __( 'Sri Lanka', 'if-menu' ),
223
+ 'SD' => __( 'Sudan', 'if-menu' ),
224
+ 'SR' => __( 'Suriname', 'if-menu' ),
225
+ 'SJ' => __( 'Svalbard and Jan Mayen', 'if-menu' ),
226
+ 'SZ' => __( 'Swaziland', 'if-menu' ),
227
+ 'SE' => __( 'Sweden', 'if-menu' ),
228
+ 'CH' => __( 'Switzerland', 'if-menu' ),
229
+ 'SY' => __( 'Syria', 'if-menu' ),
230
+ 'TW' => __( 'Taiwan', 'if-menu' ),
231
+ 'TJ' => __( 'Tajikistan', 'if-menu' ),
232
+ 'TZ' => __( 'Tanzania', 'if-menu' ),
233
+ 'TH' => __( 'Thailand', 'if-menu' ),
234
+ 'TL' => __( 'Timor-Leste', 'if-menu' ),
235
+ 'TG' => __( 'Togo', 'if-menu' ),
236
+ 'TK' => __( 'Tokelau', 'if-menu' ),
237
+ 'TO' => __( 'Tonga', 'if-menu' ),
238
+ 'TT' => __( 'Trinidad and Tobago', 'if-menu' ),
239
+ 'TN' => __( 'Tunisia', 'if-menu' ),
240
+ 'TR' => __( 'Turkey', 'if-menu' ),
241
+ 'TM' => __( 'Turkmenistan', 'if-menu' ),
242
+ 'TC' => __( 'Turks and Caicos Islands', 'if-menu' ),
243
+ 'TV' => __( 'Tuvalu', 'if-menu' ),
244
+ 'UG' => __( 'Uganda', 'if-menu' ),
245
+ 'UA' => __( 'Ukraine', 'if-menu' ),
246
+ 'AE' => __( 'United Arab Emirates', 'if-menu' ),
247
+ 'GB' => __( 'United Kingdom (UK)', 'if-menu' ),
248
+ 'US' => __( 'United States (US)', 'if-menu' ),
249
+ 'UM' => __( 'United States (US) Minor Outlying Islands', 'if-menu' ),
250
+ 'VI' => __( 'United States (US) Virgin Islands', 'if-menu' ),
251
+ 'UY' => __( 'Uruguay', 'if-menu' ),
252
+ 'UZ' => __( 'Uzbekistan', 'if-menu' ),
253
+ 'VU' => __( 'Vanuatu', 'if-menu' ),
254
+ 'VA' => __( 'Vatican', 'if-menu' ),
255
+ 'VE' => __( 'Venezuela', 'if-menu' ),
256
+ 'VN' => __( 'Vietnam', 'if-menu' ),
257
+ 'WF' => __( 'Wallis and Futuna', 'if-menu' ),
258
+ 'EH' => __( 'Western Sahara', 'if-menu' ),
259
+ 'WS' => __( 'Samoa', 'if-menu' ),
260
+ 'YE' => __( 'Yemen', 'if-menu' ),
261
+ 'ZM' => __( 'Zambia', 'if-menu' ),
262
+ 'ZW' => __( 'Zimbabwe', 'if-menu' ),
263
+ ),
264
+ 'condition' => function($item, $selectedOptions = array()) {
265
+ return in_array(get_user_country_code(), $selectedOptions);
266
+ },
267
+ 'group' => __('User', 'if-menu')
268
+ );
269
+
270
+
271
+ // Third-party plugin integration - Groups
272
+ if (in_array('groups/groups.php', $activePlugins) && class_exists('Groups_Group')) {
273
+ $groupOptions = array();
274
+ foreach (Groups_Group::get_groups() as $group) {
275
+ $groupOptions[$group->group_id] = $group->name;
276
+ }
277
+
278
+ $conditions[] = array(
279
+ 'id' => 'user-in-group',
280
+ 'name' => __('Is in group', 'if-menu'),
281
+ 'condition' => function($item, $selectedGroups = array()) {
282
+ $isInGroup = false;
283
+ $groupsUser = new Groups_User(get_current_user_id());
284
+ foreach ($selectedGroups as $groupId) {
285
+ if ($groupsUser->is_member($groupId)) {
286
+ $isInGroup = true;
287
+ }
288
+ }
289
+ return $isInGroup;
290
+ },
291
+ 'options' => $groupOptions,
292
+ 'group' => __('User', 'if-menu')
293
+ );
294
+ }
295
+
296
+
297
+ // Third-party plugin integration - WooCommerce Subscriptions
298
+ if (in_array('woocommerce-subscriptions/woocommerce-subscriptions.php', $activePlugins)) {
299
+ $subscriptionsOptions = array();
300
+
301
+ $subscriptions = get_posts(array(
302
+ 'numberposts' => -1,
303
+ 'post_type' => array('product', 'product-variation'),
304
+ 'post_status' => 'publish',
305
+ 'tax_query' => array(array(
306
+ 'taxonomy' => 'product_type',
307
+ 'field' => 'slug',
308
+ 'terms' => array('subscription', 'variable-subscription')
309
+ ))
310
+ ));
311
+
312
+ foreach ($subscriptions as $subscription) {
313
+ $subscriptionsOptions[$subscription->ID] = $subscription->post_title;
314
+ }
315
+
316
+ $conditions[] = array(
317
+ 'id' => 'woocommerce-subscriptions',
318
+ 'name' => __('Has active subscription', 'if-menu'),
319
+ 'condition' => function($item, $selectedSubscriptions = array()) {
320
+ $hasSubscription = false;
321
+
322
+ foreach ($selectedSubscriptions as $subscriptionId) {
323
+ if (wcs_user_has_subscription(0, $subscriptionId, 'active')) {
324
+ $hasSubscription = true;
325
+ }
326
+ }
327
+
328
+ return $hasSubscription;
329
+ },
330
+ 'options' => $subscriptionsOptions,
331
+ 'group' => __('User', 'if-menu')
332
+ );
333
+ }
334
+
335
+
336
+ // Third-party plugin integration - WishList Member
337
+ if (function_exists('wlmapi_the_levels')) {
338
+ $membershipLevelOptions = array();
339
+ $wishlistMembershipLevels = wlmapi_the_levels();
340
+
341
+ foreach ($wishlistMembershipLevels['levels']['level'] as $level) {
342
+ $membershipLevelOptions[$level['id']] = $level['name'];
343
+ }
344
+
345
+ $conditions[] = array(
346
+ 'id' => 'wishlist-member',
347
+ 'name' => __('WishList Membership Level', 'if-menu'),
348
+ 'condition' => function($item, $membershipLevels = array()) {
349
+ $hasAccess = false;
350
+ $userId = get_current_user_id();
351
+
352
+ foreach ($membershipLevels as $level) {
353
+ if (wlmapi_is_user_a_member($level, $userId)) {
354
+ $hasAccess = true;
355
+ }
356
+ }
357
+
358
+ return $hasAccess;
359
+ },
360
+ 'group' => __('User', 'if-menu')
361
+ );
362
+ }
363
+
364
+
365
+ return $conditions;
366
+ }
src/if-menu-nav-menu-4.5.php ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Create HTML list of nav menu input items.
5
+ *
6
+ * @package WordPress
7
+ * @since 3.0.0
8
+ * @uses Walker_Nav_Menu
9
+ */
10
+ class If_Menu_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {
11
+
12
+ /**
13
+ * Start the element output.
14
+ *
15
+ * @see Walker_Nav_Menu::start_el()
16
+ * @since 3.0.0
17
+ *
18
+ * @global int $_wp_nav_menu_max_depth
19
+ *
20
+ * @param string $output Passed by reference. Used to append additional content.
21
+ * @param object $item Menu item data object.
22
+ * @param int $depth Depth of menu item. Used for padding.
23
+ * @param array $args Not used.
24
+ * @param int $id Not used.
25
+ */
26
+ public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
27
+ global $_wp_nav_menu_max_depth;
28
+ $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
29
+
30
+ ob_start();
31
+ $item_id = esc_attr( $item->ID );
32
+ $removed_args = array(
33
+ 'action',
34
+ 'customlink-tab',
35
+ 'edit-menu-item',
36
+ 'menu-item',
37
+ 'page-tab',
38
+ '_wpnonce',
39
+ );
40
+
41
+ $original_title = '';
42
+ if ( 'taxonomy' == $item->type ) {
43
+ $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
44
+ if ( is_wp_error( $original_title ) )
45
+ $original_title = false;
46
+ } elseif ( 'post_type' == $item->type ) {
47
+ $original_object = get_post( $item->object_id );
48
+ $original_title = get_the_title( $original_object->ID );
49
+ } elseif ( 'post_type_archive' == $item->type ) {
50
+ $original_object = get_post_type_object( $item->object );
51
+ if ( $original_object ) {
52
+ $original_title = $original_object->labels->archives;
53
+ }
54
+ }
55
+
56
+ $classes = array(
57
+ 'menu-item menu-item-depth-' . $depth,
58
+ 'menu-item-' . esc_attr( $item->object ),
59
+ 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
60
+ );
61
+
62
+ $title = $item->title;
63
+
64
+ if ( ! empty( $item->_invalid ) ) {
65
+ $classes[] = 'menu-item-invalid';
66
+ /* translators: %s: title of menu item which is invalid */
67
+ $title = sprintf( __( '%s (Invalid)' ), $item->title );
68
+ } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
69
+ $classes[] = 'pending';
70
+ /* translators: %s: title of menu item in draft status */
71
+ $title = sprintf( __('%s (Pending)'), $item->title );
72
+ }
73
+
74
+ $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;
75
+
76
+ $submenu_text = '';
77
+ if ( 0 == $depth )
78
+ $submenu_text = 'style="display: none;"';
79
+
80
+ ?>
81
+ <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
82
+ <div class="menu-item-bar">
83
+ <div class="menu-item-handle">
84
+ <span class="item-title">
85
+ <span class="menu-item-title"><?php echo esc_html( $title ); ?></span>
86
+ <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span>
87
+ <?php
88
+ // This is the added section
89
+ do_action( 'wp_nav_menu_item_custom_title', $item_id, $item, $depth, $args );
90
+ // end added section
91
+ ?>
92
+ </span>
93
+ <span class="item-controls">
94
+ <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
95
+ <span class="item-order hide-if-js">
96
+ <a href="<?php
97
+ echo wp_nonce_url(
98
+ add_query_arg(
99
+ array(
100
+ 'action' => 'move-up-menu-item',
101
+ 'menu-item' => $item_id,
102
+ ),
103
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
104
+ ),
105
+ 'move-menu_item'
106
+ );
107
+ ?>" class="item-move-up" aria-label="<?php esc_attr_e( 'Move up' ) ?>">&#8593;</a>
108
+ |
109
+ <a href="<?php
110
+ echo wp_nonce_url(
111
+ add_query_arg(
112
+ array(
113
+ 'action' => 'move-down-menu-item',
114
+ 'menu-item' => $item_id,
115
+ ),
116
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
117
+ ),
118
+ 'move-menu_item'
119
+ );
120
+ ?>" class="item-move-down" aria-label="<?php esc_attr_e( 'Move down' ) ?>">&#8595;</a>
121
+ </span>
122
+ <a class="item-edit" id="edit-<?php echo $item_id; ?>" href="<?php
123
+ echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
124
+ ?>" aria-label="<?php esc_attr_e( 'Edit menu item' ); ?>"><?php _e( 'Edit' ); ?></a>
125
+ </span>
126
+ </div>
127
+ </div>
128
+
129
+ <div class="menu-item-settings wp-clearfix" id="menu-item-settings-<?php echo $item_id; ?>">
130
+ <?php if ( 'custom' == $item->type ) : ?>
131
+ <p class="field-url description description-wide">
132
+ <label for="edit-menu-item-url-<?php echo $item_id; ?>">
133
+ <?php _e( 'URL' ); ?><br />
134
+ <input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
135
+ </label>
136
+ </p>
137
+ <?php endif; ?>
138
+ <p class="description description-wide">
139
+ <label for="edit-menu-item-title-<?php echo $item_id; ?>">
140
+ <?php _e( 'Navigation Label' ); ?><br />
141
+ <input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
142
+ </label>
143
+ </p>
144
+ <p class="field-title-attribute field-attr-title description description-wide">
145
+ <label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
146
+ <?php _e( 'Title Attribute' ); ?><br />
147
+ <input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
148
+ </label>
149
+ </p>
150
+ <p class="field-link-target description">
151
+ <label for="edit-menu-item-target-<?php echo $item_id; ?>">
152
+ <input type="checkbox" id="edit-menu-item-target-<?php echo $item_id; ?>" value="_blank" name="menu-item-target[<?php echo $item_id; ?>]"<?php checked( $item->target, '_blank' ); ?> />
153
+ <?php _e( 'Open link in a new tab' ); ?>
154
+ </label>
155
+ </p>
156
+ <p class="field-css-classes description description-thin">
157
+ <label for="edit-menu-item-classes-<?php echo $item_id; ?>">
158
+ <?php _e( 'CSS Classes (optional)' ); ?><br />
159
+ <input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
160
+ </label>
161
+ </p>
162
+ <p class="field-xfn description description-thin">
163
+ <label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
164
+ <?php _e( 'Link Relationship (XFN)' ); ?><br />
165
+ <input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
166
+ </label>
167
+ </p>
168
+ <p class="field-description description description-wide">
169
+ <label for="edit-menu-item-description-<?php echo $item_id; ?>">
170
+ <?php _e( 'Description' ); ?><br />
171
+ <textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
172
+ <span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
173
+ </label>
174
+ </p>
175
+
176
+ <?php
177
+ // This is the added section
178
+ do_action( 'wp_nav_menu_item_custom_fields', $item_id, $item, $depth, $args );
179
+ // end added section
180
+ ?>
181
+
182
+ <p class="field-move hide-if-no-js description description-wide">
183
+ <label>
184
+ <span><?php _e( 'Move' ); ?></span>
185
+ <a href="#" class="menus-move menus-move-up" data-dir="up"><?php _e( 'Up one' ); ?></a>
186
+ <a href="#" class="menus-move menus-move-down" data-dir="down"><?php _e( 'Down one' ); ?></a>
187
+ <a href="#" class="menus-move menus-move-left" data-dir="left"></a>
188
+ <a href="#" class="menus-move menus-move-right" data-dir="right"></a>
189
+ <a href="#" class="menus-move menus-move-top" data-dir="top"><?php _e( 'To the top' ); ?></a>
190
+ </label>
191
+ </p>
192
+
193
+ <div class="menu-item-actions description-wide submitbox">
194
+ <?php if ( 'custom' != $item->type && $original_title !== false ) : ?>
195
+ <p class="link-to-original">
196
+ <?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
197
+ </p>
198
+ <?php endif; ?>
199
+ <a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="<?php
200
+ echo wp_nonce_url(
201
+ add_query_arg(
202
+ array(
203
+ 'action' => 'delete-menu-item',
204
+ 'menu-item' => $item_id,
205
+ ),
206
+ admin_url( 'nav-menus.php' )
207
+ ),
208
+ 'delete-menu_item_' . $item_id
209
+ ); ?>"><?php _e( 'Remove' ); ?></a> <span class="meta-sep hide-if-no-js"> | </span> <a class="item-cancel submitcancel hide-if-no-js" id="cancel-<?php echo $item_id; ?>" href="<?php echo esc_url( add_query_arg( array( 'edit-menu-item' => $item_id, 'cancel' => time() ), admin_url( 'nav-menus.php' ) ) );
210
+ ?>#menu-item-settings-<?php echo $item_id; ?>"><?php _e('Cancel'); ?></a>
211
+ </div>
212
+
213
+ <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
214
+ <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
215
+ <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
216
+ <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
217
+ <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
218
+ <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
219
+ </div><!-- .menu-item-settings-->
220
+ <ul class="menu-item-transport"></ul>
221
+ <?php
222
+ $output .= ob_get_clean();
223
+ }
224
+
225
+ } // Walker_Nav_Menu_Edit
src/if-menu-nav-menu-4.7.php ADDED
@@ -0,0 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Create HTML list of nav menu input items.
5
+ *
6
+ * @package WordPress
7
+ * @since 3.0.0
8
+ * @uses Walker_Nav_Menu
9
+ */
10
+ class If_Menu_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {
11
+
12
+ /**
13
+ * Start the element output.
14
+ *
15
+ * @see Walker_Nav_Menu::start_el()
16
+ * @since 3.0.0
17
+ *
18
+ * @global int $_wp_nav_menu_max_depth
19
+ *
20
+ * @param string $output Passed by reference. Used to append additional content.
21
+ * @param object $item Menu item data object.
22
+ * @param int $depth Depth of menu item. Used for padding.
23
+ * @param array $args Not used.
24
+ * @param int $id Not used.
25
+ */
26
+ public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
27
+ global $_wp_nav_menu_max_depth;
28
+ $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
29
+ ob_start();
30
+ $item_id = esc_attr( $item->ID );
31
+ $removed_args = array(
32
+ 'action',
33
+ 'customlink-tab',
34
+ 'edit-menu-item',
35
+ 'menu-item',
36
+ 'page-tab',
37
+ '_wpnonce',
38
+ );
39
+ $original_title = false;
40
+ if ( 'taxonomy' == $item->type ) {
41
+ $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
42
+ if ( is_wp_error( $original_title ) )
43
+ $original_title = false;
44
+ } elseif ( 'post_type' == $item->type ) {
45
+ $original_object = get_post( $item->object_id );
46
+ $original_title = get_the_title( $original_object->ID );
47
+ } elseif ( 'post_type_archive' == $item->type ) {
48
+ $original_object = get_post_type_object( $item->object );
49
+ if ( $original_object ) {
50
+ $original_title = $original_object->labels->archives;
51
+ }
52
+ }
53
+ $classes = array(
54
+ 'menu-item menu-item-depth-' . $depth,
55
+ 'menu-item-' . esc_attr( $item->object ),
56
+ 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
57
+ );
58
+ $title = $item->title;
59
+ if ( ! empty( $item->_invalid ) ) {
60
+ $classes[] = 'menu-item-invalid';
61
+ /* translators: %s: title of menu item which is invalid */
62
+ $title = sprintf( __( '%s (Invalid)' ), $item->title );
63
+ } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
64
+ $classes[] = 'pending';
65
+ /* translators: %s: title of menu item in draft status */
66
+ $title = sprintf( __('%s (Pending)'), $item->title );
67
+ }
68
+ $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;
69
+ $submenu_text = '';
70
+ if ( 0 == $depth )
71
+ $submenu_text = 'style="display: none;"';
72
+ ?>
73
+ <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
74
+ <div class="menu-item-bar">
75
+ <div class="menu-item-handle">
76
+ <span class="item-title">
77
+ <span class="menu-item-title"><?php echo esc_html( $title ); ?></span>
78
+ <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span>
79
+ <?php
80
+ // This is the added section
81
+ do_action( 'wp_nav_menu_item_custom_title', $item_id, $item, $depth, $args );
82
+ // end added section
83
+ ?>
84
+ </span>
85
+ <span class="item-controls">
86
+ <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
87
+ <span class="item-order hide-if-js">
88
+ <a href="<?php
89
+ echo wp_nonce_url(
90
+ add_query_arg(
91
+ array(
92
+ 'action' => 'move-up-menu-item',
93
+ 'menu-item' => $item_id,
94
+ ),
95
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
96
+ ),
97
+ 'move-menu_item'
98
+ );
99
+ ?>" class="item-move-up" aria-label="<?php esc_attr_e( 'Move up' ) ?>">&#8593;</a>
100
+ |
101
+ <a href="<?php
102
+ echo wp_nonce_url(
103
+ add_query_arg(
104
+ array(
105
+ 'action' => 'move-down-menu-item',
106
+ 'menu-item' => $item_id,
107
+ ),
108
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
109
+ ),
110
+ 'move-menu_item'
111
+ );
112
+ ?>" class="item-move-down" aria-label="<?php esc_attr_e( 'Move down' ) ?>">&#8595;</a>
113
+ </span>
114
+ <a class="item-edit" id="edit-<?php echo $item_id; ?>" href="<?php
115
+ echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
116
+ ?>" aria-label="<?php esc_attr_e( 'Edit menu item' ); ?>"><?php _e( 'Edit' ); ?></a>
117
+ </span>
118
+ </div>
119
+ </div>
120
+
121
+ <div class="menu-item-settings wp-clearfix" id="menu-item-settings-<?php echo $item_id; ?>">
122
+ <?php if ( 'custom' == $item->type ) : ?>
123
+ <p class="field-url description description-wide">
124
+ <label for="edit-menu-item-url-<?php echo $item_id; ?>">
125
+ <?php _e( 'URL' ); ?><br />
126
+ <input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
127
+ </label>
128
+ </p>
129
+ <?php endif; ?>
130
+ <p class="description description-wide">
131
+ <label for="edit-menu-item-title-<?php echo $item_id; ?>">
132
+ <?php _e( 'Navigation Label' ); ?><br />
133
+ <input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
134
+ </label>
135
+ </p>
136
+ <p class="field-title-attribute field-attr-title description description-wide">
137
+ <label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
138
+ <?php _e( 'Title Attribute' ); ?><br />
139
+ <input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
140
+ </label>
141
+ </p>
142
+ <p class="field-link-target description">
143
+ <label for="edit-menu-item-target-<?php echo $item_id; ?>">
144
+ <input type="checkbox" id="edit-menu-item-target-<?php echo $item_id; ?>" value="_blank" name="menu-item-target[<?php echo $item_id; ?>]"<?php checked( $item->target, '_blank' ); ?> />
145
+ <?php _e( 'Open link in a new tab' ); ?>
146
+ </label>
147
+ </p>
148
+ <p class="field-css-classes description description-thin">
149
+ <label for="edit-menu-item-classes-<?php echo $item_id; ?>">
150
+ <?php _e( 'CSS Classes (optional)' ); ?><br />
151
+ <input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
152
+ </label>
153
+ </p>
154
+ <p class="field-xfn description description-thin">
155
+ <label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
156
+ <?php _e( 'Link Relationship (XFN)' ); ?><br />
157
+ <input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
158
+ </label>
159
+ </p>
160
+ <p class="field-description description description-wide">
161
+ <label for="edit-menu-item-description-<?php echo $item_id; ?>">
162
+ <?php _e( 'Description' ); ?><br />
163
+ <textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
164
+ <span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
165
+ </label>
166
+ </p>
167
+
168
+ <?php
169
+ // This is the added section
170
+ do_action( 'wp_nav_menu_item_custom_fields', $item_id, $item, $depth, $args );
171
+ // end added section
172
+ ?>
173
+
174
+ <fieldset class="field-move hide-if-no-js description description-wide">
175
+ <span class="field-move-visual-label" aria-hidden="true"><?php _e( 'Move' ); ?></span>
176
+ <button type="button" class="button-link menus-move menus-move-up" data-dir="up"><?php _e( 'Up one' ); ?></button>
177
+ <button type="button" class="button-link menus-move menus-move-down" data-dir="down"><?php _e( 'Down one' ); ?></button>
178
+ <button type="button" class="button-link menus-move menus-move-left" data-dir="left"></button>
179
+ <button type="button" class="button-link menus-move menus-move-right" data-dir="right"></button>
180
+ <button type="button" class="button-link menus-move menus-move-top" data-dir="top"><?php _e( 'To the top' ); ?></button>
181
+ </fieldset>
182
+
183
+ <div class="menu-item-actions description-wide submitbox">
184
+ <?php if ( 'custom' != $item->type && $original_title !== false ) : ?>
185
+ <p class="link-to-original">
186
+ <?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
187
+ </p>
188
+ <?php endif; ?>
189
+ <a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="<?php
190
+ echo wp_nonce_url(
191
+ add_query_arg(
192
+ array(
193
+ 'action' => 'delete-menu-item',
194
+ 'menu-item' => $item_id,
195
+ ),
196
+ admin_url( 'nav-menus.php' )
197
+ ),
198
+ 'delete-menu_item_' . $item_id
199
+ ); ?>"><?php _e( 'Remove' ); ?></a> <span class="meta-sep hide-if-no-js"> | </span> <a class="item-cancel submitcancel hide-if-no-js" id="cancel-<?php echo $item_id; ?>" href="<?php echo esc_url( add_query_arg( array( 'edit-menu-item' => $item_id, 'cancel' => time() ), admin_url( 'nav-menus.php' ) ) );
200
+ ?>#menu-item-settings-<?php echo $item_id; ?>"><?php _e('Cancel'); ?></a>
201
+ </div>
202
+
203
+ <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
204
+ <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
205
+ <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
206
+ <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
207
+ <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
208
+ <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
209
+ </div><!-- .menu-item-settings-->
210
+ <ul class="menu-item-transport"></ul>
211
+ <?php
212
+ $output .= ob_get_clean();
213
+ }
214
+
215
+ } // Walker_Nav_Menu_Edit
src/if-menu-nav-menu.php ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Create HTML list of nav menu input items.
5
+ *
6
+ * @package WordPress
7
+ * @since 3.0.0
8
+ * @uses Walker_Nav_Menu
9
+ */
10
+ class If_Menu_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {
11
+
12
+ /**
13
+ * Start the element output.
14
+ *
15
+ * @see Walker_Nav_Menu::start_el()
16
+ * @since 3.0.0
17
+ *
18
+ * @global int $_wp_nav_menu_max_depth
19
+ *
20
+ * @param string $output Passed by reference. Used to append additional content.
21
+ * @param object $item Menu item data object.
22
+ * @param int $depth Depth of menu item. Used for padding.
23
+ * @param array $args Not used.
24
+ * @param int $id Not used.
25
+ */
26
+ public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
27
+ global $_wp_nav_menu_max_depth;
28
+ $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
29
+
30
+ ob_start();
31
+ $item_id = esc_attr( $item->ID );
32
+ $removed_args = array(
33
+ 'action',
34
+ 'customlink-tab',
35
+ 'edit-menu-item',
36
+ 'menu-item',
37
+ 'page-tab',
38
+ '_wpnonce',
39
+ );
40
+
41
+ $original_title = '';
42
+ if ( 'taxonomy' == $item->type ) {
43
+ $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
44
+ if ( is_wp_error( $original_title ) )
45
+ $original_title = false;
46
+ } elseif ( 'post_type' == $item->type ) {
47
+ $original_object = get_post( $item->object_id );
48
+ $original_title = get_the_title( $original_object->ID );
49
+ }
50
+
51
+ $classes = array(
52
+ 'menu-item menu-item-depth-' . $depth,
53
+ 'menu-item-' . esc_attr( $item->object ),
54
+ 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
55
+ );
56
+
57
+ $title = $item->title;
58
+
59
+ if ( ! empty( $item->_invalid ) ) {
60
+ $classes[] = 'menu-item-invalid';
61
+ /* translators: %s: title of menu item which is invalid */
62
+ $title = sprintf( __( '%s (Invalid)' ), $item->title );
63
+ } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
64
+ $classes[] = 'pending';
65
+ /* translators: %s: title of menu item in draft status */
66
+ $title = sprintf( __('%s (Pending)'), $item->title );
67
+ }
68
+
69
+ $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;
70
+
71
+ $submenu_text = '';
72
+ if ( 0 == $depth )
73
+ $submenu_text = 'style="display: none;"';
74
+
75
+ ?>
76
+ <li id="menu-item-<?php echo esc_attr( $item_id ); ?>" class="<?php echo esc_attr( implode(' ', $classes ) ); ?>">
77
+ <div class="menu-item-bar">
78
+ <div class="menu-item-handle">
79
+ <span class="item-title">
80
+ <span class="menu-item-title"><?php echo esc_html( $title ); ?></span>
81
+ <span class="is-submenu" <?php echo $submenu_text; ?>><?php esc_html_e( 'sub item' ); ?></span>
82
+
83
+ <?php
84
+ // This is the added section
85
+ do_action( 'wp_nav_menu_item_custom_title', $item_id, $item, $depth, $args );
86
+ // end added section
87
+ ?>
88
+ </span>
89
+ <span class="item-controls">
90
+ <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
91
+ <span class="item-order hide-if-js">
92
+ <a href="<?php
93
+ echo esc_url( wp_nonce_url(
94
+ add_query_arg(
95
+ array(
96
+ 'action' => 'move-up-menu-item',
97
+ 'menu-item' => $item_id,
98
+ ),
99
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
100
+ ),
101
+ 'move-menu_item'
102
+ ) );
103
+ ?>" class="item-move-up"><abbr title="<?php esc_attr_e('Move up'); ?>">&#8593;</abbr></a>
104
+ |
105
+ <a href="<?php
106
+ echo esc_url( wp_nonce_url(
107
+ add_query_arg(
108
+ array(
109
+ 'action' => 'move-down-menu-item',
110
+ 'menu-item' => $item_id,
111
+ ),
112
+ remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
113
+ ) ),
114
+ 'move-menu_item'
115
+ );
116
+ ?>" class="item-move-down"><abbr title="<?php esc_attr_e('Move down'); ?>">&#8595;</abbr></a>
117
+ </span>
118
+ <a class="item-edit" id="edit-<?php echo esc_attr( $item_id ); ?>" title="<?php esc_attr_e('Edit Menu Item'); ?>" href="<?php
119
+ echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
120
+ ?>"><?php esc_html_e( 'Edit Menu Item' ); ?></a>
121
+ </span>
122
+ </div>
123
+ </div>
124
+
125
+ <div class="menu-item-settings" id="menu-item-settings-<?php echo esc_attr( $item_id ); ?>">
126
+ <?php if ( 'custom' == $item->type ) : ?>
127
+ <p class="field-url description description-wide">
128
+ <label for="edit-menu-item-url-<?php echo esc_attr( $item_id ); ?>">
129
+ <?php esc_html_e( 'URL' ); ?><br />
130
+ <input type="text" id="edit-menu-item-url-<?php echo esc_attr( $item_id ); ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
131
+ </label>
132
+ </p>
133
+ <?php endif; ?>
134
+ <p class="description description-wide">
135
+ <label for="edit-menu-item-title-<?php echo esc_attr( $item_id ); ?>">
136
+ <?php esc_html_e( 'Navigation Label' ); ?><br />
137
+ <input type="text" id="edit-menu-item-title-<?php echo esc( $item_id ); ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
138
+ </label>
139
+ </p>
140
+ <p class="field-title-attribute description description-wide">
141
+ <label for="edit-menu-item-attr-title-<?php echo esc_attr($item_id); ?>">
142
+ <?php esc_html_e( 'Title Attribute' ); ?><br />
143
+ <input type="text" id="edit-menu-item-attr-title-<?php echo esc_attr($item_id); ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
144
+ </label>
145
+ </p>
146
+ <p class="field-link-target description">
147
+ <label for="edit-menu-item-target-<?php echo esc_attr($item_id); ?>">
148
+ <input type="checkbox" id="edit-menu-item-target-<?php echo esc_attr( $item_id ); ?>" value="_blank" name="menu-item-target[<?php echo esc_attr( $item_id ); ?>]"<?php checked( $item->target, '_blank' ); ?> />
149
+ <?php esc_html_e( 'Open link in a new window/tab' ); ?>
150
+ </label>
151
+ </p>
152
+ <p class="field-css-classes description description-thin">
153
+ <label for="edit-menu-item-classes-<?php echo esc_attr( $item_id ); ?>">
154
+ <?php esc_html_e( 'CSS Classes (optional)' ); ?><br />
155
+ <input type="text" id="edit-menu-item-classes-<?php echo esc_attr( $item_id ); ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
156
+ </label>
157
+ </p>
158
+ <p class="field-xfn description description-thin">
159
+ <label for="edit-menu-item-xfn-<?php echo esc_attr( $item_id ); ?>">
160
+ <?php esc_html_e( 'Link Relationship (XFN)' ); ?><br />
161
+ <input type="text" id="edit-menu-item-xfn-<?php echo esc_attr( $item_id ); ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
162
+ </label>
163
+ </p>
164
+ <p class="field-description description description-wide">
165
+ <label for="edit-menu-item-description-<?php echo esc_attr( $item_id ); ?>">
166
+ <?php esc_html_e( 'Description' ); ?><br />
167
+ <textarea id="edit-menu-item-description-<?php echo esc_attr( $item_id ); ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo esc_attr( $item_id ); ?>]"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
168
+ <span class="description"><?php esc_html_e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
169
+ </label>
170
+ </p>
171
+
172
+ <?php
173
+ // This is the added section
174
+ do_action( 'wp_nav_menu_item_custom_fields', $item_id, $item, $depth, $args );
175
+ // end added section
176
+ ?>
177
+
178
+ <p class="field-move hide-if-no-js description description-wide">
179
+ <label>
180
+ <span><?php esc_html_e( 'Move' ); ?></span>
181
+ <a href="#" class="menus-move menus-move-up" data-dir="up"><?php esc_html_e( 'Up one' ); ?></a>
182
+ <a href="#" class="menus-move menus-move-down" data-dir="down"><?php esc_html_e( 'Down one' ); ?></a>
183
+ <a href="#" class="menus-move menus-move-left" data-dir="left"></a>
184
+ <a href="#" class="menus-move menus-move-right" data-dir="right"></a>
185
+ <a href="#" class="menus-move menus-move-top" data-dir="top"><?php esc_html_e( 'To the top' ); ?></a>
186
+ </label>
187
+ </p>
188
+
189
+ <div class="menu-item-actions description-wide submitbox">
190
+ <?php if ( 'custom' != $item->type && $original_title !== false ) : ?>
191
+ <p class="link-to-original">
192
+ <?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
193
+ </p>
194
+ <?php endif; ?>
195
+ <a class="item-delete submitdelete deletion" id="delete-<?php echo esc_attr( $item_id ); ?>" href="<?php
196
+ echo esc_url( wp_nonce_url(
197
+ add_query_arg(
198
+ array(
199
+ 'action' => 'delete-menu-item',
200
+ 'menu-item' => $item_id,
201
+ ),
202
+ admin_url( 'nav-menus.php' )
203
+ ),
204
+ 'delete-menu_item_' . $item_id
205
+ ) ); ?>"><?php esc_html_e( 'Remove' ); ?></a> <span class="meta-sep hide-if-no-js"> | </span> <a class="item-cancel submitcancel hide-if-no-js" id="cancel-<?php echo esc_attr( $item_id ); ?>" href="<?php echo esc_url( add_query_arg( array( 'edit-menu-item' => $item_id, 'cancel' => time() ), admin_url( 'nav-menus.php' ) ) );
206
+ ?>#menu-item-settings-<?php echo esc_attr( $item_id ); ?>"><?php esc_html_e('Cancel'); ?></a>
207
+ </div>
208
+
209
+ <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item_id ); ?>" />
210
+ <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
211
+ <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
212
+ <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
213
+ <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
214
+ <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo esc_attr( $item_id ); ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
215
+ </div><!-- .menu-item-settings-->
216
+ <ul class="menu-item-transport"></ul>
217
+ <?php
218
+ $output .= ob_get_clean();
219
+ }
220
+
221
+ } // Walker_Nav_Menu_Edit
src/user-info.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ // Get visitor's IP
5
+
6
+ if (!function_exists('get_user_ip')) {
7
+ function get_user_ip() {
8
+ return apply_filters('user_ip', '');
9
+ }
10
+ }
11
+
12
+ add_filter('user_ip', 'if_menu_user_ip');
13
+
14
+ function if_menu_user_ip($ip = '') {
15
+ if (empty($ip)) {
16
+ foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
17
+ if (array_key_exists($key, $_SERVER) === true) {
18
+ foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) {
19
+ if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
20
+ return $ip;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
26
+
27
+ return $ip;
28
+ }
29
+
30
+
31
+
32
+ // Get visitor's Country Code, ex: US, ES, etc / XX or empty = Unknown
33
+
34
+ if (!function_exists('get_user_country_code')) {
35
+ function get_user_country_code() {
36
+ return strtoupper(apply_filters('user_country_code', ''));
37
+ }
38
+ }
39
+
40
+ add_filter('user_country_code', 'if_menu_user_country_code_woocommerce');
41
+ add_filter('user_country_code', 'if_menu_user_country_code_cloudflare');
42
+ add_filter('user_country_code', 'if_menu_user_country_code_appengine');
43
+ add_filter('user_country_code', 'if_menu_user_country_code_cloudfront');
44
+ add_filter('user_country_code', 'if_menu_user_country_code_geoip');
45
+ add_filter('user_country_code', 'if_menu_user_country_code_blueapis');
46
+
47
+ function if_menu_user_country_code_woocommerce($countryCode = '') {
48
+ if (!$countryCode && class_exists('WC_Geolocation')) {
49
+ $location = WC_Geolocation::geolocate_ip();
50
+ if ($location['country'] && !in_array($location['country'], array('A1', 'A2', 'EU', 'AP'))) {
51
+ $countryCode = $location['country'];
52
+ }
53
+ }
54
+
55
+ return $countryCode;
56
+ }
57
+
58
+ function if_menu_user_country_code_cloudflare($countryCode = '') {
59
+ if (!$countryCode && isset($_SERVER['HTTP_CF_IPCOUNTRY']) && $_SERVER['HTTP_CF_IPCOUNTRY'] && $_SERVER['HTTP_CF_IPCOUNTRY'] !== 'XX') {
60
+ $countryCode = $_SERVER['HTTP_CF_IPCOUNTRY'];
61
+ }
62
+
63
+ return $countryCode;
64
+ }
65
+
66
+ function if_menu_user_country_code_appengine($countryCode = '') {
67
+ if (!$countryCode && isset($_SERVER['X-AppEngine-country']) && $_SERVER['X-AppEngine-country'] && $_SERVER['X-AppEngine-country'] !== 'ZZ') {
68
+ $countryCode = $_SERVER['X-AppEngine-country'];
69
+ }
70
+
71
+ return $countryCode;
72
+ }
73
+
74
+ function if_menu_user_country_code_cloudfront($countryCode = '') {
75
+ if (!$countryCode && isset($_SERVER['CloudFront-Viewer-Country']) && $_SERVER['CloudFront-Viewer-Country']) {
76
+ $countryCode = $_SERVER['CloudFront-Viewer-Country'];
77
+ }
78
+
79
+ return $countryCode;
80
+ }
81
+
82
+ function if_menu_user_country_code_geoip($countryCode = '') {
83
+ if (!$countryCode && isset($_SERVER['GEOIP_COUNTRY_CODE']) && $_SERVER['GEOIP_COUNTRY_CODE'] && !in_array($_SERVER['GEOIP_COUNTRY_CODE'], array('A1', 'A2', 'EU', 'AP'))) {
84
+ $countryCode = $_SERVER['GEOIP_COUNTRY_CODE'];
85
+ }
86
+
87
+ if (!$countryCode && isset($_SERVER['HTTP_X_COUNTRY_CODE']) && $_SERVER['HTTP_X_COUNTRY_CODE']) {
88
+ $countryCode = $_SERVER['HTTP_X_COUNTRY_CODE'];
89
+ }
90
+
91
+ return $countryCode;
92
+ }
93
+
94
+ function if_menu_user_country_code_blueapis($countryCode = '') {
95
+ if (!$countryCode) {
96
+ $ip = get_user_ip();
97
+
98
+ if (false === ($countryCode = get_transient('ip-country-code-' . sanitize_key($ip)))) {
99
+ $request = wp_remote_get('https://apis.blue/ip/' . $ip . '?key=layered-if-menu');
100
+ $data = json_decode(wp_remote_retrieve_body($request) ?: '[]');
101
+ if (isset($data->country) && $data->country) {
102
+ $countryCode = $data->country;
103
+ set_transient('ip-country-code-' . sanitize_key($ip), $countryCode, WEEK_IN_SECONDS);
104
+ } else {
105
+ $countryCode = '';
106
+ }
107
+ }
108
+ }
109
+
110
+ return $countryCode;
111
+ }