Content Views – Post Grid & List for WordPress - Version 2.3.0

Version Description

  • 2020/01/13 =
  • Update: Improve SEO for Ajax pagination: relace the format /pages/ (as it caused some issues) by _page=; make each component pages accessible individually.
  • Update: Add link to title in the Collapsible list
  • Update: Show original post title in Collapsible list without stripping HTML tags as previous versions
  • New: Add option to show original full content without attempt to balance HTML tags
  • Some minor updates and fixes
Download this release

Release Info

Developer PT Guy
Plugin Icon 128x128 Content Views – Post Grid & List for WordPress
Version 2.3.0
Comparing to
See all releases

Code changes from version 2.2.0 to 2.3.0

README.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: pt-guy
3
  Donate link: https://www.contentviewspro.com/?utm_source=wordpress&utm_medium=plugin&utm_campaign=donate
4
  Tags: post grid, grid plugin, grid, latest post, display post, post, page, category, responsive, list, thumbnail
5
  Requires at least: 3.3
6
- Tested up to: 5.2.1
7
- Stable tag: 2.2.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -159,6 +159,13 @@ If you are using "Your latest posts" as home page, you should paste this code `<
159
 
160
  == Changelog ==
161
 
 
 
 
 
 
 
 
162
  = 2.2.0 - 2019/05/31 =
163
  * Enhancement: upgrade bootstrap framework to latest secure version 3.4.1
164
 
3
  Donate link: https://www.contentviewspro.com/?utm_source=wordpress&utm_medium=plugin&utm_campaign=donate
4
  Tags: post grid, grid plugin, grid, latest post, display post, post, page, category, responsive, list, thumbnail
5
  Requires at least: 3.3
6
+ Tested up to: 5.3.2
7
+ Stable tag: 2.3.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
159
 
160
  == Changelog ==
161
 
162
+ = 2.3.0 - 2020/01/13 =
163
+ * Update: Improve SEO for Ajax pagination: relace the format `/pages/` (as it caused some issues) by `_page=`; make each component pages accessible individually.
164
+ * Update: Add link to title in the Collapsible list
165
+ * Update: Show original post title in Collapsible list without stripping HTML tags as previous versions
166
+ * New: Add option to show original full content without attempt to balance HTML tags
167
+ * Some minor updates and fixes
168
+
169
  = 2.2.0 - 2019/05/31 =
170
  * Enhancement: upgrade bootstrap framework to latest secure version 3.4.1
171
 
admin/assets/css/admin.css CHANGED
@@ -22,6 +22,7 @@
22
  height: 34px;
23
  }
24
  body {background-color: #fff}
 
25
 
26
  /* Fix Bootstrap box-sizing "border-box" problem */
27
  .pt-wrap *,
@@ -307,6 +308,11 @@ html {
307
  background: #fff;
308
  }
309
 
 
 
 
 
 
310
  .pt-cv-excerpt-setting > label {
311
  display: none !important;
312
  }
22
  height: 34px;
23
  }
24
  body {background-color: #fff}
25
+ .pt-params .select2-input {line-height: 20px;} /* WP 5.3 */
26
 
27
  /* Fix Bootstrap box-sizing "border-box" problem */
28
  .pt-wrap *,
308
  background: #fff;
309
  }
310
 
311
+ .pt-cv-content-setting > .pt-params,
312
+ .pt-cv-content-setting + .pt-cv-excerpt-setting > .pt-params {
313
+ border-bottom: none !important;
314
+ }
315
+
316
  .pt-cv-excerpt-setting > label {
317
  display: none !important;
318
  }
admin/assets/js/admin.js CHANGED
@@ -1,653 +1,636 @@
1
- /**
2
- * Main script file for WP admin
3
- *
4
- * @package PT_Content_Views_Admin
5
- * @author PT Guy <http://www.contentviewspro.com/>
6
- * @license GPL-2.0+
7
- * @link http://www.contentviewspro.com/
8
- * @copyright 2014 PT Guy
9
- */
10
-
11
- ( function ( $ ) {
12
- "use strict";
13
-
14
- $.PT_CV_Admin = $.PT_CV_Admin || { };
15
- PT_CV_ADMIN = PT_CV_ADMIN || { };
16
- ajaxurl = ajaxurl || { };
17
- var _prefix = PT_CV_ADMIN._prefix;
18
-
19
- $.PT_CV_Admin = function ( options ) {
20
- this.options = $.extend( {
21
- onload: 1,
22
- scroll_time: 500,
23
- can_preview: 1
24
- }, options );
25
-
26
- this.init();
27
- };
28
-
29
- $.PT_CV_Admin.prototype = {
30
- init: function () {
31
- this.custom();
32
-
33
- // Validate number
34
- this.validate_number();
35
- // Select2
36
- $( 'select.' + _prefix + 'select2' ).select2();
37
-
38
- },
39
- custom: function () {
40
- var $self = this;
41
-
42
- this.preview();
43
- this._preview_btn_toggle();
44
- this._content_type();
45
- this._toggle_taxonomy_relation();
46
- this._thumbnail_settings();
47
-
48
- // Toggle panel
49
- this._toggle_panel( '.' + _prefix + 'group .panel-heading' );
50
- // 'Advance Settings'
51
- this.toggle_group( '.' + _prefix + 'advanced-settings-item' );
52
- // 'Terms' (in "Taxonomy Settings")
53
- this.toggle_group( '.' + _prefix + 'taxonomy-item' );
54
- // 'Content type'
55
- this.toggle_group( '[name="' + _prefix + 'content-type' + '"]', false );
56
- // 'View type settings'
57
- this.toggle_group( '[name="' + _prefix + 'view-type' + '"]', false );
58
- // Toggle dependencies
59
- this.dependence_do_all();
60
-
61
- // Prevent click on links
62
- $( '#' + _prefix + 'preview-box' ).on( 'click', 'a', function ( e ) {
63
- e.preventDefault();
64
- } );
65
- $( '.pt-accordion-a' ).click( function ( e ) {
66
- e.preventDefault();
67
- } );
68
-
69
- // Show alert when leave page without saving View
70
- var checked = 0;
71
- $( '#' + _prefix + 'form-view input[type="submit"]' + ',' + 'a[href*="action=duplicate"]' ).click( function () {
72
- checked = 1;
73
- } );
74
- window.onbeforeunload = function ( event ) {
75
- if ( !$self.options.onload && !checked ) {
76
- var message = 'The changes you made will be lost if you navigate away from this page.';
77
- if ( typeof event === 'undefined' ) {
78
- event = window.event;
79
- }
80
- if ( event ) {
81
- event.returnValue = message;
82
- }
83
- return message;
84
- }
85
- };
86
-
87
- // Handle Pagination actions
88
- $( 'body' ).bind( _prefix + 'admin-preview', function () {
89
- new $.PT_CV_Public();
90
- } );
91
- },
92
- /**
93
- * Toggle panel when click Show/Hide icon on Heading
94
- *
95
- * @param {type} $selector
96
- * @returns {undefined}
97
- */
98
- _toggle_panel: function ( $selector ) {
99
- $( 'body' ).on( 'click', $selector, function ( e ) {
100
- var $heading = $( this );
101
- var $span = $heading.find( 'span.clickable' );
102
- var time = 100;
103
-
104
- if ( !$span.hasClass( 'panel-collapsed' ) ) {
105
- $heading.next( '.panel-body' ).slideUp( time );
106
- $span.addClass( 'panel-collapsed' );
107
- $span.find( 'i' ).removeClass( 'glyphicon-minus' ).addClass( 'glyphicon-plus' );
108
- } else {
109
- $heading.next( '.panel-body' ).slideDown( time );
110
- $span.removeClass( 'panel-collapsed' );
111
- $span.find( 'i' ).removeClass( 'glyphicon-plus' ).addClass( 'glyphicon-minus' );
112
- }
113
- } );
114
- },
115
- /**
116
- * Toggle Taxonomy Relation setting on page load & on change
117
- *
118
- * @returns void
119
- */
120
- _toggle_taxonomy_relation: function () {
121
- var $self = this;
122
- $self._do_toggle_taxonomy_relation();
123
- $( '.' + _prefix + 'taxonomy-item' ).change( function () {
124
- $self._do_toggle_taxonomy_relation();
125
- } );
126
- },
127
- /**
128
- * Toggle Taxonomy Relation setting by number of selected taxonomies
129
- *
130
- * @returns {undefined}
131
- */
132
- _do_toggle_taxonomy_relation: function () {
133
- var $taxonomy_relation = $( '.' + _prefix + 'taxonomy-relation' ).parent().parent( '.form-group' );
134
- var $wrap_taxonomies = $( '#' + _prefix + 'group-taxonomy' );
135
-
136
- // If there is no taxonomies
137
- var is_multi = false;
138
- if ( $wrap_taxonomies.find( '.' + _prefix + 'taxonomies .checkbox' ).filter( function () {
139
- return !$( this ).hasClass( 'hidden' ) && $( this ).find( 'input:checked' ).length;
140
- } ).length > 1 ) {
141
- $taxonomy_relation.removeClass( 'hidden' );
142
- is_multi = true;
143
- } else {
144
- $taxonomy_relation.addClass( 'hidden' );
145
- }
146
-
147
- $( '.pt-wrap' ).trigger( _prefix + 'multiple-taxonomies', [ is_multi ] );
148
- },
149
- /**
150
- * Get field value, depends on field type & its parent is show/hide
151
- *
152
- * @param {type} el : string to selector
153
- * @returns {undefined}
154
- */
155
- _get_field_val: function ( el ) {
156
- var $this = $( el );
157
- var value = $( el ).val();
158
-
159
- if ( $this.is( ':checkbox' ) || $this.is( ':radio' ) ) {
160
- value = $( el + ':checked' ).val();
161
- }
162
-
163
- return value;
164
- },
165
- /**
166
- * Do toggle all dependency groups
167
- *
168
- * @returns {undefined}
169
- */
170
- dependence_do_all: function () {
171
- var $self = this;
172
- var $toggle_data_js = $.parseJSON( $self.options._toggle_data );
173
-
174
- $.each( $toggle_data_js, function ( idx, obj ) {
175
- // Obj_sub: an object contains (dependence_id, operator, expect_val)
176
- $.each( obj, function ( key, obj_sub ) {
177
- // Get name of depended element (which other elements depend on it)
178
- var el_name = _prefix + key;
179
-
180
- var el = "[name='" + el_name + "']";
181
-
182
- // Run on page load
183
- $self._dependence_group( $self._get_field_val( el ), obj_sub );
184
-
185
- // Run on change
186
- $( el ).change( function () {
187
- $self._dependence_group( $self._get_field_val( el ), obj_sub );
188
- } );
189
- } );
190
- } );
191
-
192
- $( '.pt-wrap' ).trigger( 'finish-do-dependence' );
193
- },
194
- /**
195
- * Toggle each dependency group
196
- * @param {type} this_val : current value of depended element (which other elements depend on it)
197
- * @param {type} obj_sub : an object contains (dependence_id, expect_val, operator)
198
- * @returns {undefined}
199
- */
200
- _dependence_group: function ( this_val, obj_sub ) {
201
- var $self = this;
202
- $.each( obj_sub, function ( key, data ) {
203
- $self._dependence_element( data[0], this_val, data[2], data[1] );
204
- } );
205
- },
206
- /**
207
- * Toggle each dependency element
208
- *
209
- * @param {type} dependence_id : id of group A which depends on an element B
210
- * @param {type} this_val : current value of B
211
- * @param {type} operator : operator to comparing A's value & B's value : =, >, < ...
212
- * @param {type} expect_val : expect value of B to show A group
213
- * @returns {undefined}
214
- */
215
- _dependence_element: function ( dependence_id, this_val, operator, expect_val ) {
216
- var dependence_el = $( "#" + dependence_id );
217
- var pass = 0;
218
- switch ( operator ) {
219
- case "=":
220
- {
221
- if ( typeof expect_val === 'string' )
222
- expect_val = [ expect_val ];
223
- pass = ( $.inArray( this_val, expect_val ) >= 0 );
224
- }
225
- break;
226
- case "!=":
227
- {
228
- if ( typeof expect_val === 'string' )
229
- expect_val = [ expect_val ];
230
- pass = ( $.inArray( this_val, expect_val ) < 0 );
231
- }
232
- break;
233
- default :
234
- if ( typeof expect_val !== 'object' )
235
- pass = eval( "this_val " + operator + " expect_val" );
236
- break;
237
-
238
- }
239
- var action = '';
240
- var result = 0;
241
- if ( pass ) {
242
- dependence_el.removeClass( 'hidden' );
243
-
244
- action = 'remove';
245
- result = !dependence_el.hasClass( 'hidden' );
246
- } else {
247
- dependence_el.addClass( 'hidden' );
248
-
249
- action = 'add';
250
- result = dependence_el.hasClass( 'hidden' );
251
- }
252
-
253
- // Log if something is wrong
254
- if ( !result )
255
- console.log( dependence_id, this_val, operator, expect_val, action );
256
- },
257
- /**
258
- * Toggle a group inside Panel group when check/uncheck a checkbox inside checboxes list
259
- *
260
- * @param {type} selector
261
- * @param {type} toggle
262
- * @returns {undefined}
263
- */
264
- toggle_group: function ( selector, toggle ) {
265
- var $self = this;
266
- // Run on page load
267
- $( selector ).each( function () {
268
- $self._toggle_each_group( $( this ), toggle );
269
- } );
270
- // Run on change
271
- $( selector ).each( function () {
272
- $( this ).change( function () {
273
- var this_ = $( this );
274
- setTimeout( function () {
275
- $self._toggle_each_group( this_, toggle );
276
- }, 200 );
277
- } );
278
- } );
279
- },
280
- /**
281
- * Toggle group depends on selector value
282
- *
283
- * @param {type} $this
284
- * @param {type} toggle
285
- * @returns {undefined}
286
- */
287
- _toggle_each_group: function ( $this, toggle ) {
288
- var $self = this;
289
- if ( $this.is( 'select' ) || ( ( $this.is( ':checkbox' ) || $this.is( ':radio' ) ) && $this.is( ':checked' ) ) ) {
290
- // Get id of element A which needs to toggle
291
- var toggle_id = '#' + PT_CV_ADMIN._group_prefix + $this.val();
292
-
293
- // Get siblings groups of A
294
- var other_groups = $( toggle_id ).parent().children( '.' + _prefix + 'group' ).not( toggle_id );
295
-
296
- if ( $( toggle_id ).hasClass( _prefix + 'only-one' ) ) {
297
- // Hide other group in a same Panel group
298
- other_groups.addClass( 'hidden' );
299
- } else {
300
- }
301
-
302
- // Show group
303
- $( toggle_id ).removeClass( 'hidden' );
304
-
305
- // Show the content
306
- $( toggle_id ).find( '.panel-body' ).show();
307
-
308
- // Scroll to
309
- if ( toggle !== false && !$self.options.onload && $( toggle_id ).offset() ) {
310
- $( 'html, body' ).animate( {
311
- scrollTop: $( toggle_id ).offset().top - 40
312
- }, $self.options.scroll_time );
313
- }
314
-
315
- // Highlight color
316
- var activate_group = _prefix + 'group-activate';
317
- $( toggle_id ).addClass( activate_group );
318
-
319
- // Remove highlight color
320
- setTimeout( function () {
321
- $( toggle_id ).removeClass( activate_group );
322
- }, 2000 );
323
-
324
- } else {
325
- $( '#' + PT_CV_ADMIN._group_prefix + $this.val() ).addClass( 'hidden' );
326
- }
327
-
328
- $( '.pt-wrap' ).trigger( 'finish-toggle-group' );
329
- },
330
- /**
331
- * Custom function for 'Content Type'
332
- *
333
- * @returns {undefined}
334
- */
335
- _content_type: function () {
336
- var $self = this;
337
- var $wrap_taxonomies = $( '#' + _prefix + 'group-taxonomy' );
338
- var $taxonomy_other_settings = $( '.' + _prefix + 'taxonomy-extra' );
339
- var $taxonomies = $( '.' + _prefix + 'taxonomy-item' );
340
-
341
- var $no_taxonomy = $( '<div/>', {
342
- 'id': _prefix + 'no-taxonomy',
343
- 'class': _prefix + 'text',
344
- 'text': PT_CV_ADMIN.text.no_taxonomy
345
- } ).appendTo( $( '.' + _prefix + 'taxonomies' ) );
346
-
347
- var fn_taxonomy_hide = function ( taxonomies ) {
348
- // Hide all taxonomy checkboxes
349
- taxonomies.each( function () {
350
- $( this ).parents( '.checkbox' ).addClass( 'hidden' );
351
- } );
352
-
353
- $no_taxonomy.addClass( 'hidden' );
354
-
355
- // Hide all sections of taxonomies
356
- $( '.panel-group.terms' ).find( '.' + _prefix + 'group' ).addClass( 'hidden' );
357
- };
358
-
359
- // Run on page load
360
- fn_taxonomy_hide( $taxonomies );
361
-
362
- // For content type
363
- var content_type = '[name="' + _prefix + 'content-type' + '"]';
364
- var fn_content_type = function ( is_change ) {
365
- var this_val;
366
- if ( $( content_type ).is( 'input:radio' ) ) {
367
- this_val = $( content_type + ':checked' ).val();
368
- } else {
369
- this_val = $( content_type ).val();
370
- }
371
-
372
- if ( typeof this_val === 'undefined' ) {
373
- return;
374
- }
375
-
376
- if ( is_change ) {
377
- // Uncheck all checkbox of taxonomies
378
- $taxonomies.attr( 'checked', false );
379
-
380
- // Toggle Taxonomy Relation setting
381
- $self._do_toggle_taxonomy_relation();
382
- }
383
-
384
- // Show taxonomies of selected post type
385
- if ( this_val !== '' ) {
386
- fn_taxonomy_hide( $taxonomies );
387
-
388
- $taxonomies.filter( function () {
389
- var val = $( this ).val();
390
- var $taxonomies_of_this = PT_CV_ADMIN.data.post_types_vs_taxonomies[this_val] || '';
391
- return $.inArray( val, $taxonomies_of_this ) >= 0;
392
- } ).parents( '.checkbox' ).removeClass( 'hidden' );
393
- }
394
-
395
- // Show message "there is no taxonomy"
396
- if ( $wrap_taxonomies.find( '.' + _prefix + 'taxonomies .checkbox' ).filter( function () {
397
- return !$( this ).hasClass( 'hidden' );
398
- } ).length === 0 ) {
399
- $no_taxonomy.removeClass( 'hidden' );
400
- $taxonomy_other_settings.addClass( 'hidden' );
401
- }
402
-
403
- // Trigger custom actions
404
- $( '.pt-wrap' ).trigger( 'content-type-change', [ this_val ] );
405
- };
406
-
407
- // Run on page load
408
- fn_content_type();
409
-
410
- // Run on change
411
- $( content_type ).change( function () {
412
- fn_content_type( 1 );
413
- } );
414
- },
415
- /**
416
- * Preview handle
417
- *
418
- * @returns {undefined}
419
- */
420
- preview: function () {
421
- var $self = this;
422
- var offset_top;
423
-
424
- $( '#' + _prefix + 'show-preview' ).click( function ( e ) {
425
- e.stopPropagation();
426
- e.preventDefault();
427
-
428
- $( 'body' ).trigger( _prefix + 'admin-preview-start' );
429
-
430
- var $this_btn = $( this );
431
-
432
- // Get Preview box
433
- var $preview = $( '#' + _prefix + 'preview-box' );
434
-
435
- // Show/hide Preview box
436
- if ( $self.options.can_preview ) {
437
- $preview.addClass( 'in' );
438
- } else {
439
- $preview.removeClass( 'in' );
440
- }
441
-
442
- /**
443
- * Animation
444
- */
445
- // Scroll to preview box if want to show it
446
- if ( $self.options.can_preview ) {
447
- // Get current offset top to go back later
448
- offset_top = $( document ).scrollTop();
449
-
450
- // Scroll to preview box
451
- $( 'html, body' ).animate( {
452
- scrollTop: $preview.offset().top - 100
453
- }, $self.options.scroll_time );
454
-
455
- /// Send request
456
- $preview.css( 'opacity', '0.2' );
457
- // Show loading icon
458
- $preview.next().removeClass( 'hidden' );
459
-
460
- // Get settings data
461
- var data = $( '#' + _prefix + 'form-view' ).serialize();
462
- // Call handle function
463
- $self._preview_request( $preview, data, $this_btn );
464
- } else {
465
- // Scroll to previous position
466
- $( 'html, body' ).animate( {
467
- scrollTop: offset_top
468
- }, $self.options.scroll_time );
469
-
470
- // Toggle text of this button
471
- $this_btn.html( PT_CV_ADMIN.btn.preview.show );
472
-
473
- // Enable preview
474
- setTimeout( function () {
475
- $self.options.can_preview = 1;
476
- }, $self.options.scroll_time );
477
- }
478
- } );
479
- },
480
- /**
481
- * Send preview Ajax request
482
- *
483
- * @param {object} preview_box The jqurey object
484
- * @param {string} _data
485
- * @param {object} $this_btn The Show/Hide preview button
486
- * @returns void
487
- */
488
- _preview_request: function ( preview_box, _data, $this_btn ) {
489
- var $self = this;
490
- var data = {
491
- action: 'preview_request',
492
- data: _data,
493
- ajax_nonce: PT_CV_ADMIN._nonce
494
- };
495
-
496
- // Sent POST request
497
- $.ajax( {
498
- type: "POST",
499
- url: ajaxurl,
500
- data: data
501
- } ).done( function ( response ) {
502
- var reload = false;
503
- if ( response == -1 || response == 0 ) {
504
- reload = true;
505
- response = "Your session has expired. This page will be reloaded.";
506
- }
507
-
508
- preview_box.css( 'opacity', '1' );
509
-
510
- // Hide loading icon
511
- preview_box.next().addClass( 'hidden' );
512
-
513
- // Update content of Preview box
514
- preview_box.html( response );
515
-
516
- if ( reload ) {
517
- location.reload();
518
- }
519
-
520
- $self._filter_response( preview_box );
521
-
522
- // Toggle text of this button
523
- $this_btn.html( PT_CV_ADMIN.btn.preview.hide );
524
-
525
- // Disable preview
526
- $self.options.can_preview = 0;
527
-
528
- // Trigger action, to recall function such as pagination, pinterest render layout...
529
- $( 'body' ).trigger( _prefix + 'admin-preview' );
530
- } );
531
- },
532
- _filter_response: function ( preview_box ) {
533
- var fn_alert_visible_sc = function () {
534
- $( '.' + _prefix + 'content', preview_box ).each( function () {
535
- var tclass = _prefix + 'caution';
536
- $( '.' + tclass ).remove();
537
-
538
- var content = $( this ).html();
539
- var regex = /\[[^\]]+\]/;
540
- if ( regex.test( content ) ) {
541
- $( '<div />', { html: PT_CV_ADMIN.text.visible_shortcode, class: tclass } ).insertBefore( preview_box );
542
- return false;
543
- }
544
- } );
545
- };
546
- fn_alert_visible_sc();
547
-
548
- $( 'body' ).trigger( _prefix + 'preview-response', [ preview_box ] );
549
- },
550
- /**
551
- * Toggle 'Thumbnail settings'
552
- *
553
- * @returns {undefined}
554
- */
555
- _thumbnail_settings: function () {
556
- // Toggle 'Thumbnail settings' when change 'Layout format'
557
- var fn_thumbnail_setting = function ( this_val ) {
558
- var $show_thumbnail = $( '[name="' + _prefix + 'show-field-thumbnail' + '"]' );
559
-
560
- // Force to show thumbnail IF it is not enabled
561
- if ( this_val === '2-col' && !$show_thumbnail.is( ':checked' ) ) {
562
- $show_thumbnail.trigger( 'click' );
563
- }
564
- };
565
-
566
- var layout_format = '[name="' + _prefix + 'layout-format' + '"]';
567
-
568
- // Run on page load
569
- fn_thumbnail_setting( $( layout_format + ':checked' ).val() );
570
-
571
- // Run on change
572
- $( layout_format ).change( function () {
573
- fn_thumbnail_setting( $( layout_format + ':checked' ).val() );
574
- } );
575
-
576
- /**
577
- * Toggle 'Layout format' when change 'View type'
578
- *
579
- * @param {type} this_val
580
- * @param {type} layout_format
581
- * @returns {undefined}
582
- */
583
- var view_type = '[name="' + _prefix + 'view-type' + '"]';
584
- var fn_layout_format = function ( layout_format ) {
585
- var this_val;
586
- if ( $( view_type ).is( 'input:radio' ) ) {
587
- this_val = $( view_type + ':checked' ).val();
588
- } else {
589
- this_val = $( view_type ).val();
590
- }
591
-
592
- var expect_val = [ 'scrollable' ];
593
-
594
- // Add more layouts
595
- $( '.pt-wrap' ).trigger( 'toggle-layout-format', [ expect_val ] );
596
-
597
- if ( $.inArray( this_val, expect_val ) >= 0 ) {
598
- $( layout_format + '[value="1-col"]' ).trigger( 'click' );
599
- $( layout_format + '[value="2-col"]' ).attr( 'disabled', true );
600
- } else {
601
- $( layout_format + '[value="2-col"]' ).attr( 'disabled', false );
602
- }
603
- };
604
-
605
- // Run on page load
606
- fn_layout_format( layout_format );
607
-
608
- // Run on change
609
- $( view_type ).change( function () {
610
- fn_layout_format( layout_format );
611
- } );
612
- },
613
- /**
614
- * Toggle text of Preview button
615
- * @returns {undefined}
616
- */
617
- _preview_btn_toggle: function () {
618
- var $self = this;
619
-
620
- var _fn = function ( is_trigger ) {
621
- if ( !is_trigger ) {
622
- $self.options.onload = 0;
623
- }
624
-
625
- // Toggle text of this button
626
- $( '#' + _prefix + 'show-preview' ).html( PT_CV_ADMIN.btn.preview.update );
627
-
628
- // Enable preview
629
- $self.options.can_preview = 1;
630
- };
631
- // Bind on change input after page load
632
- $( '.pt-wrap .tab-content' ).on( 'change', 'input, select, textarea', function ( evt, is_trigger ) {
633
- _fn( is_trigger );
634
- } );
635
-
636
- $( 'body' ).bind( _prefix + 'preview-btn-toggle', function () {
637
- _fn();
638
- } );
639
- },
640
- /**
641
- * Validate number: prevent negative value
642
- * @returns {undefined}
643
- */
644
- validate_number: function () {
645
- $( 'input[type="number"]' ).on( 'keypress', function ( event ) {
646
- var min = $( this ).prop( 'min' );
647
- if ( min == 0 && !( event.charCode >= 48 && event.charCode <= 57 ) )
648
- event.preventDefault();
649
- } );
650
- }
651
- };
652
-
653
  }( jQuery ) );
1
+ /**
2
+ * Main script file for WP admin
3
+ *
4
+ * @package PT_Content_Views_Admin
5
+ * @author PT Guy <http://www.contentviewspro.com/>
6
+ * @license GPL-2.0+
7
+ * @link http://www.contentviewspro.com/
8
+ * @copyright 2014 PT Guy
9
+ */
10
+
11
+ ( function ( $ ) {
12
+ "use strict";
13
+
14
+ $.PT_CV_Admin = $.PT_CV_Admin || { };
15
+ PT_CV_ADMIN = PT_CV_ADMIN || { };
16
+ ajaxurl = ajaxurl || { };
17
+ var _prefix = PT_CV_ADMIN._prefix;
18
+
19
+ $.PT_CV_Admin = function ( options ) {
20
+ this.options = $.extend( {
21
+ onload: 1,
22
+ scroll_time: 500,
23
+ can_preview: 1
24
+ }, options );
25
+
26
+ this.init();
27
+ };
28
+
29
+ $.PT_CV_Admin.prototype = {
30
+ init: function () {
31
+ this.custom();
32
+
33
+ // Validate number
34
+ this.validate_number();
35
+ // Select2
36
+ $( 'select.' + _prefix + 'select2' ).select2();
37
+
38
+ },
39
+ custom: function () {
40
+ var $self = this;
41
+
42
+ this.preview();
43
+ this._preview_btn_toggle();
44
+ this._content_type();
45
+ this._toggle_taxonomy_relation();
46
+ this._thumbnail_settings();
47
+
48
+ // Toggle panel
49
+ this._toggle_panel( '.' + _prefix + 'group .panel-heading' );
50
+ // 'Advance Settings'
51
+ this.toggle_group( '.' + _prefix + 'advanced-settings-item' );
52
+ // 'Terms' (in "Taxonomy Settings")
53
+ this.toggle_group( '.' + _prefix + 'taxonomy-item' );
54
+ // 'Content type'
55
+ this.toggle_group( '[name="' + _prefix + 'content-type' + '"]', false );
56
+ // 'View type settings'
57
+ this.toggle_group( '[name="' + _prefix + 'view-type' + '"]', false );
58
+ // Toggle dependencies
59
+ this.dependence_do_all();
60
+
61
+ // Prevent click on links
62
+ $( '#' + _prefix + 'preview-box' ).on( 'click', 'a', function ( e ) {
63
+ e.preventDefault();
64
+ } );
65
+ $( '.pt-accordion-a' ).click( function ( e ) {
66
+ e.preventDefault();
67
+ } );
68
+
69
+ // Show alert when leave page without saving View
70
+ var checked = 0;
71
+ $( '#' + _prefix + 'form-view input[type="submit"]' + ',' + 'a[href*="action=duplicate"]' ).click( function () {
72
+ checked = 1;
73
+ } );
74
+ window.onbeforeunload = function ( event ) {
75
+ if ( !$self.options.onload && !checked ) {
76
+ var message = 'The changes you made will be lost if you navigate away from this page.';
77
+ if ( typeof event === 'undefined' ) {
78
+ event = window.event;
79
+ }
80
+ if ( event ) {
81
+ event.returnValue = message;
82
+ }
83
+ return message;
84
+ }
85
+ };
86
+
87
+ // Handle Pagination actions
88
+ $( 'body' ).bind( _prefix + 'admin-preview', function () {
89
+ new $.PT_CV_Public();
90
+ } );
91
+ },
92
+ /**
93
+ * Toggle panel when click Show/Hide icon on Heading
94
+ *
95
+ * @param {type} $selector
96
+ * @returns {undefined}
97
+ */
98
+ _toggle_panel: function ( $selector ) {
99
+ $( 'body' ).on( 'click', $selector, function ( e ) {
100
+ var $heading = $( this );
101
+ var $span = $heading.find( 'span.clickable' );
102
+ var time = 100;
103
+
104
+ if ( !$span.hasClass( 'panel-collapsed' ) ) {
105
+ $heading.next( '.panel-body' ).slideUp( time );
106
+ $span.addClass( 'panel-collapsed' );
107
+ $span.find( 'i' ).removeClass( 'glyphicon-minus' ).addClass( 'glyphicon-plus' );
108
+ } else {
109
+ $heading.next( '.panel-body' ).slideDown( time );
110
+ $span.removeClass( 'panel-collapsed' );
111
+ $span.find( 'i' ).removeClass( 'glyphicon-plus' ).addClass( 'glyphicon-minus' );
112
+ }
113
+ } );
114
+ },
115
+ /**
116
+ * Toggle Taxonomy Relation setting on page load & on change
117
+ *
118
+ * @returns void
119
+ */
120
+ _toggle_taxonomy_relation: function () {
121
+ var $self = this;
122
+ $self._do_toggle_taxonomy_relation();
123
+ $( '.' + _prefix + 'taxonomy-item' ).change( function () {
124
+ $self._do_toggle_taxonomy_relation();
125
+ } );
126
+ },
127
+ /**
128
+ * Toggle Taxonomy Relation setting by number of selected taxonomies
129
+ *
130
+ * @returns {undefined}
131
+ */
132
+ _do_toggle_taxonomy_relation: function () {
133
+ var $taxonomy_relation = $( '.' + _prefix + 'taxonomy-relation' ).parent().parent( '.form-group' );
134
+ var $wrap_taxonomies = $( '#' + _prefix + 'group-taxonomy' );
135
+
136
+ // If there is no taxonomies
137
+ var is_multi = false;
138
+ if ( $wrap_taxonomies.find( '.' + _prefix + 'taxonomies .checkbox' ).filter( function () {
139
+ return !$( this ).hasClass( 'hidden' ) && $( this ).find( 'input:checked' ).length;
140
+ } ).length > 1 ) {
141
+ $taxonomy_relation.removeClass( 'hidden' );
142
+ is_multi = true;
143
+ } else {
144
+ $taxonomy_relation.addClass( 'hidden' );
145
+ }
146
+
147
+ $( '.pt-wrap' ).trigger( _prefix + 'multiple-taxonomies', [ is_multi ] );
148
+ },
149
+ /**
150
+ * Get field value, depends on field type & its parent is show/hide
151
+ *
152
+ * @param {type} el : string to selector
153
+ * @returns {undefined}
154
+ */
155
+ _get_field_val: function ( el ) {
156
+ var $this = $( el );
157
+ var value = $( el ).val();
158
+
159
+ if ( $this.is( ':checkbox' ) || $this.is( ':radio' ) ) {
160
+ value = $( el + ':checked' ).val();
161
+ }
162
+
163
+ return value;
164
+ },
165
+ /**
166
+ * Do toggle all dependency groups
167
+ *
168
+ * @returns {undefined}
169
+ */
170
+ dependence_do_all: function () {
171
+ var $self = this;
172
+ var $toggle_data_js = $.parseJSON( $self.options._toggle_data );
173
+
174
+ $.each( $toggle_data_js, function ( idx, obj ) {
175
+ // Obj_sub: an object contains (dependence_id, operator, expect_val)
176
+ $.each( obj, function ( key, obj_sub ) {
177
+ // Get name of depended element (which other elements depend on it)
178
+ var el_name = _prefix + key;
179
+
180
+ var el = "[name='" + el_name + "']";
181
+
182
+ // Run on page load
183
+ $self._dependence_group( $self._get_field_val( el ), obj_sub );
184
+
185
+ // Run on change
186
+ $( el ).change( function () {
187
+ $self._dependence_group( $self._get_field_val( el ), obj_sub );
188
+ } );
189
+ } );
190
+ } );
191
+
192
+ $( '.pt-wrap' ).trigger( 'finish-do-dependence' );
193
+ },
194
+ /**
195
+ * Toggle each dependency group
196
+ * @param {type} this_val : current value of depended element (which other elements depend on it)
197
+ * @param {type} obj_sub : an object contains (dependence_id, expect_val, operator)
198
+ * @returns {undefined}
199
+ */
200
+ _dependence_group: function ( this_val, obj_sub ) {
201
+ var $self = this;
202
+ $.each( obj_sub, function ( key, data ) {
203
+ $self._dependence_element( data[0], this_val, data[2], data[1] );
204
+ } );
205
+ },
206
+ /**
207
+ * Toggle each dependency element
208
+ *
209
+ * @param {type} dependence_id : id of group A which depends on an element B
210
+ * @param {type} this_val : current value of B
211
+ * @param {type} operator : operator to comparing A's value & B's value : =, >, < ...
212
+ * @param {type} expect_val : expect value of B to show A group
213
+ * @returns {undefined}
214
+ */
215
+ _dependence_element: function ( dependence_id, this_val, operator, expect_val ) {
216
+ var dependence_el = $( "#" + dependence_id );
217
+ var pass = 0;
218
+ switch ( operator ) {
219
+ case "=":
220
+ {
221
+ if ( typeof expect_val === 'string' )
222
+ expect_val = [ expect_val ];
223
+ pass = ( $.inArray( this_val, expect_val ) >= 0 );
224
+ }
225
+ break;
226
+ case "!=":
227
+ {
228
+ if ( typeof expect_val === 'string' )
229
+ expect_val = [ expect_val ];
230
+ pass = ( $.inArray( this_val, expect_val ) < 0 );
231
+ }
232
+ break;
233
+ default :
234
+ if ( typeof expect_val !== 'object' )
235
+ pass = eval( "this_val " + operator + " expect_val" );
236
+ break;
237
+
238
+ }
239
+ var action = '';
240
+ var result = 0;
241
+ if ( pass ) {
242
+ dependence_el.removeClass( 'hidden' );
243
+
244
+ action = 'remove';
245
+ result = !dependence_el.hasClass( 'hidden' );
246
+ } else {
247
+ dependence_el.addClass( 'hidden' );
248
+
249
+ action = 'add';
250
+ result = dependence_el.hasClass( 'hidden' );
251
+ }
252
+
253
+ // Log if something is wrong
254
+ if ( !result )
255
+ console.log( dependence_id, this_val, operator, expect_val, action );
256
+ },
257
+ /**
258
+ * Toggle a group inside Panel group when check/uncheck a checkbox inside checboxes list
259
+ *
260
+ * @param {type} selector
261
+ * @param {type} toggle
262
+ * @returns {undefined}
263
+ */
264
+ toggle_group: function ( selector, toggle ) {
265
+ var $self = this;
266
+ // Run on page load
267
+ $( selector ).each( function () {
268
+ $self._toggle_each_group( $( this ), toggle );
269
+ } );
270
+ // Run on change
271
+ $( selector ).each( function () {
272
+ $( this ).change( function () {
273
+ var this_ = $( this );
274
+ setTimeout( function () {
275
+ $self._toggle_each_group( this_, toggle );
276
+ }, 200 );
277
+ } );
278
+ } );
279
+ },
280
+ /**
281
+ * Toggle group depends on selector value
282
+ *
283
+ * @param {type} $this
284
+ * @param {type} toggle
285
+ * @returns {undefined}
286
+ */
287
+ _toggle_each_group: function ( $this, toggle ) {
288
+ var $self = this;
289
+ if ( $this.is( 'select' ) || ( ( $this.is( ':checkbox' ) || $this.is( ':radio' ) ) && $this.is( ':checked' ) ) ) {
290
+ // Get id of element A which needs to toggle
291
+ var toggle_id = '#' + PT_CV_ADMIN._group_prefix + $this.val();
292
+
293
+ // Get siblings groups of A
294
+ var other_groups = $( toggle_id ).parent().children( '.' + _prefix + 'group' ).not( toggle_id );
295
+
296
+ if ( $( toggle_id ).hasClass( _prefix + 'only-one' ) ) {
297
+ // Hide other group in a same Panel group
298
+ other_groups.addClass( 'hidden' );
299
+ } else {
300
+ }
301
+
302
+ // Show group
303
+ $( toggle_id ).removeClass( 'hidden' );
304
+
305
+ // Show the content
306
+ $( toggle_id ).find( '.panel-body' ).show();
307
+
308
+ // Scroll to
309
+ if ( toggle !== false && !$self.options.onload && $( toggle_id ).offset() ) {
310
+ $( 'html, body' ).animate( {
311
+ scrollTop: $( toggle_id ).offset().top - 40
312
+ }, $self.options.scroll_time );
313
+ }
314
+
315
+ // Highlight color
316
+ var activate_group = _prefix + 'group-activate';
317
+ $( toggle_id ).addClass( activate_group );
318
+
319
+ // Remove highlight color
320
+ setTimeout( function () {
321
+ $( toggle_id ).removeClass( activate_group );
322
+ }, 2000 );
323
+
324
+ } else {
325
+ $( '#' + PT_CV_ADMIN._group_prefix + $this.val() ).addClass( 'hidden' );
326
+ }
327
+
328
+ $( '.pt-wrap' ).trigger( 'finish-toggle-group' );
329
+ },
330
+ /**
331
+ * Custom function for 'Content Type'
332
+ *
333
+ * @returns {undefined}
334
+ */
335
+ _content_type: function () {
336
+ var $self = this;
337
+ var $wrap_taxonomies = $( '#' + _prefix + 'group-taxonomy' );
338
+ var $taxonomy_other_settings = $( '.' + _prefix + 'taxonomy-extra' );
339
+ var $taxonomies = $( '.' + _prefix + 'taxonomy-item' );
340
+
341
+ var $no_taxonomy = $( '<div/>', {
342
+ 'id': _prefix + 'no-taxonomy',
343
+ 'class': _prefix + 'text',
344
+ 'text': PT_CV_ADMIN.text.no_taxonomy
345
+ } ).appendTo( $( '.' + _prefix + 'taxonomies' ) );
346
+
347
+ var fn_taxonomy_hide = function ( taxonomies ) {
348
+ // Hide all taxonomy checkboxes
349
+ taxonomies.each( function () {
350
+ $( this ).parents( '.checkbox' ).addClass( 'hidden' );
351
+ } );
352
+
353
+ $no_taxonomy.addClass( 'hidden' );
354
+
355
+ // Hide all sections of taxonomies
356
+ $( '.panel-group.terms' ).find( '.' + _prefix + 'group' ).addClass( 'hidden' );
357
+ };
358
+
359
+ // Run on page load
360
+ fn_taxonomy_hide( $taxonomies );
361
+
362
+ // For content type
363
+ var content_type = '[name="' + _prefix + 'content-type' + '"]';
364
+ var fn_content_type = function ( is_change ) {
365
+ var this_val;
366
+ if ( $( content_type ).is( 'input:radio' ) ) {
367
+ this_val = $( content_type + ':checked' ).val();
368
+ } else {
369
+ this_val = $( content_type ).val();
370
+ }
371
+
372
+ if ( typeof this_val === 'undefined' ) {
373
+ return;
374
+ }
375
+
376
+ if ( is_change ) {
377
+ // Uncheck all checkbox of taxonomies
378
+ $taxonomies.attr( 'checked', false );
379
+
380
+ // Toggle Taxonomy Relation setting
381
+ $self._do_toggle_taxonomy_relation();
382
+ }
383
+
384
+ // Show taxonomies of selected post type
385
+ if ( this_val !== '' ) {
386
+ fn_taxonomy_hide( $taxonomies );
387
+
388
+ $taxonomies.filter( function () {
389
+ var val = $( this ).val();
390
+ var $taxonomies_of_this = PT_CV_ADMIN.data.post_types_vs_taxonomies[this_val] || '';
391
+ return $.inArray( val, $taxonomies_of_this ) >= 0;
392
+ } ).parents( '.checkbox' ).removeClass( 'hidden' );
393
+ }
394
+
395
+ // Show message "there is no taxonomy"
396
+ if ( $wrap_taxonomies.find( '.' + _prefix + 'taxonomies .checkbox' ).filter( function () {
397
+ return !$( this ).hasClass( 'hidden' );
398
+ } ).length === 0 ) {
399
+ $no_taxonomy.removeClass( 'hidden' );
400
+ $taxonomy_other_settings.addClass( 'hidden' );
401
+ }
402
+
403
+ // Trigger custom actions
404
+ $( '.pt-wrap' ).trigger( 'content-type-change', [ this_val ] );
405
+ };
406
+
407
+ // Run on page load
408
+ fn_content_type();
409
+
410
+ // Run on change
411
+ $( content_type ).change( function () {
412
+ fn_content_type( 1 );
413
+ } );
414
+ },
415
+ /**
416
+ * Preview handle
417
+ *
418
+ * @returns {undefined}
419
+ */
420
+ preview: function () {
421
+ var $self = this;
422
+ var offset_top;
423
+
424
+ $( '#' + _prefix + 'show-preview' ).click( function ( e ) {
425
+ e.stopPropagation();
426
+ e.preventDefault();
427
+
428
+ $( 'body' ).trigger( _prefix + 'admin-preview-start' );
429
+
430
+ var $this_btn = $( this );
431
+
432
+ // Get Preview box
433
+ var $preview = $( '#' + _prefix + 'preview-box' );
434
+
435
+ // Show/hide Preview box
436
+ if ( $self.options.can_preview ) {
437
+ $preview.addClass( 'in' );
438
+ } else {
439
+ $preview.removeClass( 'in' );
440
+ }
441
+
442
+ /**
443
+ * Animation
444
+ */
445
+ // Scroll to preview box if want to show it
446
+ if ( $self.options.can_preview ) {
447
+ // Get current offset top to go back later
448
+ offset_top = $( document ).scrollTop();
449
+
450
+ // Scroll to preview box
451
+ $( 'html, body' ).animate( {
452
+ scrollTop: $preview.offset().top - 100
453
+ }, $self.options.scroll_time );
454
+
455
+ /// Send request
456
+ $preview.css( 'opacity', '0.2' );
457
+ // Show loading icon
458
+ $preview.next().removeClass( 'hidden' );
459
+
460
+ // Get settings data
461
+ var data = $( '#' + _prefix + 'form-view' ).serialize();
462
+ // Call handle function
463
+ $self._preview_request( $preview, data, $this_btn );
464
+ } else {
465
+ // Scroll to previous position
466
+ $( 'html, body' ).animate( {
467
+ scrollTop: offset_top
468
+ }, $self.options.scroll_time );
469
+
470
+ // Toggle text of this button
471
+ $this_btn.html( PT_CV_ADMIN.btn.preview.show );
472
+
473
+ // Enable preview
474
+ setTimeout( function () {
475
+ $self.options.can_preview = 1;
476
+ }, $self.options.scroll_time );
477
+ }
478
+ } );
479
+ },
480
+ /**
481
+ * Send preview Ajax request
482
+ *
483
+ * @param {object} preview_box The jqurey object
484
+ * @param {string} _data
485
+ * @param {object} $this_btn The Show/Hide preview button
486
+ * @returns void
487
+ */
488
+ _preview_request: function ( preview_box, _data, $this_btn ) {
489
+ var $self = this;
490
+ var data = {
491
+ action: 'preview_request',
492
+ data: _data,
493
+ ajax_nonce: PT_CV_ADMIN._nonce
494
+ };
495
+
496
+ // Sent POST request
497
+ $.ajax( {
498
+ type: "POST",
499
+ url: ajaxurl,
500
+ data: data
501
+ } ).done( function ( response ) {
502
+ var reload = false;
503
+ if ( response == -1 || response == 0 ) {
504
+ reload = true;
505
+ response = "Your session has expired. This page will be reloaded.";
506
+ }
507
+
508
+ preview_box.css( 'opacity', '1' );
509
+
510
+ // Hide loading icon
511
+ preview_box.next().addClass( 'hidden' );
512
+
513
+ // Update content of Preview box
514
+ preview_box.html( response );
515
+
516
+ if ( reload ) {
517
+ location.reload();
518
+ }
519
+
520
+ $self._filter_response( preview_box );
521
+
522
+ // Toggle text of this button
523
+ $this_btn.html( PT_CV_ADMIN.btn.preview.hide );
524
+
525
+ // Disable preview
526
+ $self.options.can_preview = 0;
527
+
528
+ // Trigger action, to recall function such as pagination, pinterest render layout...
529
+ $( 'body' ).trigger( _prefix + 'admin-preview' );
530
+ } );
531
+ },
532
+ _filter_response: function ( preview_box ) {
533
+ var fn_alert_visible_sc = function () {
534
+ $( '.' + _prefix + 'content', preview_box ).each( function () {
535
+ var tclass = _prefix + 'caution';
536
+ $( '.' + tclass ).remove();
537
+
538
+ var content = $( this ).html();
539
+ var regex = /\[[^\]]+\]/;
540
+ if ( regex.test( content ) ) {
541
+ $( '<div />', { html: PT_CV_ADMIN.text.visible_shortcode, class: tclass } ).insertBefore( preview_box );
542
+ return false;
543
+ }
544
+ } );
545
+ };
546
+ fn_alert_visible_sc();
547
+
548
+ $( 'body' ).trigger( _prefix + 'preview-response', [ preview_box ] );
549
+ },
550
+ /**
551
+ * Toggle 'Thumbnail settings'
552
+ *
553
+ * @returns {undefined}
554
+ */
555
+ _thumbnail_settings: function () {
556
+
557
+ var layout_format = '[name="' + _prefix + 'layout-format' + '"]';
558
+
559
+ /**
560
+ * Toggle 'Layout format' when change 'View type'
561
+ *
562
+ * @param {type} this_val
563
+ * @param {type} layout_format
564
+ * @returns {undefined}
565
+ */
566
+ var view_type = '[name="' + _prefix + 'view-type' + '"]';
567
+ var fn_layout_format = function ( layout_format ) {
568
+ var this_val;
569
+ if ( $( view_type ).is( 'input:radio' ) ) {
570
+ this_val = $( view_type + ':checked' ).val();
571
+ } else {
572
+ this_val = $( view_type ).val();
573
+ }
574
+
575
+ var expect_val = [ 'scrollable' ];
576
+
577
+ // Add more layouts
578
+ $( '.pt-wrap' ).trigger( 'toggle-layout-format', [ expect_val ] );
579
+
580
+ if ( $.inArray( this_val, expect_val ) >= 0 ) {
581
+ $( layout_format + '[value="1-col"]' ).trigger( 'click' );
582
+ $( layout_format + '[value="2-col"]' ).attr( 'disabled', true );
583
+ } else {
584
+ $( layout_format + '[value="2-col"]' ).attr( 'disabled', false );
585
+ }
586
+ };
587
+
588
+ // Run on page load
589
+ fn_layout_format( layout_format );
590
+
591
+ // Run on change
592
+ $( view_type ).change( function () {
593
+ fn_layout_format( layout_format );
594
+ } );
595
+ },
596
+ /**
597
+ * Toggle text of Preview button
598
+ * @returns {undefined}
599
+ */
600
+ _preview_btn_toggle: function () {
601
+ var $self = this;
602
+
603
+ var _fn = function ( is_trigger ) {
604
+ if ( !is_trigger ) {
605
+ $self.options.onload = 0;
606
+ }
607
+
608
+ // Toggle text of this button
609
+ $( '#' + _prefix + 'show-preview' ).html( PT_CV_ADMIN.btn.preview.update );
610
+
611
+ // Enable preview
612
+ $self.options.can_preview = 1;
613
+ };
614
+ // Bind on change input after page load
615
+ $( '.pt-wrap .tab-content' ).on( 'change', 'input, select, textarea', function ( evt, is_trigger ) {
616
+ _fn( is_trigger );
617
+ } );
618
+
619
+ $( 'body' ).bind( _prefix + 'preview-btn-toggle', function () {
620
+ _fn();
621
+ } );
622
+ },
623
+ /**
624
+ * Validate number: prevent negative value
625
+ * @returns {undefined}
626
+ */
627
+ validate_number: function () {
628
+ $( 'input[type="number"]' ).on( 'keypress', function ( event ) {
629
+ var min = $( this ).prop( 'min' );
630
+ if ( min == 0 && !( event.charCode >= 48 && event.charCode <= 57 ) )
631
+ event.preventDefault();
632
+ } );
633
+ }
634
+ };
635
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
636
  }( jQuery ) );
admin/content-views-admin.php CHANGED
@@ -354,7 +354,7 @@ class PT_Content_Views_Admin {
354
  // Get View id
355
  $view_id = get_post_meta( $post_id, PT_CV_META_ID, true );
356
 
357
- printf( '<input style="width: 200px; background: #ADFFAD;" type="text" value="[pt_view id=&quot;%s&quot;]" onclick="this.select()" readonly="">', $view_id );
358
  }
359
  }
360
 
354
  // Get View id
355
  $view_id = get_post_meta( $post_id, PT_CV_META_ID, true );
356
 
357
+ printf( '<input style="width: 200px; background: #ADFFAD;" type="text" value="[pt_view id=&quot;%s&quot;]" onclick="this.select()" readonly="">', cv_sanitize_vid( $view_id ) );
358
  }
359
  }
360
 
admin/views/view.php CHANGED
@@ -1,709 +1,721 @@
1
- <?php
2
- /**
3
- * Add / Edit Content Views
4
- *
5
- * @package PT_Content_Views_Admin
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- // Check if using Wordpress version 3.7 or higher
16
- $version_gt_37 = PT_CV_Functions::wp_version_compare( '3.7' );
17
-
18
- $settings = array();
19
- $id = 0;
20
- $post_id = apply_filters( PT_CV_PREFIX_ . 'view_post_id', 0 );
21
-
22
- // Check if this is edit View page
23
- if ( !empty( $_GET[ 'id' ] ) ) {
24
- $id = cv_sanitize_vid( $_GET[ 'id' ] );
25
-
26
- if ( $id ) {
27
- global $pt_cv_admin_settings;
28
- $pt_cv_admin_settings = $settings = PT_CV_Functions::view_get_settings( $id, $post_id );
29
- }
30
- }
31
-
32
- // Submit handle
33
- PT_CV_Functions::view_submit();
34
- ?>
35
-
36
- <div class="wrap form-horizontal pt-wrap">
37
- <?php do_action( PT_CV_PREFIX_ . 'admin_view_header' ); ?>
38
-
39
- <h2><?php echo esc_html( $id ? __( 'Edit View', 'content-views-query-and-display-post-page' ) : get_admin_page_title() ); ?></h2>
40
-
41
- <?php
42
- if ( $id ) {
43
- ?>
44
- <div>
45
- <div class="view-code">For page content, text widget... <input class="form-control" style="width: 190px;background-color: #ADFFAD;margin-right: 50px;" type="text" value="[pt_view id=&quot;<?php echo $id ?>&quot;]" onclick="this.select()" readonly=""></div>
46
- <div class="view-code">For theme file <input class="form-control" style="width: 370px;" type="text" value='&lt;?php echo do_shortcode("[pt_view id=<?php echo $id ?>]"); ?&gt;' onclick="this.select()" readonly=""></div>
47
- <?php echo apply_filters( PT_CV_PREFIX_ . 'view_actions', '<a class="btn btn-info pull-right" target="_blank" href="https://www.contentviewspro.com/pricing/?utm_source=client&utm_medium=view_header&utm_campaign=gopro">get Pro version</a>', $id ) ?>
48
- </div>
49
- <div class="clear"></div>
50
- <?php
51
- }
52
- ?>
53
-
54
- <div class="preview-wrapper">
55
- <?php
56
- // Preview
57
- $options = array(
58
- array(
59
- 'label' => array(
60
- 'text' => __( 'Preview' ),
61
- ),
62
- 'params' => array(
63
- array(
64
- 'type' => 'html',
65
- 'name' => 'preview',
66
- 'content' => PT_CV_Html::html_preview_box(),
67
- 'desc' => sprintf( __( 'To see live output, please click %s button', 'content-views-query-and-display-post-page' ), sprintf( '<code>%s</code>', __( 'Show Preview', 'content-views-query-and-display-post-page' ) ) ),
68
- ),
69
- ),
70
- ),
71
- );
72
- echo PT_Options_Framework::do_settings( $options, $settings );
73
- ?>
74
- </div>
75
-
76
- <!-- Show Preview -->
77
- <a class="btn btn-success" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>show-preview"><?php _e( 'Show Preview', 'content-views-query-and-display-post-page' ); ?></a>
78
-
79
- <br>
80
-
81
- <!-- Settings form -->
82
- <form action="" method="POST" id="<?php echo esc_attr( PT_CV_PREFIX . 'form-view' ); ?>">
83
-
84
- <?php
85
- // Add nonce field
86
- wp_nonce_field( PT_CV_PREFIX_ . 'view_submit', PT_CV_PREFIX_ . 'form_nonce' );
87
-
88
- $view_object = $post_id ? get_post( $post_id ) : null;
89
- ?>
90
- <!-- add hidden field -->
91
- <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'post-id' ); ?>" value="<?php echo esc_attr( $post_id ); ?>" />
92
- <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'view-id' ); ?>" value="<?php echo esc_attr( $id ); ?>" />
93
- <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'version' ); ?>" value="<?php echo esc_attr( apply_filters( PT_CV_PREFIX_ . 'view_version', 'free-' . PT_CV_VERSION ) ); ?>" />
94
-
95
- <?php
96
- // View title
97
- $options = array(
98
- array(
99
- 'label' => array(
100
- 'text' => __( 'Title' ),
101
- ),
102
- 'params' => array(
103
- array(
104
- 'type' => 'text',
105
- 'name' => 'view-title',
106
- 'std' => isset( $view_object->post_title ) ? $view_object->post_title : '',
107
- 'desc' => __( 'Enter a name to identify your views easily', 'content-views-query-and-display-post-page' ),
108
- ),
109
- ),
110
- ),
111
- );
112
- echo PT_Options_Framework::do_settings( $options, $settings );
113
- ?>
114
- <br>
115
-
116
- <!-- Save -->
117
- <div class="btn-cvp-action">
118
- <input type="submit" class="btn btn-primary pull-right <?php echo esc_attr( PT_CV_PREFIX ); ?>save-view" value="<?php _e( 'Save' ); ?>">
119
- <?php do_action( PT_CV_PREFIX_ . 'admin_more_buttons' ); ?>
120
- </div>
121
-
122
- <!-- Nav tabs -->
123
- <ul class="nav nav-tabs">
124
- <li class="active">
125
- <a href="#<?php echo esc_attr( PT_CV_PREFIX ); ?>filter-settings" data-toggle="tab"><span class="glyphicon glyphicon-search"></span><?php _e( 'Filter Settings', 'content-views-query-and-display-post-page' ); ?>
126
- </a>
127
- </li>
128
- <li>
129
- <a href="#<?php echo esc_attr( PT_CV_PREFIX ); ?>display-settings" data-toggle="tab"><span class="glyphicon glyphicon-th-large"></span><?php _e( 'Display Settings', 'content-views-query-and-display-post-page' ); ?>
130
- </a>
131
- </li>
132
- <?php do_action( PT_CV_PREFIX_ . 'setting_tabs_header', $settings ); ?>
133
- </ul>
134
-
135
- <!-- Tab panes -->
136
- <div class="tab-content">
137
- <!-- Filter Settings -->
138
- <div class="tab-pane active" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>filter-settings">
139
- <?php
140
- $options = array(
141
- // Content type
142
- array(
143
- 'label' => array(
144
- 'text' => __( 'Content type', 'content-views-query-and-display-post-page' ),
145
- ),
146
- 'params' => array(
147
- apply_filters( PT_CV_PREFIX_ . 'contenttype_setting', array(
148
- 'type' => 'radio',
149
- 'name' => 'content-type',
150
- 'options' => PT_CV_Values::post_types(),
151
- 'std' => 'post',
152
- ) ),
153
- ),
154
- ),
155
- // Upgrade to Pro: Custom post type
156
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Filter custom post type (product, event...)', 'content-views-query-and-display-post-page' ) ) : '',
157
- apply_filters( PT_CV_PREFIX_ . 'custom_filters', array() ),
158
- // Common Filters
159
- array(
160
- 'label' => array(
161
- 'text' => __( 'Common', 'content-views-query-and-display-post-page' ),
162
- ),
163
- 'extra_setting' => array(
164
- 'params' => array(
165
- 'wrap-class' => PT_CV_Html::html_group_class(),
166
- ),
167
- ),
168
- 'params' => array(
169
- array(
170
- 'type' => 'group',
171
- 'params' => array(
172
- apply_filters( PT_CV_PREFIX_ . 'sticky_posts_setting', array() ),
173
- // Includes
174
- array(
175
- 'label' => array(
176
- 'text' => __( 'Include only', 'content-views-query-and-display-post-page' ),
177
- ),
178
- 'params' => array(
179
- array(
180
- 'type' => 'text',
181
- 'name' => 'post__in',
182
- 'std' => '',
183
- 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_post_in', __( 'List of post IDs to show (comma-separated values, for example: 1,2,3)', 'content-views-query-and-display-post-page' ) ),
184
- ),
185
- ),
186
- ),
187
- apply_filters( PT_CV_PREFIX_ . 'include_extra_settings', array() ),
188
- // Excludes
189
- array(
190
- 'label' => array(
191
- 'text' => __( 'Exclude', 'content-views-query-and-display-post-page' ),
192
- ),
193
- 'params' => array(
194
- array(
195
- 'type' => 'text',
196
- 'name' => 'post__not_in',
197
- 'std' => '',
198
- 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_post_not_in', __( 'List of post IDs to exclude (comma-separated values, for example: 1,2,3)', 'content-views-query-and-display-post-page' ) ),
199
- ),
200
- ),
201
- 'dependence' => array( 'post__in', '' ),
202
- ),
203
- apply_filters( PT_CV_PREFIX_ . 'exclude_extra_settings', array() ),
204
- // Parent page
205
- array(
206
- 'label' => array(
207
- 'text' => __( 'Parent page', 'content-views-query-and-display-post-page' ),
208
- ),
209
- 'params' => array(
210
- array(
211
- 'type' => 'number',
212
- 'name' => 'post_parent',
213
- 'std' => '',
214
- 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_parent_page', __( 'Enter ID of parent page to show its children', 'content-views-query-and-display-post-page' ) ),
215
- ),
216
- ),
217
- 'dependence' => array( 'content-type', apply_filters( PT_CV_PREFIX_ . 'hierarchical_post_type', array( 'page' ) ) ),
218
- ),
219
- apply_filters( PT_CV_PREFIX_ . 'post_parent_settings', array() ),
220
- // Limit
221
- array(
222
- 'label' => array(
223
- 'text' => __( 'Limit', 'content-views-query-and-display-post-page' ),
224
- ),
225
- 'params' => array(
226
- array(
227
- 'type' => 'number',
228
- 'name' => 'limit',
229
- 'std' => '10',
230
- 'min' => '1',
231
- 'desc' => __( 'Total number of posts to show. Leave empty to show all found posts', 'content-views-query-and-display-post-page' ),
232
- ),
233
- ),
234
- ),
235
- apply_filters( PT_CV_PREFIX_ . 'after_limit_option', '' ),
236
- ),
237
- ),
238
- ),
239
- ), // End Common Filters
240
- // Advanced Filters
241
- array(
242
- 'label' => array(
243
- 'text' => __( 'Advance', 'content-views-query-and-display-post-page' ),
244
- ),
245
- 'extra_setting' => array(
246
- 'params' => array(
247
- 'wrap-class' => PT_CV_Html::html_group_class(),
248
- 'wrap-id' => PT_CV_Html::html_group_id( 'advanced-params' ),
249
- ),
250
- ),
251
- 'params' => array(
252
- array(
253
- 'type' => 'group',
254
- 'params' => array(
255
- array(
256
- 'label' => array(
257
- 'text' => '',
258
- ),
259
- 'extra_setting' => array(
260
- 'params' => array(
261
- 'width' => 12,
262
- ),
263
- ),
264
- 'params' => array(
265
- array(
266
- 'type' => 'checkbox',
267
- 'name' => 'advanced-settings[]',
268
- 'options' => PT_CV_Values::advanced_settings(),
269
- 'std' => '',
270
- 'class' => 'advanced-settings-item',
271
- ),
272
- ),
273
- ),
274
- ),
275
- ),
276
- ),
277
- ), // End Advanced Filters
278
- // Settings of Advanced Filters options
279
- array(
280
- 'label' => array(
281
- 'text' => '',
282
- ),
283
- 'extra_setting' => array(
284
- 'params' => array(
285
- 'wrap-class' => PT_CV_Html::html_panel_group_class(),
286
- 'wrap-id' => PT_CV_Html::html_panel_group_id( PT_CV_Functions::string_random() ),
287
- ),
288
- ),
289
- 'params' => array(
290
- array(
291
- 'type' => 'panel_group',
292
- 'params' => apply_filters( PT_CV_PREFIX_ . 'advanced_settings_panel', array(
293
- // Taxonomies Settings
294
- 'taxonomy' => array(
295
- 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Taxonomy', 'content-views-query-and-display-post-page' ) ),
296
- // Taxonomies list
297
- array(
298
- 'label' => array(
299
- 'text' => __( 'Select taxonomy', 'content-views-query-and-display-post-page' ),
300
- ),
301
- 'extra_setting' => array(
302
- 'params' => array(
303
- 'wrap-class' => PT_CV_PREFIX . 'taxonomies',
304
- ),
305
- ),
306
- 'params' => array(
307
- array(
308
- 'type' => 'checkbox',
309
- 'name' => 'taxonomy[]',
310
- 'options' => PT_CV_Values::taxonomy_list(),
311
- 'std' => '',
312
- 'class' => 'taxonomy-item',
313
- ),
314
- ),
315
- ),
316
- // Upgrade to Pro: Custom taxonomy
317
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Filter by custom taxonomy', 'content-views-query-and-display-post-page' ) ) : '',
318
- // Terms list
319
- array(
320
- 'label' => array(
321
- 'text' => '',
322
- ),
323
- 'extra_setting' => array(
324
- 'params' => array(
325
- 'wrap-class' => PT_CV_Html::html_panel_group_class() . ' terms',
326
- 'wrap-id' => PT_CV_Html::html_panel_group_id( PT_CV_Functions::string_random() ),
327
- ),
328
- ),
329
- 'params' => array(
330
- array(
331
- 'type' => 'panel_group',
332
- 'settings' => array(
333
- 'nice_name' => PT_CV_Values::taxonomy_list(),
334
- ),
335
- 'params' => PT_CV_Settings::terms_of_taxonomies(),
336
- ),
337
- ),
338
- ),
339
- // Relation of taxonomies
340
- array(
341
- 'label' => array(
342
- 'text' => __( 'Relation', 'content-views-query-and-display-post-page' ),
343
- ),
344
- 'params' => array(
345
- array(
346
- 'type' => 'select',
347
- 'name' => 'taxonomy-relation',
348
- 'options' => PT_CV_Values::taxonomy_relation(),
349
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::taxonomy_relation() ),
350
- 'class' => 'taxonomy-relation',
351
- 'desc' => __( 'The logical relationship between above taxonomies', 'content-views-query-and-display-post-page' ),
352
- ),
353
- ),
354
- ),
355
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'In this lite version, it is not possible to replace posts layout in category/tag page with the layout of this View.<br>In the Pro version, it is possible', 'content-views-query-and-display-post-page' ), 12, null, true ) : '',
356
- apply_filters( PT_CV_PREFIX_ . 'taxonomies_custom_settings', array() ),
357
- ), // End Taxonomies Settings
358
- // Sort by Settings
359
- 'order' => array(
360
- 'parent_label' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
361
- array(
362
- 'label' => array(
363
- 'text' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
364
- ),
365
- 'extra_setting' => array(
366
- 'params' => array(
367
- 'width' => 12,
368
- ),
369
- ),
370
- 'params' => array(
371
- array(
372
- 'type' => 'panel_group',
373
- 'settings' => array(
374
- 'show_all' => 1,
375
- ),
376
- 'params' => PT_CV_Settings::orderby(),
377
- ),
378
- ),
379
- ),
380
- ), // End Order by Settings
381
- // Author Settings
382
- 'author' => apply_filters( PT_CV_PREFIX_ . 'author_settings', array(
383
- 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Author' ) ),
384
- array(
385
- 'label' => array(
386
- 'text' => __( 'By author', 'content-views-query-and-display-post-page' ),
387
- ),
388
- 'params' => array(
389
- array(
390
- 'type' => 'select',
391
- 'name' => 'author__in[]',
392
- 'options' => PT_CV_Values::user_list(),
393
- 'std' => '',
394
- 'class' => 'select2',
395
- 'multiple' => $version_gt_37 ? '1' : '0',
396
- ),
397
- ),
398
- ),
399
- $version_gt_37 ?
400
- array(
401
- 'label' => array(
402
- 'text' => __( 'Not by author', 'content-views-query-and-display-post-page' ),
403
- ),
404
- 'params' => array(
405
- array(
406
- 'type' => 'select',
407
- 'name' => 'author__not_in[]',
408
- 'options' => PT_CV_Values::user_list(),
409
- 'std' => '',
410
- 'class' => 'select2',
411
- 'multiple' => $version_gt_37 ? '1' : '0',
412
- ),
413
- ),
414
- ) : array(),
415
- ) ), // End Author Settings
416
- // Status Settings
417
- 'status' => array(
418
- 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Status' ) ),
419
- array(
420
- 'label' => array(
421
- 'text' => '',
422
- ),
423
- 'extra_setting' => array(
424
- 'params' => array(
425
- 'width' => 12,
426
- ),
427
- ),
428
- 'params' => array(
429
- array(
430
- 'type' => 'select',
431
- 'name' => 'post_status',
432
- 'options' => PT_CV_Values::post_statuses(),
433
- 'std' => 'publish',
434
- 'class' => 'select2',
435
- 'multiple' => '1',
436
- 'desc' => __( 'Select post status', 'content-views-query-and-display-post-page' ),
437
- ),
438
- ),
439
- ),
440
- ), // End Status Settings
441
- // Keyword Settings
442
- 'search' => array(
443
- 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Keyword' ) ),
444
- apply_filters( PT_CV_PREFIX_ . 'search_settings', array(
445
- 'label' => array(
446
- 'text' => '',
447
- ),
448
- 'extra_setting' => array(
449
- 'params' => array(
450
- 'width' => 12,
451
- ),
452
- ),
453
- 'params' => array(
454
- array(
455
- 'type' => 'text',
456
- 'name' => 's',
457
- 'std' => '',
458
- 'desc' => __( 'Enter keyword to searching for posts', 'content-views-query-and-display-post-page' ) . apply_filters( PT_CV_PREFIX_ . 'searchby_keyword_desc', '' ) . '.<br>' . __( 'It will search keyword in title, excerpt, content of posts', 'content-views-query-and-display-post-page' ),
459
- ),
460
- ),
461
- ) ),
462
- ), // End Keyword Settings
463
- )
464
- ),
465
- ),
466
- ),
467
- ),
468
- );
469
- echo PT_Options_Framework::do_settings( $options, $settings );
470
- ?>
471
- </div>
472
- <!-- end Filter Settings -->
473
-
474
- <!-- Display Settings -->
475
- <div class="tab-pane" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>display-settings">
476
- <?php
477
- $options = array(
478
- // View Type
479
- array(
480
- 'label' => array(
481
- 'text' => __( 'Layout', 'content-views-query-and-display-post-page' ),
482
- ),
483
- 'params' => array(
484
- apply_filters( PT_CV_PREFIX_ . 'viewtype_setting', array(
485
- 'type' => 'radio',
486
- 'name' => 'view-type',
487
- 'options' => PT_CV_Values::view_type(),
488
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::view_type() ),
489
- ) ),
490
- ),
491
- ),
492
- // View settings
493
- array(
494
- 'label' => array(
495
- 'text' => '',
496
- ),
497
- 'params' => array(
498
- array(
499
- 'type' => 'panel_group',
500
- 'settings' => array(
501
- 'no_panel' => 1,
502
- 'show_only_one' => 1,
503
- ),
504
- 'params' => PT_CV_Values::view_type_settings(),
505
- ),
506
- ),
507
- ),
508
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'More amazing layouts (Pinterest, Timeline...)', 'content-views-query-and-display-post-page' ), 10, 'margin-bottom:10px' ) : '',
509
- apply_filters( PT_CV_PREFIX_ . 'more_responsive_settings', array(
510
- 'label' => array(
511
- 'text' => __( 'Responsive', 'content-views-query-and-display-post-page' ),
512
- ),
513
- 'params' => array(
514
- array(
515
- 'type' => 'group',
516
- 'params' => array(
517
- array(
518
- 'label' => array(
519
- 'text' => sprintf( '%s (%s)', __( 'Items per row', 'content-views-query-and-display-post-page' ), __( 'Tablet', 'content-views-query-and-display-post-page' ) ),
520
- ),
521
- 'params' => array(
522
- array(
523
- 'type' => 'number',
524
- 'name' => 'resp-tablet-number-columns',
525
- 'std' => '2',
526
- 'append_text' => '1 &rarr; 4',
527
- ),
528
- ),
529
- ),
530
- array(
531
- 'label' => array(
532
- 'text' => sprintf( '%s (%s)', __( 'Items per row', 'content-views-query-and-display-post-page' ), __( 'Mobile', 'content-views-query-and-display-post-page' ) ),
533
- ),
534
- 'params' => array(
535
- array(
536
- 'type' => 'number',
537
- 'name' => 'resp-number-columns',
538
- 'std' => '1',
539
- 'append_text' => '1 &rarr; 4',
540
- ),
541
- ),
542
- ),
543
- ),
544
- ),
545
- ),
546
- 'dependence' => array( 'view-type', !get_option( 'pt_cv_version_pro' ) ? array( 'grid' ) : array( 'grid', 'scrollable', 'pinterest', 'glossary' ) ),
547
- ) ),
548
- array(
549
- 'label' => array(
550
- 'text' => __( 'Format', 'content-views-query-and-display-post-page' ),
551
- ),
552
- 'extra_setting' => array(
553
- 'params' => array(
554
- 'wrap-class' => PT_CV_Html::html_group_class(),
555
- ),
556
- ),
557
- 'params' => array(
558
- array(
559
- 'type' => 'group',
560
- 'params' => apply_filters( PT_CV_PREFIX_ . 'format_settings', array(
561
- array(
562
- 'label' => array(
563
- 'text' => '',
564
- ),
565
- 'extra_setting' => array(
566
- 'params' => array(
567
- 'width' => 12,
568
- ),
569
- ),
570
- 'params' => array(
571
- array(
572
- 'type' => 'radio',
573
- 'name' => 'layout-format',
574
- 'options' => PT_CV_Values::layout_format(),
575
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::layout_format() ),
576
- ),
577
- ),
578
- ),
579
- array(
580
- 'label' => array(
581
- 'text' => '',
582
- ),
583
- 'extra_setting' => array(
584
- 'params' => array(
585
- 'width' => 12,
586
- ),
587
- ),
588
- 'params' => array(
589
- array(
590
- 'type' => 'html',
591
- 'content' => sprintf( '<p class="text-muted" style="margin-top: -8px">%s.</p>', __( 'It requires enough horizontal space. You might reduce <code>Items Per Row</code> above if available, or select smaller thumbnail size below', 'content-views-query-and-display-post-page' ) ),
592
- ),
593
- ),
594
- 'dependence' => array( 'layout-format', '2-col' ),
595
- ),
596
- array(
597
- 'label' => array(
598
- 'text' => '',
599
- ),
600
- 'extra_setting' => array(
601
- 'params' => array(
602
- 'width' => 12,
603
- ),
604
- ),
605
- 'params' => array(
606
- array(
607
- 'type' => 'checkbox',
608
- 'name' => 'lf-nowrap',
609
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Do not wrap text around image', 'content-views-query-and-display-post-page' ) ),
610
- 'std' => '',
611
- ),
612
- ),
613
- 'dependence' => array( 'layout-format', '2-col' ),
614
- ),
615
- array(
616
- 'label' => array(
617
- 'text' => '',
618
- ),
619
- 'extra_setting' => array(
620
- 'params' => array(
621
- 'width' => 12,
622
- ),
623
- ),
624
- 'params' => array(
625
- array(
626
- 'type' => 'checkbox',
627
- 'name' => 'lf-mobile-disable',
628
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Disable this format on small screens (less than 481 pixels)', 'content-views-query-and-display-post-page' ) ),
629
- 'std' => '',
630
- ),
631
- ),
632
- 'dependence' => array( 'layout-format', '2-col' ),
633
- ),
634
- ) ),
635
- ),
636
- ),
637
- ),
638
- // Fields settings
639
- array(
640
- 'label' => array(
641
- 'text' => __( 'Fields settings', 'content-views-query-and-display-post-page' ),
642
- ),
643
- 'extra_setting' => array(
644
- 'params' => array(
645
- 'wrap-class' => PT_CV_Html::html_group_class(),
646
- 'wrap-id' => PT_CV_Html::html_group_id( 'field-settings' ),
647
- ),
648
- ),
649
- 'params' => array(
650
- array(
651
- 'type' => 'group',
652
- 'params' => PT_CV_Settings::field_settings(),
653
- ),
654
- ),
655
- ),
656
- // Pagination settings
657
- array(
658
- 'label' => array(
659
- 'text' => __( 'Pagination', 'content-views-query-and-display-post-page' ),
660
- ),
661
- 'extra_setting' => array(
662
- 'params' => array(
663
- 'wrap-class' => PT_CV_Html::html_group_class(),
664
- ),
665
- ),
666
- 'params' => array(
667
- array(
668
- 'type' => 'group',
669
- 'params' => PT_CV_Settings::settings_pagination(),
670
- ),
671
- ),
672
- ),
673
- // Other settings
674
- array(
675
- 'label' => array(
676
- 'text' => __( 'Others', 'content-views-query-and-display-post-page' ),
677
- ),
678
- 'extra_setting' => array(
679
- 'params' => array(
680
- 'wrap-class' => PT_CV_Html::html_group_class(),
681
- ),
682
- ),
683
- 'params' => array(
684
- array(
685
- 'type' => 'group',
686
- 'params' => PT_CV_Settings::settings_other(),
687
- ),
688
- ),
689
- ),
690
- );
691
-
692
- $options = apply_filters( PT_CV_PREFIX_ . 'display_settings', $options );
693
- echo PT_Options_Framework::do_settings( $options, $settings );
694
- ?>
695
- </div>
696
- <!-- end Display Settings -->
697
-
698
- <?php
699
- do_action( PT_CV_PREFIX_ . 'setting_tabs_content', $settings );
700
- ?>
701
-
702
- </div>
703
-
704
- <div class="clearfix"></div>
705
- <hr>
706
- <!-- Save -->
707
- <input type="submit" class="btn btn-primary pull-right <?php echo esc_attr( PT_CV_PREFIX ); ?>save-view" value="<?php _e( 'Save' ); ?>">
708
- </form>
709
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Add / Edit Content Views
4
+ *
5
+ * @package PT_Content_Views_Admin
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ // Check if using Wordpress version 3.7 or higher
16
+ $version_gt_37 = PT_CV_Functions::wp_version_compare( '3.7' );
17
+
18
+ $settings = array();
19
+ $id = 0;
20
+ $post_id = apply_filters( PT_CV_PREFIX_ . 'view_post_id', 0 );
21
+
22
+ // Check if this is edit View page
23
+ if ( !empty( $_GET[ 'id' ] ) ) {
24
+ $id = cv_sanitize_vid( $_GET[ 'id' ] );
25
+
26
+ if ( $id ) {
27
+ global $pt_cv_admin_settings;
28
+ $pt_cv_admin_settings = $settings = PT_CV_Functions::view_get_settings( $id, $post_id );
29
+ }
30
+ }
31
+
32
+ // Submit handle
33
+ PT_CV_Functions::view_submit();
34
+ ?>
35
+
36
+ <div class="wrap form-horizontal pt-wrap">
37
+ <?php do_action( PT_CV_PREFIX_ . 'admin_view_header' ); ?>
38
+
39
+ <h2><?php echo esc_html( $id ? __( 'Edit View', 'content-views-query-and-display-post-page' ) : get_admin_page_title() ); ?></h2>
40
+
41
+ <?php
42
+ if ( $id ) {
43
+ ?>
44
+ <div>
45
+ <div class="view-code">For page content, text widget... <input class="form-control" style="width: 190px;background-color: #ADFFAD;margin-right: 50px;" type="text" value="[pt_view id=&quot;<?php echo $id ?>&quot;]" onclick="this.select()" readonly=""></div>
46
+ <div class="view-code">For theme file <input class="form-control" style="width: 370px;" type="text" value='&lt;?php echo do_shortcode("[pt_view id=<?php echo $id ?>]"); ?&gt;' onclick="this.select()" readonly=""></div>
47
+ <?php echo apply_filters( PT_CV_PREFIX_ . 'view_actions', '<a class="btn btn-info pull-right" target="_blank" href="https://www.contentviewspro.com/pricing/?utm_source=client&utm_medium=view_header&utm_campaign=gopro">get Pro version</a>', $id ) ?>
48
+ </div>
49
+ <div class="clear"></div>
50
+ <?php
51
+ }
52
+ ?>
53
+
54
+ <div class="preview-wrapper">
55
+ <?php
56
+ // Preview
57
+ $options = array(
58
+ array(
59
+ 'label' => array(
60
+ 'text' => __( 'Preview' ),
61
+ ),
62
+ 'params' => array(
63
+ array(
64
+ 'type' => 'html',
65
+ 'name' => 'preview',
66
+ 'content' => PT_CV_Html::html_preview_box(),
67
+ 'desc' => sprintf( __( 'To see live output, please click %s button', 'content-views-query-and-display-post-page' ), sprintf( '<code>%s</code>', __( 'Show Preview', 'content-views-query-and-display-post-page' ) ) ),
68
+ ),
69
+ ),
70
+ ),
71
+ );
72
+ echo PT_Options_Framework::do_settings( $options, $settings );
73
+ ?>
74
+ </div>
75
+
76
+ <!-- Show Preview -->
77
+ <a class="btn btn-success" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>show-preview"><?php _e( 'Show Preview', 'content-views-query-and-display-post-page' ); ?></a>
78
+
79
+ <br>
80
+
81
+ <!-- Settings form -->
82
+ <form action="" method="POST" id="<?php echo esc_attr( PT_CV_PREFIX . 'form-view' ); ?>">
83
+
84
+ <?php
85
+ // Add nonce field
86
+ wp_nonce_field( PT_CV_PREFIX_ . 'view_submit', PT_CV_PREFIX_ . 'form_nonce' );
87
+
88
+ $view_object = $post_id ? get_post( $post_id ) : null;
89
+ ?>
90
+ <!-- add hidden field -->
91
+ <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'post-id' ); ?>" value="<?php echo esc_attr( $post_id ); ?>" />
92
+ <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'view-id' ); ?>" value="<?php echo esc_attr( $id ); ?>" />
93
+ <input type="hidden" name="<?php echo esc_attr( PT_CV_PREFIX . 'version' ); ?>" value="<?php echo esc_attr( apply_filters( PT_CV_PREFIX_ . 'view_version', 'free-' . PT_CV_VERSION ) ); ?>" />
94
+
95
+ <?php
96
+ // View title
97
+ $options = array(
98
+ array(
99
+ 'label' => array(
100
+ 'text' => __( 'Title' ),
101
+ ),
102
+ 'params' => array(
103
+ array(
104
+ 'type' => 'text',
105
+ 'name' => 'view-title',
106
+ 'std' => isset( $view_object->post_title ) ? $view_object->post_title : '',
107
+ 'desc' => __( 'Enter a name to identify your views easily', 'content-views-query-and-display-post-page' ),
108
+ ),
109
+ ),
110
+ ),
111
+ );
112
+ echo PT_Options_Framework::do_settings( $options, $settings );
113
+ ?>
114
+ <br>
115
+
116
+ <!-- Save -->
117
+ <div class="btn-cvp-action">
118
+ <input type="submit" class="btn btn-primary pull-right <?php echo esc_attr( PT_CV_PREFIX ); ?>save-view" value="<?php _e( 'Save' ); ?>">
119
+ <?php do_action( PT_CV_PREFIX_ . 'admin_more_buttons' ); ?>
120
+ </div>
121
+
122
+ <!-- Nav tabs -->
123
+ <ul class="nav nav-tabs">
124
+ <li class="active">
125
+ <a href="#<?php echo esc_attr( PT_CV_PREFIX ); ?>filter-settings" data-toggle="tab"><span class="glyphicon glyphicon-search"></span><?php _e( 'Filter Settings', 'content-views-query-and-display-post-page' ); ?>
126
+ </a>
127
+ </li>
128
+ <li>
129
+ <a href="#<?php echo esc_attr( PT_CV_PREFIX ); ?>display-settings" data-toggle="tab"><span class="glyphicon glyphicon-th-large"></span><?php _e( 'Display Settings', 'content-views-query-and-display-post-page' ); ?>
130
+ </a>
131
+ </li>
132
+ <?php do_action( PT_CV_PREFIX_ . 'setting_tabs_header', $settings ); ?>
133
+ </ul>
134
+
135
+ <!-- Tab panes -->
136
+ <div class="tab-content">
137
+ <!-- Filter Settings -->
138
+ <div class="tab-pane active" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>filter-settings">
139
+ <?php
140
+ $options = array(
141
+ // Content type
142
+ array(
143
+ 'label' => array(
144
+ 'text' => __( 'Content type', 'content-views-query-and-display-post-page' ),
145
+ ),
146
+ 'params' => array(
147
+ apply_filters( PT_CV_PREFIX_ . 'contenttype_setting', array(
148
+ 'type' => 'radio',
149
+ 'name' => 'content-type',
150
+ 'options' => PT_CV_Values::post_types(),
151
+ 'std' => 'post',
152
+ ) ),
153
+ ),
154
+ ),
155
+ // Upgrade to Pro: Custom post type
156
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Filter custom post type (product, event...)', 'content-views-query-and-display-post-page' ) ) : '',
157
+ apply_filters( PT_CV_PREFIX_ . 'custom_filters', array() ),
158
+ // Common Filters
159
+ array(
160
+ 'label' => array(
161
+ 'text' => __( 'Common', 'content-views-query-and-display-post-page' ),
162
+ ),
163
+ 'extra_setting' => array(
164
+ 'params' => array(
165
+ 'wrap-class' => PT_CV_Html::html_group_class(),
166
+ ),
167
+ ),
168
+ 'params' => array(
169
+ array(
170
+ 'type' => 'group',
171
+ 'params' => array(
172
+ apply_filters( PT_CV_PREFIX_ . 'sticky_posts_setting', array() ),
173
+ // Includes
174
+ array(
175
+ 'label' => array(
176
+ 'text' => __( 'Include only', 'content-views-query-and-display-post-page' ),
177
+ ),
178
+ 'params' => array(
179
+ array(
180
+ 'type' => 'text',
181
+ 'name' => 'post__in',
182
+ 'std' => '',
183
+ 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_post_in', __( 'List of post IDs to show (comma-separated values, for example: 1,2,3)', 'content-views-query-and-display-post-page' ) ),
184
+ ),
185
+ ),
186
+ ),
187
+ apply_filters( PT_CV_PREFIX_ . 'include_extra_settings', array() ),
188
+ // Excludes
189
+ array(
190
+ 'label' => array(
191
+ 'text' => __( 'Exclude', 'content-views-query-and-display-post-page' ),
192
+ ),
193
+ 'params' => array(
194
+ array(
195
+ 'type' => 'text',
196
+ 'name' => 'post__not_in',
197
+ 'std' => '',
198
+ 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_post_not_in', __( 'List of post IDs to exclude (comma-separated values, for example: 1,2,3)', 'content-views-query-and-display-post-page' ) ),
199
+ ),
200
+ ),
201
+ 'dependence' => array( 'post__in', '' ),
202
+ ),
203
+ apply_filters( PT_CV_PREFIX_ . 'exclude_extra_settings', array() ),
204
+ // Parent page
205
+ array(
206
+ 'label' => array(
207
+ 'text' => __( 'Parent page', 'content-views-query-and-display-post-page' ),
208
+ ),
209
+ 'params' => array(
210
+ array(
211
+ 'type' => 'number',
212
+ 'name' => 'post_parent',
213
+ 'std' => '',
214
+ 'desc' => apply_filters( PT_CV_PREFIX_ . 'setting_parent_page', __( 'Enter ID of parent page to show its children', 'content-views-query-and-display-post-page' ) ),
215
+ ),
216
+ ),
217
+ 'dependence' => array( 'content-type', apply_filters( PT_CV_PREFIX_ . 'hierarchical_post_type', array( 'page' ) ) ),
218
+ ),
219
+ apply_filters( PT_CV_PREFIX_ . 'post_parent_settings', array() ),
220
+ // Limit
221
+ array(
222
+ 'label' => array(
223
+ 'text' => __( 'Limit', 'content-views-query-and-display-post-page' ),
224
+ ),
225
+ 'params' => array(
226
+ array(
227
+ 'type' => 'number',
228
+ 'name' => 'limit',
229
+ 'std' => '10',
230
+ 'min' => '1',
231
+ 'desc' => __( 'Total number of posts to show. Leave empty to show all found posts', 'content-views-query-and-display-post-page' ),
232
+ ),
233
+ ),
234
+ ),
235
+ array(
236
+ 'label' => array(
237
+ 'text' => '',
238
+ ),
239
+ 'params' => array(
240
+ array(
241
+ 'type' => 'html',
242
+ 'content' => sprintf( '<p class="alert-warning" style="margin-top:-10px;padding:0;">%s</p>', __( 'Leaving it empty might cause performance issues. You should enable pagination (on the next tab) in this case.', 'content-views-query-and-display-post-page' ) ),
243
+ ),
244
+ ),
245
+ 'dependence' => array( 'limit', '' ),
246
+ ),
247
+ apply_filters( PT_CV_PREFIX_ . 'after_limit_option', '' ),
248
+ ),
249
+ ),
250
+ ),
251
+ ), // End Common Filters
252
+ // Advanced Filters
253
+ array(
254
+ 'label' => array(
255
+ 'text' => __( 'Advance', 'content-views-query-and-display-post-page' ),
256
+ ),
257
+ 'extra_setting' => array(
258
+ 'params' => array(
259
+ 'wrap-class' => PT_CV_Html::html_group_class(),
260
+ 'wrap-id' => PT_CV_Html::html_group_id( 'advanced-params' ),
261
+ ),
262
+ ),
263
+ 'params' => array(
264
+ array(
265
+ 'type' => 'group',
266
+ 'params' => array(
267
+ array(
268
+ 'label' => array(
269
+ 'text' => '',
270
+ ),
271
+ 'extra_setting' => array(
272
+ 'params' => array(
273
+ 'width' => 12,
274
+ ),
275
+ ),
276
+ 'params' => array(
277
+ array(
278
+ 'type' => 'checkbox',
279
+ 'name' => 'advanced-settings[]',
280
+ 'options' => PT_CV_Values::advanced_settings(),
281
+ 'std' => '',
282
+ 'class' => 'advanced-settings-item',
283
+ ),
284
+ ),
285
+ ),
286
+ ),
287
+ ),
288
+ ),
289
+ ), // End Advanced Filters
290
+ // Settings of Advanced Filters options
291
+ array(
292
+ 'label' => array(
293
+ 'text' => '',
294
+ ),
295
+ 'extra_setting' => array(
296
+ 'params' => array(
297
+ 'wrap-class' => PT_CV_Html::html_panel_group_class(),
298
+ 'wrap-id' => PT_CV_Html::html_panel_group_id( PT_CV_Functions::string_random() ),
299
+ ),
300
+ ),
301
+ 'params' => array(
302
+ array(
303
+ 'type' => 'panel_group',
304
+ 'params' => apply_filters( PT_CV_PREFIX_ . 'advanced_settings_panel', array(
305
+ // Taxonomies Settings
306
+ 'taxonomy' => array(
307
+ 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Taxonomy', 'content-views-query-and-display-post-page' ) ),
308
+ // Taxonomies list
309
+ array(
310
+ 'label' => array(
311
+ 'text' => __( 'Select taxonomy', 'content-views-query-and-display-post-page' ),
312
+ ),
313
+ 'extra_setting' => array(
314
+ 'params' => array(
315
+ 'wrap-class' => PT_CV_PREFIX . 'taxonomies',
316
+ ),
317
+ ),
318
+ 'params' => array(
319
+ array(
320
+ 'type' => 'checkbox',
321
+ 'name' => 'taxonomy[]',
322
+ 'options' => PT_CV_Values::taxonomy_list(),
323
+ 'std' => '',
324
+ 'class' => 'taxonomy-item',
325
+ ),
326
+ ),
327
+ ),
328
+ // Upgrade to Pro: Custom taxonomy
329
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Filter by custom taxonomy', 'content-views-query-and-display-post-page' ) ) : '',
330
+ // Terms list
331
+ array(
332
+ 'label' => array(
333
+ 'text' => '',
334
+ ),
335
+ 'extra_setting' => array(
336
+ 'params' => array(
337
+ 'wrap-class' => PT_CV_Html::html_panel_group_class() . ' terms',
338
+ 'wrap-id' => PT_CV_Html::html_panel_group_id( PT_CV_Functions::string_random() ),
339
+ ),
340
+ ),
341
+ 'params' => array(
342
+ array(
343
+ 'type' => 'panel_group',
344
+ 'settings' => array(
345
+ 'nice_name' => PT_CV_Values::taxonomy_list(),
346
+ ),
347
+ 'params' => PT_CV_Settings::terms_of_taxonomies(),
348
+ ),
349
+ ),
350
+ ),
351
+ // Relation of taxonomies
352
+ array(
353
+ 'label' => array(
354
+ 'text' => __( 'Relation', 'content-views-query-and-display-post-page' ),
355
+ ),
356
+ 'params' => array(
357
+ array(
358
+ 'type' => 'select',
359
+ 'name' => 'taxonomy-relation',
360
+ 'options' => PT_CV_Values::taxonomy_relation(),
361
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::taxonomy_relation() ),
362
+ 'class' => 'taxonomy-relation',
363
+ 'desc' => __( 'The logical relationship between above taxonomies', 'content-views-query-and-display-post-page' ),
364
+ ),
365
+ ),
366
+ ),
367
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'In this lite version, it is not possible to replace posts layout in category/tag page with the layout of this View.<br>In the Pro version, it is possible', 'content-views-query-and-display-post-page' ), 12, null, true ) : '',
368
+ apply_filters( PT_CV_PREFIX_ . 'taxonomies_custom_settings', array() ),
369
+ ), // End Taxonomies Settings
370
+ // Sort by Settings
371
+ 'order' => array(
372
+ 'parent_label' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
373
+ array(
374
+ 'label' => array(
375
+ 'text' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
376
+ ),
377
+ 'extra_setting' => array(
378
+ 'params' => array(
379
+ 'width' => 12,
380
+ ),
381
+ ),
382
+ 'params' => array(
383
+ array(
384
+ 'type' => 'panel_group',
385
+ 'settings' => array(
386
+ 'show_all' => 1,
387
+ ),
388
+ 'params' => PT_CV_Settings::orderby(),
389
+ ),
390
+ ),
391
+ ),
392
+ ), // End Order by Settings
393
+ // Author Settings
394
+ 'author' => apply_filters( PT_CV_PREFIX_ . 'author_settings', array(
395
+ 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Author' ) ),
396
+ array(
397
+ 'label' => array(
398
+ 'text' => __( 'By author', 'content-views-query-and-display-post-page' ),
399
+ ),
400
+ 'params' => array(
401
+ array(
402
+ 'type' => 'select',
403
+ 'name' => 'author__in[]',
404
+ 'options' => PT_CV_Values::user_list(),
405
+ 'std' => '',
406
+ 'class' => 'select2',
407
+ 'multiple' => $version_gt_37 ? '1' : '0',
408
+ ),
409
+ ),
410
+ ),
411
+ $version_gt_37 ?
412
+ array(
413
+ 'label' => array(
414
+ 'text' => __( 'Not by author', 'content-views-query-and-display-post-page' ),
415
+ ),
416
+ 'params' => array(
417
+ array(
418
+ 'type' => 'select',
419
+ 'name' => 'author__not_in[]',
420
+ 'options' => PT_CV_Values::user_list(),
421
+ 'std' => '',
422
+ 'class' => 'select2',
423
+ 'multiple' => $version_gt_37 ? '1' : '0',
424
+ ),
425
+ ),
426
+ ) : array(),
427
+ ) ), // End Author Settings
428
+ // Status Settings
429
+ 'status' => array(
430
+ 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Status' ) ),
431
+ array(
432
+ 'label' => array(
433
+ 'text' => '',
434
+ ),
435
+ 'extra_setting' => array(
436
+ 'params' => array(
437
+ 'width' => 12,
438
+ ),
439
+ ),
440
+ 'params' => array(
441
+ array(
442
+ 'type' => 'select',
443
+ 'name' => 'post_status',
444
+ 'options' => PT_CV_Values::post_statuses(),
445
+ 'std' => 'publish',
446
+ 'class' => 'select2',
447
+ 'multiple' => '1',
448
+ 'desc' => __( 'Select post status', 'content-views-query-and-display-post-page' ),
449
+ ),
450
+ ),
451
+ ),
452
+ ), // End Status Settings
453
+ // Keyword Settings
454
+ 'search' => array(
455
+ 'parent_label' => sprintf( __( 'Filter by %s', 'content-views-query-and-display-post-page' ), __( 'Keyword' ) ),
456
+ apply_filters( PT_CV_PREFIX_ . 'search_settings', array(
457
+ 'label' => array(
458
+ 'text' => '',
459
+ ),
460
+ 'extra_setting' => array(
461
+ 'params' => array(
462
+ 'width' => 12,
463
+ ),
464
+ ),
465
+ 'params' => array(
466
+ array(
467
+ 'type' => 'text',
468
+ 'name' => 's',
469
+ 'std' => '',
470
+ 'desc' => __( 'Enter keyword to searching for posts', 'content-views-query-and-display-post-page' ) . apply_filters( PT_CV_PREFIX_ . 'searchby_keyword_desc', '' ) . '.<br>' . __( 'It will search keyword in title, excerpt, content of posts', 'content-views-query-and-display-post-page' ),
471
+ ),
472
+ ),
473
+ ) ),
474
+ ), // End Keyword Settings
475
+ )
476
+ ),
477
+ ),
478
+ ),
479
+ ),
480
+ );
481
+ echo PT_Options_Framework::do_settings( $options, $settings );
482
+ ?>
483
+ </div>
484
+ <!-- end Filter Settings -->
485
+
486
+ <!-- Display Settings -->
487
+ <div class="tab-pane" id="<?php echo esc_attr( PT_CV_PREFIX ); ?>display-settings">
488
+ <?php
489
+ $options = array(
490
+ // View Type
491
+ array(
492
+ 'label' => array(
493
+ 'text' => __( 'Layout', 'content-views-query-and-display-post-page' ),
494
+ ),
495
+ 'params' => array(
496
+ apply_filters( PT_CV_PREFIX_ . 'viewtype_setting', array(
497
+ 'type' => 'radio',
498
+ 'name' => 'view-type',
499
+ 'options' => PT_CV_Values::view_type(),
500
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::view_type() ),
501
+ ) ),
502
+ ),
503
+ ),
504
+ // View settings
505
+ array(
506
+ 'label' => array(
507
+ 'text' => '',
508
+ ),
509
+ 'params' => array(
510
+ array(
511
+ 'type' => 'panel_group',
512
+ 'settings' => array(
513
+ 'no_panel' => 1,
514
+ 'show_only_one' => 1,
515
+ ),
516
+ 'params' => PT_CV_Values::view_type_settings(),
517
+ ),
518
+ ),
519
+ ),
520
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'More amazing layouts (Pinterest, Timeline...)', 'content-views-query-and-display-post-page' ), 10, 'margin-bottom:10px' ) : '',
521
+ apply_filters( PT_CV_PREFIX_ . 'more_responsive_settings', array(
522
+ 'label' => array(
523
+ 'text' => __( 'Responsive', 'content-views-query-and-display-post-page' ),
524
+ ),
525
+ 'params' => array(
526
+ array(
527
+ 'type' => 'group',
528
+ 'params' => array(
529
+ array(
530
+ 'label' => array(
531
+ 'text' => sprintf( '%s (%s)', __( 'Items per row', 'content-views-query-and-display-post-page' ), __( 'Tablet', 'content-views-query-and-display-post-page' ) ),
532
+ ),
533
+ 'params' => array(
534
+ array(
535
+ 'type' => 'number',
536
+ 'name' => 'resp-tablet-number-columns',
537
+ 'std' => '2',
538
+ 'append_text' => '1 &rarr; 4',
539
+ ),
540
+ ),
541
+ ),
542
+ array(
543
+ 'label' => array(
544
+ 'text' => sprintf( '%s (%s)', __( 'Items per row', 'content-views-query-and-display-post-page' ), __( 'Mobile', 'content-views-query-and-display-post-page' ) ),
545
+ ),
546
+ 'params' => array(
547
+ array(
548
+ 'type' => 'number',
549
+ 'name' => 'resp-number-columns',
550
+ 'std' => '1',
551
+ 'append_text' => '1 &rarr; 4',
552
+ ),
553
+ ),
554
+ ),
555
+ ),
556
+ ),
557
+ ),
558
+ 'dependence' => array( 'view-type', !get_option( 'pt_cv_version_pro' ) ? array( 'grid' ) : array( 'grid', 'scrollable', 'pinterest', 'glossary' ) ),
559
+ ) ),
560
+ array(
561
+ 'label' => array(
562
+ 'text' => __( 'Format', 'content-views-query-and-display-post-page' ),
563
+ ),
564
+ 'extra_setting' => array(
565
+ 'params' => array(
566
+ 'wrap-class' => PT_CV_Html::html_group_class(),
567
+ ),
568
+ ),
569
+ 'params' => array(
570
+ array(
571
+ 'type' => 'group',
572
+ 'params' => apply_filters( PT_CV_PREFIX_ . 'format_settings', array(
573
+ array(
574
+ 'label' => array(
575
+ 'text' => '',
576
+ ),
577
+ 'extra_setting' => array(
578
+ 'params' => array(
579
+ 'width' => 12,
580
+ ),
581
+ ),
582
+ 'params' => array(
583
+ array(
584
+ 'type' => 'radio',
585
+ 'name' => 'layout-format',
586
+ 'options' => PT_CV_Values::layout_format(),
587
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::layout_format() ),
588
+ ),
589
+ ),
590
+ ),
591
+ array(
592
+ 'label' => array(
593
+ 'text' => '',
594
+ ),
595
+ 'extra_setting' => array(
596
+ 'params' => array(
597
+ 'width' => 12,
598
+ ),
599
+ ),
600
+ 'params' => array(
601
+ array(
602
+ 'type' => 'html',
603
+ 'content' => sprintf( '<p class="text-muted" style="margin-top: -8px">%s.</p>', __( 'It requires enough horizontal space. You might reduce <code>Items Per Row</code> above if available, or select smaller thumbnail size below', 'content-views-query-and-display-post-page' ) ),
604
+ ),
605
+ ),
606
+ 'dependence' => array( 'layout-format', '2-col' ),
607
+ ),
608
+ array(
609
+ 'label' => array(
610
+ 'text' => '',
611
+ ),
612
+ 'extra_setting' => array(
613
+ 'params' => array(
614
+ 'width' => 12,
615
+ ),
616
+ ),
617
+ 'params' => array(
618
+ array(
619
+ 'type' => 'checkbox',
620
+ 'name' => 'lf-nowrap',
621
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Do not wrap text around image', 'content-views-query-and-display-post-page' ) ),
622
+ 'std' => '',
623
+ ),
624
+ ),
625
+ 'dependence' => array( 'layout-format', '2-col' ),
626
+ ),
627
+ array(
628
+ 'label' => array(
629
+ 'text' => '',
630
+ ),
631
+ 'extra_setting' => array(
632
+ 'params' => array(
633
+ 'width' => 12,
634
+ ),
635
+ ),
636
+ 'params' => array(
637
+ array(
638
+ 'type' => 'checkbox',
639
+ 'name' => 'lf-mobile-disable',
640
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Disable this format on small screens (less than 481 pixels)', 'content-views-query-and-display-post-page' ) ),
641
+ 'std' => '',
642
+ ),
643
+ ),
644
+ 'dependence' => array( 'layout-format', '2-col' ),
645
+ ),
646
+ ) ),
647
+ ),
648
+ ),
649
+ ),
650
+ // Fields settings
651
+ array(
652
+ 'label' => array(
653
+ 'text' => __( 'Fields settings', 'content-views-query-and-display-post-page' ),
654
+ ),
655
+ 'extra_setting' => array(
656
+ 'params' => array(
657
+ 'wrap-class' => PT_CV_Html::html_group_class(),
658
+ 'wrap-id' => PT_CV_Html::html_group_id( 'field-settings' ),
659
+ ),
660
+ ),
661
+ 'params' => array(
662
+ array(
663
+ 'type' => 'group',
664
+ 'params' => PT_CV_Settings::field_settings(),
665
+ ),
666
+ ),
667
+ ),
668
+ // Pagination settings
669
+ array(
670
+ 'label' => array(
671
+ 'text' => __( 'Pagination', 'content-views-query-and-display-post-page' ),
672
+ ),
673
+ 'extra_setting' => array(
674
+ 'params' => array(
675
+ 'wrap-class' => PT_CV_Html::html_group_class(),
676
+ ),
677
+ ),
678
+ 'params' => array(
679
+ array(
680
+ 'type' => 'group',
681
+ 'params' => PT_CV_Settings::settings_pagination(),
682
+ ),
683
+ ),
684
+ ),
685
+ // Other settings
686
+ array(
687
+ 'label' => array(
688
+ 'text' => __( 'Others', 'content-views-query-and-display-post-page' ),
689
+ ),
690
+ 'extra_setting' => array(
691
+ 'params' => array(
692
+ 'wrap-class' => PT_CV_Html::html_group_class(),
693
+ ),
694
+ ),
695
+ 'params' => array(
696
+ array(
697
+ 'type' => 'group',
698
+ 'params' => PT_CV_Settings::settings_other(),
699
+ ),
700
+ ),
701
+ ),
702
+ );
703
+
704
+ $options = apply_filters( PT_CV_PREFIX_ . 'display_settings', $options );
705
+ echo PT_Options_Framework::do_settings( $options, $settings );
706
+ ?>
707
+ </div>
708
+ <!-- end Display Settings -->
709
+
710
+ <?php
711
+ do_action( PT_CV_PREFIX_ . 'setting_tabs_content', $settings );
712
+ ?>
713
+
714
+ </div>
715
+
716
+ <div class="clearfix"></div>
717
+ <hr>
718
+ <!-- Save -->
719
+ <input type="submit" class="btn btn-primary pull-right <?php echo esc_attr( PT_CV_PREFIX ); ?>save-view" value="<?php _e( 'Save' ); ?>">
720
+ </form>
721
+ </div>
content-views.php CHANGED
@@ -10,7 +10,7 @@
10
  * Plugin Name: Content Views
11
  * Plugin URI: http://wordpress.org/plugins/content-views-query-and-display-post-page/
12
  * Description: Query and display <strong>posts, pages</strong> in awesome layouts (<strong>grid, scrollable list, collapsible list</strong>) easier than ever, without coding!
13
- * Version: 2.2.0
14
  * Author: Content Views
15
  * Author URI: http://profiles.wordpress.org/pt-guy
16
  * Text Domain: content-views-query-and-display-post-page
@@ -25,7 +25,7 @@ if ( !defined( 'ABSPATH' ) ) {
25
  }
26
 
27
  // Define Constant
28
- define( 'PT_CV_VERSION', '2.2.0' );
29
  define( 'PT_CV_FILE', __FILE__ );
30
  define( 'PT_CV_PATH', plugin_dir_path( __FILE__ ) );
31
  include_once( PT_CV_PATH . 'includes/defines.php' );
10
  * Plugin Name: Content Views
11
  * Plugin URI: http://wordpress.org/plugins/content-views-query-and-display-post-page/
12
  * Description: Query and display <strong>posts, pages</strong> in awesome layouts (<strong>grid, scrollable list, collapsible list</strong>) easier than ever, without coding!
13
+ * Version: 2.3.0
14
  * Author: Content Views
15
  * Author URI: http://profiles.wordpress.org/pt-guy
16
  * Text Domain: content-views-query-and-display-post-page
25
  }
26
 
27
  // Define Constant
28
+ define( 'PT_CV_VERSION', '2.3.0' );
29
  define( 'PT_CV_FILE', __FILE__ );
30
  define( 'PT_CV_PATH', plugin_dir_path( __FILE__ ) );
31
  include_once( PT_CV_PATH . 'includes/defines.php' );
includes/compatibility.php CHANGED
@@ -258,6 +258,16 @@ if ( function_exists( 'opRemoveStyles' ) ) {
258
 
259
  add_action( PT_CV_PREFIX_ . 'before_query', 'cv_comp_action_before_query' );
260
  function cv_comp_action_before_query() {
 
 
 
 
 
 
 
 
 
 
261
  /* Fix: Posts don't appear in View output, when excludes categories by "Ultimate category excluder" plugin
262
  * @since 1.9.9
263
  */
@@ -271,6 +281,12 @@ function cv_comp_action_before_query() {
271
  if ( function_exists( 'rc_modify_query_get_posts_by_date' ) ) {
272
  remove_action( 'pre_get_posts', 'rc_modify_query_get_posts_by_date' );
273
  }
 
 
 
 
 
 
274
  }
275
 
276
  /**
@@ -347,76 +363,37 @@ function cv_comp_plugin_saoe() {
347
  /** Compatible with Timeline layout which uses old param
348
  * @since 2.0
349
  */
350
- add_action( PT_CV_PREFIX_ . 'view_process_start', 'cv_comp_pro_timeline' );
351
- function cv_comp_pro_timeline() {
352
- $pagenum = cv_comp_get_page_number();
353
  if ( !empty( $pagenum ) ) {
354
  $_GET[ 'vpage' ] = $pagenum;
355
  }
356
  }
357
 
358
- /** Get the page number for Normal pagination
359
- *
360
- * @return type
 
 
361
  */
362
- function cv_comp_get_page_number() {
363
- $paged = null;
364
-
365
- // Get old params
366
- foreach ( array( 'vpage', '_page' ) as $op ) {
367
- if ( !empty( $_GET[ $op ] ) ) {
368
- $paged = absint( $_GET[ $op ] );
 
 
 
 
 
 
 
 
369
  }
370
  }
371
-
372
- if ( !$paged ) {
373
- $paged = get_query_var( PT_CV_PAGE_VAR );
374
- }
375
- // Static front page
376
- if ( !$paged ) {
377
- $paged = get_query_var( 'page' );
378
- }
379
-
380
- return $paged;
381
- }
382
-
383
- function cv_comp_pagination_remove_old_param( $link ) {
384
- $link = remove_query_arg( array( 'vpage', '_page', 'page' ), $link );
385
-
386
- // Visit /?pagevar=N, pagination links wrong
387
- global $wp_rewrite;
388
- if ( $wp_rewrite->using_permalinks() ) {
389
- $link = remove_query_arg( PT_CV_PAGE_VAR, $link );
390
- }
391
-
392
- return $link;
393
- }
394
-
395
- // Make pagination endpoint works with "custom taxonomy"
396
- add_filter( 'register_taxonomy_args', 'cv_add_mask_to_custom_taxonomy', 10, 3 );
397
- function cv_add_mask_to_custom_taxonomy( $args, $name, $object_type ) {
398
- $args = array_merge( array(
399
- 'rewrite' => true,
400
- ), $args );
401
-
402
- if ( false !== $args[ 'rewrite' ] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) {
403
- $args[ 'rewrite' ] = wp_parse_args( $args[ 'rewrite' ], array(
404
- 'ep_mask' => EP_ALL,
405
- ) );
406
- }
407
-
408
- return $args;
409
- }
410
-
411
- // Register pagination endpoint
412
- add_action( 'init', 'cv_pretty_nonajax_pagination', 999999 );
413
- function cv_pretty_nonajax_pagination() {
414
- add_rewrite_endpoint( PT_CV_PAGE_VAR, EP_ALL );
415
-
416
- if ( false === get_option( 'cv_pretty_pagination_url_212' ) ) {
417
- flush_rewrite_rules( false );
418
- add_option( 'cv_pretty_pagination_url_212', 1 );
419
- }
420
  }
421
 
422
  /** Prevent (no title) issue caused by other plugins */
@@ -425,3 +402,22 @@ function cv_comp_prevent_no_title() {
425
  // title-remover plugin
426
  remove_filter( 'the_title', 'wptr_supress_title', 10, 2 );
427
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
 
259
  add_action( PT_CV_PREFIX_ . 'before_query', 'cv_comp_action_before_query' );
260
  function cv_comp_action_before_query() {
261
+ /** Fix problem with Paid Membership Pro plugin
262
+ * It resets (instead of append) "post__not_in" parameter of WP query which makes:
263
+ * - exclude function doesn't work
264
+ * - output in Preview panel is different from output in front-end
265
+ * @since 1.7.3
266
+ */
267
+ if ( function_exists( 'pmpro_search_filter' ) ) {
268
+ remove_filter( 'pre_get_posts', 'pmpro_search_filter' );
269
+ }
270
+
271
  /* Fix: Posts don't appear in View output, when excludes categories by "Ultimate category excluder" plugin
272
  * @since 1.9.9
273
  */
281
  if ( function_exists( 'rc_modify_query_get_posts_by_date' ) ) {
282
  remove_action( 'pre_get_posts', 'rc_modify_query_get_posts_by_date' );
283
  }
284
+
285
+ /* Theme GeoPress360 shows only post and its post type on all pages
286
+ * @since 2.3.0
287
+ */
288
+ remove_filter( 'pre_get_posts', 'aplotis_custom_posts_in_archive' );
289
+ remove_filter( 'pre_get_posts', 'aplotis_panoramas_in_home_loop' );
290
  }
291
 
292
  /**
363
  /** Compatible with Timeline layout which uses old param
364
  * @since 2.0
365
  */
366
+ add_action( PT_CV_PREFIX_ . 'view_process_start', 'cv_comp_pro_timeline_pagination' );
367
+ function cv_comp_pro_timeline_pagination() {
368
+ $pagenum = PT_CV_Functions::get_pagination_number();
369
  if ( !empty( $pagenum ) ) {
370
  $_GET[ 'vpage' ] = $pagenum;
371
  }
372
  }
373
 
374
+ /** Redirect to new url if using old pagination link
375
+ /pages/N
376
+ ?pages=N
377
+ &pages=N
378
+ * @since 2.3.0
379
  */
380
+ add_action( 'template_redirect', 'cv_comp_pagination_redirect' );
381
+ function cv_comp_pagination_redirect() {
382
+ $matches = array();
383
+ $pattern = '@([/?&]pages[/=])([0-9]+)@i';
384
+ $request = html_entity_decode( get_pagenum_link() );
385
+ preg_match( $pattern, $request, $matches );
386
+
387
+ if ( !empty( $matches[ 2 ] ) ) {
388
+ $new_url_raw = PT_CV_Functions::get_pagination_url( $matches[ 2 ] );
389
+ $new_url = preg_replace( $pattern, '', html_entity_decode( $new_url_raw ) );
390
+ if ( !headers_sent() && wp_http_validate_url( $new_url ) ) {
391
+ wp_safe_redirect( $new_url, 301 );
392
+ exit();
393
+ } else {
394
+ return $new_url;
395
  }
396
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  }
398
 
399
  /** Prevent (no title) issue caused by other plugins */
402
  // title-remover plugin
403
  remove_filter( 'the_title', 'wptr_supress_title', 10, 2 );
404
  }
405
+
406
+ /** Prevent output of Easy Footnotes plugin from showing in View (which shows Full Content of post)
407
+ * @since 2.3.0
408
+ */
409
+ add_action( 'pt_cv_view_process_start', 'cvp_comp_plugin_easyfootnotes' );
410
+ function cvp_comp_plugin_easyfootnotes() {
411
+ global $easyFootnotes;
412
+ if ( isset( $easyFootnotes ) ) {
413
+ $is_start = current_filter() === 'pt_cv_view_process_start';
414
+ $func = $is_start ? 'remove_filter' : 'add_filter';
415
+
416
+ $func( 'the_content', array( $easyFootnotes, 'easy_footnote_after_content' ), 20 );
417
+ $func( 'the_content', array( $easyFootnotes, 'easy_footnote_reset' ), 999 );
418
+
419
+ if ( $is_start ) {
420
+ add_action( 'pt_cv_view_process_end', 'cvp_comp_plugin_easyfootnotes' );
421
+ }
422
+ }
423
+ }
includes/defines.php CHANGED
@@ -42,8 +42,6 @@ define( 'PT_CV_VIEW_TYPE_OUTPUT', PT_CV_PATH . 'public/templates/' );
42
  // Enable/Disable debug mode
43
  define( 'PT_CV_DEBUG', false );
44
 
45
- // Name of parameter for non-ajax pagination
46
- define( 'PT_CV_PAGE_VAR', 'pages' );
47
  /**
48
  * Check if CV layout was damaged by theme/another plugin's style
49
  * @since 1.8.7
42
  // Enable/Disable debug mode
43
  define( 'PT_CV_DEBUG', false );
44
 
 
 
45
  /**
46
  * Check if CV layout was damaged by theme/another plugin's style
47
  * @since 1.8.7
includes/formatting.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- /**
3
- * Formatting HTML
4
- *
5
- * @subpackage Includes
6
- * @license GPL-2.0+
7
- * @copyright CVPro <http://www.contentviewspro.com/>
8
- * @since 1.9.1
9
- */
10
- // Exit if accessed directly
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
- /**
15
- * Sanitize View ID
16
- *
17
- * @since 1.9.1
18
- * @param string $view_id
19
- * @return string
20
- */
21
- function cv_sanitize_vid( $view_id ) {
22
- return preg_replace( '/[\W]/', '', $view_id );
23
- }
24
-
25
- /**
26
- * Sanitize HTML data attribute=value
27
- *
28
- * @since 1.9.1
29
- * @param string $data
30
- * @return string
31
- */
32
- function cv_sanitize_html_data( $data ) {
33
- return strip_tags( $data );
34
- }
35
-
36
- /**
37
- * Sanitize content of HTML tag
38
- *
39
- * @since 1.9.1
40
- * @param string $string
41
- * @return string
42
- */
43
- function cv_sanitize_tag_content( $string, $remove_breaks = false ) {
44
- $string = preg_replace( '@<(script)[^>]*?>.*?</\\1>@si', '', $string );
45
-
46
- if ( $remove_breaks )
47
- $string = preg_replace( '/[\r\n\t ]+/', ' ', $string );
48
-
49
- return trim( $string );
50
- }
51
-
52
- /**
53
- * For WordPress 4.8.3 and after
54
- */
55
- if ( !function_exists( 'cv_esc_sql' ) ) {
56
- function cv_esc_sql( $data ) {
57
- $result = esc_sql( $data );
58
-
59
- global $wpdb;
60
- if ( method_exists( $wpdb, 'remove_placeholder_escape' ) ) {
61
- return $wpdb->remove_placeholder_escape( $result );
62
- } else {
63
- return $result;
64
- }
65
- }
66
-
67
- }
1
+ <?php
2
+ /**
3
+ * Formatting HTML
4
+ *
5
+ * @subpackage Includes
6
+ * @license GPL-2.0+
7
+ * @copyright CVPro <http://www.contentviewspro.com/>
8
+ * @since 1.9.1
9
+ */
10
+ // Exit if accessed directly
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+ /**
15
+ * Sanitize View ID
16
+ *
17
+ * @since 1.9.1
18
+ * @param string $view_id
19
+ * @return string
20
+ */
21
+ function cv_sanitize_vid( $view_id ) {
22
+ return preg_replace( '/[\W]/', '', $view_id );
23
+ }
24
+
25
+ /**
26
+ * Sanitize HTML data attribute=value
27
+ *
28
+ * @since 1.9.1
29
+ * @param string $data
30
+ * @return string
31
+ */
32
+ function cv_sanitize_html_data( $data ) {
33
+ return strip_tags( $data );
34
+ }
35
+
36
+ /**
37
+ * Sanitize content of HTML tag
38
+ *
39
+ * @since 1.9.1
40
+ * @param string $string
41
+ * @return string
42
+ */
43
+ function cv_sanitize_tag_content( $string, $remove_breaks = false ) {
44
+ $string = preg_replace( '@<(script)[^>]*?>.*?</\\1>@si', '', $string );
45
+
46
+ if ( $remove_breaks )
47
+ $string = preg_replace( '/[\r\n\t ]+/', ' ', $string );
48
+
49
+ return trim( $string );
50
+ }
51
+
52
+ /**
53
+ * For WordPress 4.8.3 and after
54
+ */
55
+ if ( !function_exists( 'cv_esc_sql' ) ) {
56
+ function cv_esc_sql( $data ) {
57
+ $result = esc_sql( $data );
58
+
59
+ global $wpdb;
60
+ if ( method_exists( $wpdb, 'remove_placeholder_escape' ) ) {
61
+ return $wpdb->remove_placeholder_escape( $result );
62
+ } else {
63
+ return $result;
64
+ }
65
+ }
66
+
67
+ }
includes/functions.php CHANGED
@@ -1,1475 +1,1538 @@
1
- <?php
2
- /**
3
- * Contain main functions to work with plugin, post, custom fields...
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- if ( !function_exists( 'get_plugin_data' ) ) {
16
- require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
17
- }
18
- if ( !class_exists( 'PT_CV_Functions' ) ) {
19
-
20
- /**
21
- * @name PT_CV_Functions
22
- * @todo Utility functions
23
- */
24
- class PT_CV_Functions {
25
-
26
- static $prev_random_string = '';
27
-
28
- /**
29
- * Compare current Wordpress version with a version
30
- *
31
- * @global string $wp_version
32
- *
33
- * @param string $version_to_compare
34
- * @param string $operator
35
- *
36
- * @return boolean
37
- */
38
- static function wp_version_compare( $version_to_compare, $operator = '>=' ) {
39
- if ( empty( $version_to_compare ) ) {
40
- return true;
41
- }
42
-
43
- global $wp_version;
44
-
45
- // Check if using Wordpress version 3.7 or higher
46
- return version_compare( $wp_version, $version_to_compare, $operator );
47
- }
48
-
49
- /**
50
- * Get current language of site
51
- */
52
- static function get_language() {
53
- $language = '';
54
-
55
- // WPML
56
- global $sitepress;
57
- if ( $sitepress && method_exists( $sitepress, 'get_current_language' ) ) {
58
- $language = $sitepress->get_current_language();
59
- }
60
-
61
- /**
62
- * qTranslate-X (and qTranslate, mqTranslate)
63
- * @since 1.5.3
64
- */
65
- global $q_config;
66
- if ( $q_config && !empty( $q_config[ 'language' ] ) ) {
67
- $language = $q_config[ 'language' ];
68
- }
69
-
70
- return $language;
71
- }
72
-
73
- /**
74
- * Switch language
75
- *
76
- * @global type $sitepress
77
- * @param string $language Current language
78
- */
79
- static function switch_language( $language ) {
80
- if ( !$language )
81
- return;
82
-
83
- // WPML
84
- global $sitepress;
85
- if ( $sitepress && $language ) {
86
- $sitepress->switch_lang( $language, true );
87
- }
88
-
89
- /**
90
- * qTranslate-X (and qTranslate, mqTranslate)
91
- * @since 1.5.3
92
- */
93
- global $q_config;
94
- if ( $q_config ) {
95
- $q_config[ 'language' ] = $language;
96
- }
97
- }
98
-
99
- /**
100
- * Get plugin info
101
- *
102
- * @param string $file Absolute path to the plugin file
103
- * @param string $data Field of plugin data want to get
104
- *
105
- * @return array | null
106
- */
107
- static function plugin_info( $file, $data = '' ) {
108
- $plugin_data = get_plugin_data( $file );
109
-
110
- return isset( $plugin_data[ $data ] ) ? $plugin_data[ $data ] : NULL;
111
- }
112
-
113
- /**
114
- * Add sub menu page
115
- *
116
- * @param string $parent_slug Slug of parent menu
117
- * @param string $page_title Title of page
118
- * @param string $menu_title Title of menu
119
- * @param string $user_role Required role to see this menu
120
- * @param string $sub_page Slug of sub menu
121
- * @param string $class Class name which contains function to output content of page created by this menu
122
- */
123
- static function menu_add_sub( $parent_slug, $page_title, $menu_title, $user_role, $sub_page, $class ) {
124
- return add_submenu_page(
125
- $parent_slug, $page_title, $menu_title, $user_role, $parent_slug . '-' . $sub_page, array( $class, 'display_sub_page_' . $sub_page )
126
- );
127
- }
128
-
129
- /**
130
- * Get current post type in Admin
131
- *
132
- * @global type $post
133
- * @global type $typenow
134
- * @global type $current_screen
135
- * @return type
136
- */
137
- static function admin_current_post_type() {
138
- global $post, $typenow, $current_screen;
139
-
140
- //we have a post so we can just get the post type from that
141
- if ( $post && $post->post_type ) {
142
- return $post->post_type;
143
- } //check the global $typenow - set in admin.php
144
- elseif ( $typenow ) {
145
- return $typenow;
146
- } //check the global $current_screen object - set in sceen.php
147
- elseif ( $current_screen && isset( $current_screen->post_type ) ) {
148
- return $current_screen->post_type;
149
- }
150
- }
151
-
152
- /**
153
- * Include content of file
154
- *
155
- * @param string $file_path Absolute path of file
156
- *
157
- * @return NULL | string Content of file
158
- */
159
- static function file_include_content( $file_path ) {
160
- $content = NULL;
161
-
162
- if ( file_exists( $file_path ) ) {
163
- ob_start();
164
- include_once $file_path;
165
- $content = ob_get_clean();
166
- }
167
-
168
- return $content;
169
- }
170
-
171
- /**
172
- * Get value of option Content Views Settings page
173
- * @param string $option_name
174
- * @param mixed $default
175
- * @return mixed
176
- */
177
- static function get_option_value( $option_name, $default = '' ) {
178
- $options = get_option( PT_CV_OPTION_NAME );
179
- return isset( $options[ $option_name ] ) ? $options[ $option_name ] : $default;
180
- }
181
-
182
- /**
183
- * Generate random string
184
- *
185
- * @param bool $prev_return Return previous generated string
186
- *
187
- * @return string
188
- */
189
- static function string_random( $prev_return = false ) {
190
- if ( $prev_return ) {
191
- return PT_CV_Functions::$prev_random_string;
192
- }
193
- // Don't use uniqid(), it will cause bug when multiple elements have same ID
194
- $str = '0123456789abcdefghijklmnopqrstuvwxyz';
195
- $rand = substr( md5( mt_rand() ), 0, 7 ) . substr( str_shuffle( $str ), 0, 3 );
196
-
197
- PT_CV_Functions::$prev_random_string = $rand;
198
-
199
- return PT_CV_Functions::$prev_random_string;
200
- }
201
-
202
- /**
203
- * Create array from string, use explode function
204
- *
205
- * @param string $string String to explode
206
- * @param string $delimiter Delimiter to explode string
207
- *
208
- * @return array
209
- */
210
- static function string_to_array( $string, $delimiter = ',' ) {
211
- return is_array( $string ) ? $string : (array) explode( $delimiter, (string) str_replace( ' ', '', $string ) );
212
- }
213
-
214
- /**
215
- * Slug to nice String
216
- *
217
- * @param string $slug Slug string
218
- *
219
- * @return string
220
- */
221
- static function string_slug_to_text( $slug ) {
222
- $slug = preg_replace( '/[_\-]+/', ' ', $slug );
223
-
224
- return ucwords( $slug );
225
- }
226
-
227
- /**
228
- * Trims text to a certain number of words.
229
- * @since 1.4.3
230
- * @param string $text
231
- * @param int $num_words
232
- * @return string
233
- */
234
- static function cv_trim_words( $text, $num_words = 500 ) {
235
- $text = apply_filters( PT_CV_PREFIX_ . 'before_generate_excerpt', $text );
236
-
237
- if ( apply_filters( PT_CV_PREFIX_ . 'excerpt_strip_shortcode', true ) ) {
238
- $text = self::cv_strip_shortcodes( $text );
239
- } else {
240
- $text = do_shortcode( $text );
241
- }
242
-
243
- // Prevent embedded URLs from showing
244
- global $wp_embed;
245
- if ( method_exists( $wp_embed, 'autoembed' ) ) {
246
- $text = $wp_embed->autoembed( $text );
247
- }
248
-
249
- $result = self::cv_strip_tags( $text );
250
- return self::trim_words( $result, $num_words );
251
- }
252
-
253
- /**
254
- * Strip shortcodes in CV way, to replace WP strip_shortcodes()
255
- * @after 1.8.3
256
- * @param string $text
257
- */
258
- static function cv_strip_shortcodes( $text, $strip_all = true ) {
259
- if ( apply_filters( PT_CV_PREFIX_ . 'excerpt_strip_all_shortcodes', false ) ) {
260
- return strip_shortcodes( $text );
261
- }
262
-
263
- global $shortcode_tags, $cv_shortcode_tags_backup;
264
- if ( !isset( $cv_shortcode_tags_backup ) ) {
265
- $tagnames = array_keys( $shortcode_tags );
266
- $tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );
267
- } else {
268
- $tagregexp = $cv_shortcode_tags_backup;
269
- }
270
-
271
- if ( $strip_all ) {
272
- // Strip some shortcodes
273
- $temp_shortcode_tags = $shortcode_tags;
274
- $shortcode_tags = apply_filters( PT_CV_PREFIX_ . 'shortcode_to_strip', array( 'caption' => '', 'embed' => '' ) );
275
- $text = strip_shortcodes( $text );
276
- $shortcode_tags = $temp_shortcode_tags;
277
- }
278
-
279
- // Keep other shortcodes' content
280
- return preg_replace( '/'
281
- . '\[' // Opening bracket
282
- . '(\/?)'
283
- . "($tagregexp)" // All shortcode tags
284
- . '[^\]]*' // Shortcode parameters
285
- . '\]' // Closing bracket
286
- . '/', '', $text );
287
- }
288
-
289
- /**
290
- * Trim words in CV way
291
- * @return string
292
- */
293
- static function trim_words( $text, $num_words ) {
294
- $more = '';
295
- $text = apply_filters( PT_CV_PREFIX_ . 'before_trim_words', $text );
296
-
297
- /*
298
- * translators: If your word count is based on single characters (e.g. East Asian characters),
299
- * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
300
- * Do not translate into your own language.
301
- */
302
- /**
303
- * Do not use "[\r\n\t ]|\xC2\xA0|&nbsp;" as regex pattern, it can stop PHP process
304
- * @since 1.9.5
305
- */
306
- $text = str_replace( array( '\xC2\xA0', '&nbsp;' ), ' ', $text );
307
- if ( strpos( _x( 'words', 'Word count type. Do not translate!' ), 'characters' ) === 0 && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) ) {
308
- $text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
309
- preg_match_all( '/./u', $text, $words_array );
310
- $words_array = array_slice( $words_array[ 0 ], 0, $num_words + 1 );
311
- $sep = '';
312
- } else {
313
- $words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
314
- $sep = ' ';
315
- }
316
-
317
- if ( count( $words_array ) > $num_words ) {
318
- array_pop( $words_array );
319
- $text = implode( $sep, $words_array );
320
- $text = $text . $more;
321
- } else {
322
- $text = implode( $sep, $words_array );
323
- }
324
-
325
- return apply_filters( PT_CV_PREFIX_ . 'after_trim_words', $text );
326
- }
327
-
328
- /**
329
- * Custom strip tags, allow some tags
330
- *
331
- * @since 1.4.6
332
- * @param string $string
333
- * @return string
334
- */
335
- static function cv_strip_tags( $string ) {
336
- // Changes double line-breaks in the text into HTML paragraphs (<p>, <br>)
337
- if ( apply_filters( PT_CV_PREFIX_ . 'wpautop', 0 ) ) {
338
- $string = wpautop( $string );
339
- }
340
-
341
- // Remove entire tag content
342
- $tags_to_rm = apply_filters( PT_CV_PREFIX_ . 'tag_to_remove', array( 'script', 'style' ) );
343
- $string = preg_replace( array( '@<(' . implode( '|', $tags_to_rm ) . ')[^>]*?>.*?</\\1>@si' ), '', $string );
344
-
345
- // Strip HTML tags
346
- if ( apply_filters( PT_CV_PREFIX_ . 'strip_tags', 1 ) ) {
347
- $allowed_tags = '';
348
- if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
349
- $allowable_tags = (array) apply_filters( PT_CV_PREFIX_ . 'allowable_tags', array( '<a>', '<br>', '<strong>', '<em>', '<strike>', '<i>', '<ul>', '<ol>', '<li>' ) );
350
- $allowed_tags = implode( '', $allowable_tags );
351
- }
352
-
353
- $string = strip_tags( $string, $allowed_tags );
354
- }
355
-
356
- return trim( $string );
357
- }
358
-
359
- /**
360
- * Handle slug of non-latin languages
361
- * used in CVP < 4.1
362
- *
363
- * @param string $slug
364
- * @param boolean $sanitize
365
- * @return string
366
- */
367
- static function term_slug_sanitize( $slug, $sanitize = false ) {
368
- if ( $sanitize && preg_match( '/%[0-9a-f][0-9a-f]/', $slug ) ) {
369
- $slug = str_replace( '%', '@', $slug );
370
- }
371
-
372
- return $slug;
373
- }
374
-
375
- /**
376
- * Get thumbnail dimensions
377
- *
378
- * @param array $fargs The settings of thumbnail
379
- *
380
- * @return array
381
- */
382
- static function field_thumbnail_dimensions( $fargs ) {
383
- $size = $fargs[ 'size' ];
384
-
385
- return (array) explode( '&times;', str_replace( ' ', '', $size ) );
386
- }
387
-
388
- /**
389
- * Get value of a setting from global settings array
390
- *
391
- * @param string $field The full name of setting to get value
392
- * @param array $array_to_get Array to get values of wanted setting
393
- * @param mixed|null $assign The value to assign if setting is not found
394
- */
395
- static function setting_value( $field, $array_to_get = NULL, $assign = NULL ) {
396
- if ( empty( $array_to_get ) ) {
397
- $array_to_get = PT_CV_Functions::get_global_variable( 'view_settings' );
398
- }
399
-
400
- return isset( $array_to_get[ $field ] ) ? $array_to_get[ $field ] : $assign;
401
- }
402
-
403
- /**
404
- * Get values of settings from global settings array
405
- *
406
- * @param array $fields Array of setting fields to get value
407
- * @param array $array_to_save Array to save values of wanted setting fields
408
- * @param array $array_to_get Array to get values of wanted setting fields
409
- * @param string $prefix Prefix string to looking for fields in $array_to_get
410
- */
411
- static function settings_values( $fields, &$array_to_save, $array_to_get, $prefix ) {
412
- foreach ( $fields as $tsetting ) {
413
- $array_to_save[ $tsetting ] = PT_CV_Functions::setting_value( $prefix . $tsetting, $array_to_get );
414
- }
415
- }
416
-
417
- /**
418
- * Get names of options for a setting group (setting name started by a prefix)
419
- *
420
- * @param string $prefix The prefix in name of settings
421
- * @param array $options The options array (contain full paramaters of settings)
422
- */
423
- static function settings_keys( $prefix, $options ) {
424
- $result = array();
425
- foreach ( $options as $option ) {
426
- if ( isset( $option[ 'params' ] ) ) {
427
- foreach ( $option[ 'params' ] as $params ) {
428
- // If name of setting match with prefix string, got it name
429
- if ( isset( $params[ 'name' ] ) && substr( $params[ 'name' ], 0, strlen( $prefix ) ) === $prefix ) {
430
- $result[] = substr( $params[ 'name' ], strlen( $prefix ) );
431
- }
432
- }
433
- }
434
- }
435
-
436
- return $result;
437
- }
438
-
439
- /**
440
- * Get value of some setting options by prefix
441
- *
442
- * @param string $prefix The prefix in name of setting options
443
- * @param bool $backend Get settings from Backend form
444
- */
445
- static function settings_values_by_prefix( $prefix, $backend = FALSE ) {
446
- $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
447
-
448
- if ( !$view_settings && $backend ) {
449
- global $pt_cv_admin_settings;
450
- $view_settings = $pt_cv_admin_settings;
451
- }
452
-
453
- $result = array();
454
- $strlen = strlen( $prefix );
455
- foreach ( (array) $view_settings as $name => $value ) {
456
- // If name of setting match with prefix string, got it
457
- if ( strpos( $name, $prefix ) === 0 ) {
458
- $result[ substr( $name, $strlen ) ] = $value;
459
- }
460
- }
461
-
462
- return $result;
463
- }
464
-
465
- /**
466
- * Get terms list of a post
467
- *
468
- * @param object $post The post object
469
- *
470
- * @return string
471
- */
472
- static function post_terms( $post ) {
473
- global $pt_cv_glb;
474
-
475
- $links = array();
476
- $taxonomy_terms = array();
477
- $post_terms = array();
478
- $taxonomies = get_taxonomies( array( 'public' => true ), 'names' );
479
- $taxonomies_to_show = apply_filters( PT_CV_PREFIX_ . 'taxonomies_to_show', $taxonomies );
480
- $post_id = is_object( $post ) ? $post->ID : $post;
481
- $terms = wp_get_object_terms( $post_id, $taxonomies );
482
-
483
- foreach ( $terms as $term ) {
484
- $term_html = '';
485
- $term_slug = $term->slug;
486
- $include_this = apply_filters( PT_CV_PREFIX_ . 'terms_include_this', true, $term ) && in_array( $term->taxonomy, $taxonomies_to_show );
487
- if ( $include_this ) {
488
- $href = esc_url( get_term_link( $term, $term->taxonomy ) );
489
- $term_name = esc_attr( $term->name );
490
- $class = esc_attr( PT_CV_PREFIX . 'tax-' . $term_slug );
491
- $term_html = apply_filters( PT_CV_PREFIX_ . 'post_term_html', "<a href='$href' title='$term_name' class='$class'>{$term->name}</a>", $term );
492
- $links[] = $term_html;
493
- }
494
-
495
- $term_info = apply_filters( PT_CV_PREFIX_ . 'post_term', array( 'key' => $term_slug, 'value' => $term->name ), $term );
496
- $post_terms[ $term_info[ 'key' ] ] = $term_info[ 'value' ];
497
-
498
- // Add this term to terms list of an item
499
- if ( !isset( $taxonomy_terms[ $term->taxonomy ] ) ) {
500
- $taxonomy_terms[ $term->taxonomy ] = array();
501
- }
502
- $taxonomy_terms[ $term->taxonomy ][] = $term_html;
503
- }
504
-
505
- if ( $post_terms ) {
506
- if ( !isset( $pt_cv_glb[ 'item_terms' ] ) ) {
507
- $pt_cv_glb[ 'item_terms' ] = array();
508
- }
509
-
510
- $pt_cv_glb[ 'item_terms' ][ $post_id ] = $post_terms;
511
- }
512
-
513
- return apply_filters( PT_CV_PREFIX_ . 'post_terms_output', implode( ', ', $links ), $links, $taxonomy_terms );
514
- }
515
-
516
- /**
517
- * Insert/Update post
518
- *
519
- * @param string $arr Array of post data
520
- */
521
- static function post_insert( $arr ) {
522
- if ( !isset( $arr[ 'ID' ] ) ) {
523
- return;
524
- }
525
- // Create post object
526
- $my_post = array(
527
- 'ID' => (int) $arr[ 'ID' ],
528
- 'post_type' => PT_CV_POST_TYPE,
529
- 'post_content' => '',
530
- 'post_title' => !empty( $arr[ 'title' ] ) ? $arr[ 'title' ] : __( '(no title)', 'content-views-query-and-display-post-page' ),
531
- 'post_status' => 'publish',
532
- );
533
-
534
- // Insert the post into the database
535
- return wp_insert_post( $my_post );
536
- }
537
-
538
- /**
539
- * Get View id in post table, from "id" meta key value
540
- *
541
- * @param string $meta_id ID of custom field
542
- *
543
- * @return int Return Post ID of this view
544
- */
545
- static function post_id_from_meta_id( $meta_id ) {
546
-
547
- $post_id = 0;
548
- if ( !$meta_id ) {
549
- return $post_id;
550
- }
551
-
552
- // Query view which has view id = $meta_id
553
- $pt_query = new WP_Query(
554
- array(
555
- 'suppress_filters' => true,
556
- 'post_type' => PT_CV_POST_TYPE,
557
- 'post_status' => 'publish',
558
- 'meta_key' => PT_CV_META_ID,
559
- 'meta_value' => cv_esc_sql( $meta_id ),
560
- 'cv_get_view' => true,
561
- )
562
- );
563
-
564
- if ( $pt_query->have_posts() ) :
565
- while ( $pt_query->have_posts() ):
566
- $pt_query->the_post();
567
- $post_id = get_the_ID();
568
- endwhile;
569
- endif;
570
-
571
- self::reset_query();
572
-
573
- return $post_id;
574
- }
575
-
576
- /**
577
- * Get first key of array
578
- *
579
- * @param array $args Array data
580
- *
581
- * @return string
582
- */
583
- static function array_get_first_key( $args ) {
584
- return current( array_keys( (array) $args ) );
585
- }
586
-
587
- /**
588
- * Check valid request
589
- *
590
- * @param string $nonce_name Name of nonce field
591
- * @param string $action_name name of action relates to nonce field
592
- */
593
- static function _nonce_check( $nonce_name, $action_name ) {
594
- $nonce_name = PT_CV_PREFIX_ . $nonce_name;
595
- if ( !isset( $_POST[ $nonce_name ] ) || !wp_verify_nonce( $_POST[ $nonce_name ], PT_CV_PREFIX_ . $action_name ) ) {
596
- _e( 'Cheatin&#8217; uh?' );
597
- exit;
598
- }
599
- }
600
-
601
- /**
602
- * Get view settings from view ID
603
- *
604
- * @param string $meta_id ID of custom field
605
- *
606
- * @return array
607
- */
608
- static function view_get_settings( $meta_id, &$post_id = null ) {
609
- if ( !$meta_id ) {
610
- return;
611
- }
612
-
613
- do_action( PT_CV_PREFIX_ . 'get_view_settings' );
614
-
615
- $view_settings = array();
616
-
617
- $post_id = PT_CV_Functions::post_id_from_meta_id( $meta_id );
618
- if ( $post_id ) {
619
- $view_settings = get_post_meta( $post_id, PT_CV_META_SETTINGS, true );
620
- }
621
-
622
- return apply_filters( PT_CV_PREFIX_ . 'view_settings', $view_settings );
623
- }
624
-
625
- /**
626
- * Process view settings, return View output
627
- *
628
- * @param string $view_id View id
629
- * @param array $settings Settings array
630
- * @param array $pargs Pagination settings
631
- * @param array $sc_params Shortcode parameters
632
- *
633
- * @return string View output
634
- */
635
- static function view_process_settings( $view_id, $settings, $pargs = array(), $sc_params = NULL ) {
636
- if ( !defined( 'PT_CV_DOING_PREVIEW' ) && empty( $settings[ PT_CV_PREFIX . 'view-type' ] ) ) {
637
- return sprintf( __( 'Error: View %s may not exist', 'content-views-query-and-display-post-page' ), "<strong>$view_id</strong>" );
638
- }
639
-
640
- do_action( PT_CV_PREFIX_ . 'view_process_start' );
641
-
642
- global $pt_cv_glb, $pt_cv_id;
643
-
644
- if ( !isset( $pt_cv_glb ) ) {
645
- $pt_cv_glb = array();
646
- }
647
-
648
- $pt_cv_id = $view_id;
649
- $pt_cv_glb[ $pt_cv_id ] = array();
650
-
651
- $view_settings = array_map( 'cv_esc_sql', $settings );
652
- $pt_cv_glb[ $pt_cv_id ][ 'view_settings' ] = $view_settings;
653
-
654
- $content_type = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'content-type', $view_settings );
655
- $view_type = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'view-type', $view_settings );
656
- $view_type = apply_filters( PT_CV_PREFIX_ . 'view_layout', $view_type, $view_id, $view_settings, $sc_params );
657
- $current_page = self::get_current_page( $pargs );
658
-
659
- $pt_cv_glb[ $pt_cv_id ][ 'content_type' ] = $content_type;
660
- $pt_cv_glb[ $pt_cv_id ][ 'view_type' ] = $view_type;
661
- $pt_cv_glb[ $pt_cv_id ][ 'current_page' ] = $current_page;
662
-
663
- # Important: store current View ID, prevent it from being modified when process posts which contains View shortcode
664
- $cv_live_id = $view_id;
665
-
666
- $rebuild = isset( $view_settings[ PT_CV_PREFIX . 'rebuild' ] ) ? $view_settings[ PT_CV_PREFIX . 'rebuild' ] : false;
667
- $dargs = PT_CV_Functions::view_display_settings( $view_type, $dargs );
668
- $args = $rebuild ? $rebuild : PT_CV_Functions::view_filter_settings( $content_type, $view_settings );
669
-
670
- if ( $sc_params ) {
671
- $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ] = $sc_params;
672
- } elseif ( isset( $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ] ) ) {
673
- $sc_params = $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ];
674
- }
675
- $pt_cv_glb[ $pt_cv_id ][ 'shortcode_params' ] = $sc_params;
676
-
677
- PT_CV_Functions::view_get_pagination_settings( $dargs, $args, $pargs );
678
-
679
- $dargs = apply_filters( PT_CV_PREFIX_ . 'all_display_settings', $dargs );
680
- $args = apply_filters( PT_CV_PREFIX_ . 'query_parameters', $args );
681
- $pt_cv_glb[ $pt_cv_id ][ 'dargs' ] = $dargs;
682
- $pt_cv_glb[ $pt_cv_id ][ 'args' ] = $args;
683
- do_action( PT_CV_PREFIX_ . 'add_global_variables' );
684
-
685
- // Validate settings, if some required parameters are missing, show error and exit
686
- $error = !$rebuild ? apply_filters( PT_CV_PREFIX_ . 'validate_settings', array(), $args ) : false;
687
- if ( $error ) {
688
- return ( implode( '</p><p>', $error ) );
689
- }
690
-
691
- $content_items = $pt_query = $empty_result = null;
692
-
693
- // What kind of content to display
694
- $pt_cv_glb[ $pt_cv_id ][ 'display_what' ] = apply_filters( PT_CV_PREFIX_ . 'display_what', 'post' );
695
- if ( $pt_cv_glb[ $pt_cv_id ][ 'display_what' ] === 'post' ) {
696
- extract( self::get_posts_list( $args, $view_type ) );
697
- } else {
698
- $content_items = apply_filters( PT_CV_PREFIX_ . 'view_content', array() );
699
- }
700
-
701
- $pt_cv_id = $cv_live_id;
702
-
703
- if ( apply_filters( PT_CV_PREFIX_ . 'hide_empty_result', false ) && $empty_result ) {
704
- $html = '';
705
- } else {
706
- // Wrap items
707
- $html = PT_CV_Html::content_items_wrap( $content_items, $current_page, $args[ 'posts_per_page' ], $pt_cv_id );
708
-
709
- // Show pagination
710
- if ( $pt_query && apply_filters( PT_CV_PREFIX_ . 'show_pagination', PT_CV_Functions::nonajax_or_firstpage( $dargs, $current_page ) ) ) {
711
- // Total post founds
712
- $found_posts = (int) apply_filters( PT_CV_PREFIX_ . 'found_posts', $pt_query->found_posts );
713
-
714
- // Total number of items
715
- $total_items = ( $args[ 'limit' ] > 0 && $found_posts > $args[ 'limit' ] ) ? $args[ 'limit' ] : $found_posts;
716
- $total_items = apply_filters( PT_CV_PREFIX_ . 'total_posts', $total_items );
717
-
718
- // Total number of pages
719
- $items_per_page = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'pagination-items-per-page', $view_settings );
720
- $max_num_pages = ceil( $total_items / $items_per_page );
721
- $max_num_pages = (int) $max_num_pages;
722
-
723
- $pt_cv_glb[ $pt_cv_id ][ 'pagination_info' ] = compact( "total_items", "max_num_pages", "current_page" );
724
-
725
- // Output pagination
726
- if ( $max_num_pages > 1 ) {
727
- if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'ajax' ) {
728
- cv_comp_pagination_settings( 'set', $view_settings );
729
- }
730
-
731
- $html .= "\n" . PT_CV_Html::pagination_output( $max_num_pages, $current_page, $pt_cv_id );
732
- } else {
733
- if ( $max_num_pages == 1 && defined( 'PT_CV_DOING_PREVIEW' ) ) {
734
- $reason = sprintf( '%s %s', ($total_items == $found_posts) ? __( 'the number of results', 'content-views-query-and-display-post-page' ) : __( 'the <b>Limit</b> value', 'content-views-query-and-display-post-page' ), __( 'is less than or equal to (&le;) the <b>Items per page</b> value', 'content-views-query-and-display-post-page' ) );
735
- $html .= "\n" . sprintf( '<p class="alert alert-warning" style="padding: 10px 5px">%s %s.</p>', __( '[Preview only] Pagination is disabled when there is only 1 page, because of', 'content-views-query-and-display-post-page' ), $reason );
736
- }
737
- }
738
- }
739
- }
740
-
741
- do_action( PT_CV_PREFIX_ . 'view_process_end' );
742
-
743
- return apply_filters( PT_CV_PREFIX_ . 'view_html', $html );
744
- }
745
-
746
- /**
747
- * Query posts
748
- *
749
- * @global mixed $post
750
- * @param array $args
751
- * @param string $view_type
752
- * @return array
753
- */
754
- static function get_posts_list( $args, $view_type ) {
755
- $empty_result = false;
756
- $content_items = array();
757
- $args = apply_filters( PT_CV_PREFIX_ . 'query_params', $args );
758
-
759
- // The Query
760
- do_action( PT_CV_PREFIX_ . 'before_query' );
761
- $pt_query = new WP_Query( $args );
762
- do_action( PT_CV_PREFIX_ . 'after_query', $pt_query->request );
763
-
764
- //DEBUG_QUERY
765
- //print_r( $pt_query->request );
766
- // The Loop
767
- if ( $pt_query->have_posts() ) {
768
- do_action( PT_CV_PREFIX_ . 'before_process_item' );
769
-
770
- $all_posts = array();
771
- $post_idx = 0;
772
- while ( $pt_query->have_posts() ) {
773
- $pt_query->the_post();
774
- global $post;
775
-
776
- if ( apply_filters( PT_CV_PREFIX_ . 'show_this_post', $post ) ) {
777
- $content_items[ $post->ID ] = PT_CV_Html::view_type_output( $view_type, $post, $post_idx++ );
778
- $all_posts[ $post->ID ] = $post;
779
- }
780
- }
781
- $GLOBALS[ 'cv_posts' ] = $all_posts;
782
-
783
- do_action( PT_CV_PREFIX_ . 'after_process_item' );
784
- } else {
785
- $_class = apply_filters( PT_CV_PREFIX_ . 'content_no_post_found_class', 'alert alert-warning ' . PT_CV_PREFIX . 'no-post' );
786
- $_text = PT_CV_Html::no_post_found();
787
- $content_items[] = sprintf( '<div class="%s">%s</div>', esc_attr( $_class ), $_text );
788
- $empty_result = true;
789
- PT_CV_Functions::set_global_variable( 'no_post_found', $empty_result );
790
- }
791
-
792
- self::reset_query();
793
-
794
- return array( 'content_items' => apply_filters( PT_CV_PREFIX_ . 'content_items', $content_items, $view_type ), 'pt_query' => $pt_query, 'empty_result' => $empty_result );
795
- }
796
-
797
- /**
798
- * Get query parameters of View
799
- *
800
- * @param string $content_type The current content type
801
- * @param array $view_settings The settings of View
802
- *
803
- * @return array
804
- */
805
- static function view_filter_settings( $content_type, $view_settings ) {
806
- /**
807
- * Get Query parameters
808
- * Set default values
809
- */
810
- $args = array(
811
- 'post_type' => apply_filters( PT_CV_PREFIX_ . 'post_type', $content_type ),
812
- 'post_status' => apply_filters( PT_CV_PREFIX_ . 'post_status', array( 'publish' ) ),
813
- 'post__not_in' => array(),
814
- );
815
-
816
- // Ignore sticky posts
817
- $args[ 'ignore_sticky_posts' ] = apply_filters( PT_CV_PREFIX_ . 'ignore_sticky_posts', 1 );
818
-
819
- $post_in = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post__in', $view_settings );
820
- $post_in = array_filter( PT_CV_Functions::string_to_array( $post_in ) );
821
- if ( $post_in ) {
822
- $args[ 'post__in' ] = array_map( 'intval', $post_in );
823
- }
824
-
825
- $post_not_in = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post__not_in', $view_settings );
826
- $post_not_in = array_filter( PT_CV_Functions::string_to_array( $post_not_in ) );
827
- if ( $post_not_in ) {
828
- $args[ 'post__not_in' ] = array_map( 'intval', $post_not_in );
829
- }
830
- $args[ 'post__not_in' ] = apply_filters( PT_CV_PREFIX_ . 'post__not_in', $args[ 'post__not_in' ], $view_settings );
831
-
832
- // Parent page
833
- if ( in_array( $content_type, apply_filters( PT_CV_PREFIX_ . 'hierarchical_post_type', array( 'page' ) ) ) ) {
834
- $post_parent = apply_filters( PT_CV_PREFIX_ . 'post_parent_id', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post_parent', $view_settings ) );
835
- if ( !empty( $post_parent ) ) {
836
- $args[ 'post_parent' ] = (int) $post_parent;
837
- }
838
- }
839
-
840
- $args[ 'suppress_filters' ] = true;
841
-
842
- PT_CV_Functions::view_get_advanced_settings( $args, $content_type );
843
-
844
- return $args;
845
- }
846
-
847
- /**
848
- * Get display parameters of View
849
- *
850
- * @param string $view_type The view type of View
851
- *
852
- * @return array
853
- */
854
- static function view_display_settings( $view_type, &$dargs = null ) {
855
- $dargs = array();
856
-
857
- $dargs[ 'view-type' ] = $view_type;
858
-
859
- // Field settings of a item
860
- PT_CV_Functions::view_get_display_settings( $dargs );
861
-
862
- // Other settings
863
- PT_CV_Functions::view_get_other_settings( $dargs );
864
-
865
- // View type settings
866
- $dargs[ 'view-type-settings' ] = PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . $view_type . '-' );
867
-
868
- PT_CV_Functions::set_global_variable( 'dargs', $dargs );
869
-
870
- return $dargs;
871
- }
872
-
873
- /**
874
- * Get Advance settings
875
- *
876
- * @param array $args The parameters array
877
- * @param string $content_type The content type
878
- */
879
- static function view_get_advanced_settings( &$args, $content_type ) {
880
- $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
881
- $advanced_settings = (array) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'advanced-settings', $view_settings );
882
-
883
- if ( $advanced_settings ) {
884
- foreach ( $advanced_settings as $setting ) {
885
- switch ( $setting ) {
886
-
887
- case 'author':
888
- $wp37 = PT_CV_Functions::wp_version_compare( '3.7' );
889
- $author_in = array_filter( PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'author__in', $view_settings ) ) );
890
- $author_not_in = array_filter( PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'author__not_in', $view_settings ) ) );
891
-
892
- if ( $author_in ) {
893
- $args = array_merge(
894
- $args, $wp37 ? array( 'author__in' => array_map( 'intval', $author_in ) ) : array( 'author' => intval( $author_in[ 0 ] ) )
895
- );
896
- }
897
-
898
- if ( $author_not_in && $wp37 ) {
899
- $args = array_merge(
900
- $args, array( 'author__not_in' => array_map( 'intval', $author_not_in ) )
901
- );
902
- }
903
-
904
- break;
905
-
906
- case 'status':
907
- $status = PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post_status', $view_settings, 'publish' ) );
908
- $args = array_merge(
909
- $args, array(
910
- 'post_status' => apply_filters( PT_CV_PREFIX_ . 'post_status', $status ),
911
- )
912
- );
913
- break;
914
-
915
- case 'search':
916
- if ( $search_val = PT_CV_Functions::setting_value( PT_CV_PREFIX . 's', $view_settings ) ) {
917
- $args = array_merge(
918
- $args, array(
919
- 's' => $search_val,
920
- )
921
- );
922
- }
923
- break;
924
-
925
- case 'taxonomy':
926
- $taxonomies = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'taxonomy', $view_settings );
927
- if ( !$taxonomies ) {
928
- break;
929
- }
930
-
931
- $tax_settings = array();
932
- foreach ( $taxonomies as $taxonomy ) {
933
- $terms = (array) PT_CV_Functions::setting_value( PT_CV_PREFIX . $taxonomy . '-terms', $view_settings );
934
- $terms = apply_filters( PT_CV_PREFIX_ . 'selected_terms', $terms, $taxonomy );
935
- if ( $terms ) {
936
- $operator = PT_CV_Functions::setting_value( PT_CV_PREFIX . $taxonomy . '-operator', $view_settings, 'IN' );
937
- if ( $operator === 'AND' && count( $terms ) == 1 ) {
938
- $operator = 'IN';
939
- }
940
-
941
- $tax_settings[] = array(
942
- 'taxonomy' => $taxonomy,
943
- 'field' => 'slug',
944
- 'terms' => $terms,
945
- 'operator' => $operator,
946
- /**
947
- * @since 1.7.2
948
- * Bug: "No post found" when one of selected terms is hierarchical & operator is AND
949
- */
950
- 'include_children' => apply_filters( PT_CV_PREFIX_ . 'include_children', $operator == 'AND' ? false : true )
951
- );
952
- }
953
- }
954
-
955
- if ( count( $tax_settings ) > 1 ) {
956
- $tax_settings[ 'relation' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'taxonomy-relation', $view_settings, 'AND' );
957
- }
958
-
959
- $args = array_merge( $args, array( 'tax_query' => apply_filters( PT_CV_PREFIX_ . 'taxonomy_setting', $tax_settings ) ) );
960
- break;
961
-
962
- case 'order':
963
- $orderby = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'orderby', $view_settings );
964
- $order = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'order', $view_settings );
965
- $order_settings = apply_filters( PT_CV_PREFIX_ . 'order_setting', array(
966
- 'orderby' => $orderby,
967
- 'order' => $orderby ? $order : '',
968
- ) );
969
- $args = array_merge( $args, $order_settings );
970
- break;
971
- }
972
- }
973
- }
974
- }
975
-
976
- /**
977
- * Get Fields settings
978
- *
979
- * @param array $dargs The settings array of Fields
980
- */
981
- static function view_get_display_settings( &$dargs ) {
982
- $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
983
- $view_type = $dargs[ 'view-type' ];
984
-
985
- $dargs[ 'layout-format' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format', $view_settings );
986
- $dargs[ 'number-columns' ] = apply_filters( PT_CV_PREFIX_ . 'item_per_row', PT_CV_Functions::setting_value( PT_CV_PREFIX . $view_type . '-' . 'number-columns', $view_settings, 1 ) );
987
- $dargs[ 'number-rows' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . $view_type . '-' . 'number-rows', $view_settings, 1 );
988
-
989
- $cfields_settings = PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . 'show-field-' );
990
- $cfields = (array) array_keys( (array) $cfields_settings );
991
- foreach ( $cfields as $field ) {
992
- if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'show-field-' . $field, $view_settings ) ) {
993
- $dargs[ 'fields' ][] = $field;
994
-
995
- switch ( $field ) {
996
- case 'title':
997
- $prefix = PT_CV_PREFIX . 'field-title-';
998
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
999
-
1000
- $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_title_setting_values', $field_setting, $prefix );
1001
-
1002
- break;
1003
-
1004
- case 'thumbnail':
1005
- $prefix = PT_CV_PREFIX . 'field-thumbnail-';
1006
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1007
-
1008
- $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_setting_values', $field_setting, $prefix );
1009
-
1010
- break;
1011
-
1012
- case 'meta-fields':
1013
- $prefix = PT_CV_PREFIX . 'meta-fields-';
1014
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1015
-
1016
- $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_setting_values', $field_setting, $prefix );
1017
-
1018
- break;
1019
-
1020
- case 'content':
1021
- $prefix = PT_CV_PREFIX . 'field-content-';
1022
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1023
-
1024
- if ( $field_setting[ 'show' ] == 'excerpt' ) {
1025
- $field_setting = array_merge( $field_setting, PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . 'field-excerpt-' ) );
1026
- }
1027
-
1028
- $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_content_setting_values', $field_setting, $prefix );
1029
-
1030
- break;
1031
- }
1032
- }
1033
- }
1034
- }
1035
-
1036
- /**
1037
- * Get Pagination settings
1038
- *
1039
- * @param array $dargs The settings array of Fields
1040
- * @param array $args The parameters array
1041
- * @param array $pargs The pagination settings array
1042
- */
1043
- static function view_get_pagination_settings( &$dargs, &$args, $pargs ) {
1044
- $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
1045
- $limit = trim( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'limit', $view_settings ) );
1046
- $limit = ( empty( $limit ) || $limit === '-1' ) ? 10000000 : $limit;
1047
- $limit = (int) apply_filters( PT_CV_PREFIX_ . 'settings_args_limit', $limit );
1048
- $args[ 'limit' ] = $args[ 'posts_per_page' ] = $limit;
1049
- $offset = 0;
1050
-
1051
- $pagination = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination', $view_settings );
1052
- if ( $pagination ) {
1053
- $prefix = PT_CV_PREFIX . 'pagination-';
1054
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1055
- $dargs[ 'pagination-settings' ] = apply_filters( PT_CV_PREFIX_ . 'pagination_settings', $field_setting, $prefix );
1056
- if ( !isset( $dargs[ 'pagination-settings' ][ 'type' ] ) ) {
1057
- $dargs[ 'pagination-settings' ][ 'type' ] = 'ajax';
1058
- }
1059
-
1060
- if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'normal' ) {
1061
- $dargs[ 'pagination-settings' ][ 'style' ] = '';
1062
- }
1063
-
1064
- $ppp = isset( $dargs[ 'pagination-settings' ][ 'items-per-page' ] ) ? (int) $dargs[ 'pagination-settings' ][ 'items-per-page' ] : $limit;
1065
- if ( $ppp > $limit ) {
1066
- $ppp = $limit;
1067
- }
1068
- $args[ 'posts_per_page' ] = $ppp;
1069
-
1070
- $paged = (int) self::get_current_page( $pargs );
1071
- $offset = $ppp * ( $paged - 1 );
1072
- if ( intval( $args[ 'posts_per_page' ] ) > $limit - $offset ) {
1073
- $args[ 'posts_per_page' ] = $limit - $offset;
1074
- }
1075
- }
1076
-
1077
- $args[ 'offset' ] = apply_filters( PT_CV_PREFIX_ . 'settings_args_offset', $offset );
1078
- $args[ 'by_contentviews' ] = true;
1079
- }
1080
-
1081
- /**
1082
- * Get Other settings
1083
- *
1084
- * @param array $dargs The settings array of Fields
1085
- */
1086
- static function view_get_other_settings( &$dargs ) {
1087
- $prefix = PT_CV_PREFIX . 'other-';
1088
- $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1089
- $dargs[ 'other-settings' ] = apply_filters( PT_CV_PREFIX_ . 'other_settings', $field_setting );
1090
- }
1091
-
1092
- /**
1093
- * Process data when submit form add/edit view
1094
- *
1095
- * @return void
1096
- */
1097
- static function view_submit() {
1098
- if ( empty( $_POST ) ) {
1099
- return;
1100
- }
1101
-
1102
- PT_CV_Functions::_nonce_check( 'form_nonce', 'view_submit' );
1103
-
1104
- // Insert View
1105
- $title = cv_esc_sql( $_POST[ PT_CV_PREFIX . 'view-title' ] );
1106
- $cur_pid = cv_esc_sql( $_POST[ PT_CV_PREFIX . 'post-id' ] );
1107
- if ( !$cur_pid ) {
1108
- $post_id = PT_CV_Functions::post_insert( array( 'ID' => 0, 'title' => $title ) );
1109
- } else {
1110
- $post_id = absint( $cur_pid );
1111
- }
1112
-
1113
- // Add/Update View data
1114
- $view_id = empty( $_POST[ PT_CV_PREFIX . 'view-id' ] ) ? PT_CV_Functions::string_random() : cv_sanitize_vid( $_POST[ PT_CV_PREFIX . 'view-id' ] );
1115
- update_post_meta( $post_id, PT_CV_META_ID, $view_id );
1116
- update_post_meta( $post_id, PT_CV_META_SETTINGS, $_POST );
1117
-
1118
- // Update View title
1119
- if ( strpos( $title, '[ID:' ) === false ) {
1120
- PT_CV_Functions::post_insert( array( 'ID' => $post_id, 'title' => sprintf( '%s [ID: %s]', $title, $view_id ) ) );
1121
- }
1122
-
1123
- $edit_link = PT_CV_Functions::view_link( $view_id );
1124
- ?>
1125
- <script type="text/javascript">
1126
- window.location = '<?php echo $edit_link; ?>';
1127
- </script>
1128
- <?php
1129
- exit;
1130
- }
1131
-
1132
- /**
1133
- * Add shortcode
1134
- *
1135
- * @param array $atts Array of setting parameters for shortcode
1136
- * @param string $content Content of shortcode
1137
- */
1138
- static function view_output( $atts ) {
1139
- $atts = shortcode_atts( apply_filters( PT_CV_PREFIX_ . 'shortcode_params', array( 'id' => 0 ) ), $atts );
1140
- $id = cv_sanitize_vid( $atts[ 'id' ] );
1141
- if ( $id && !self::duplicated_process( $id, $atts ) ) {
1142
- # Backup the global post, ensure this happens only one time per page
1143
- if ( !isset( $GLOBALS[ 'cv_gpost_bak' ] ) && isset( $GLOBALS[ 'post' ] ) ) {
1144
- $GLOBALS[ 'cv_gpost_bak' ] = $GLOBALS[ 'post' ];
1145
- }
1146
-
1147
- $result = apply_filters( PT_CV_PREFIX_ . 'view_shortcode_output', null, $atts );
1148
- if ( empty( $result ) ) {
1149
- $settings = PT_CV_Functions::view_get_settings( $id );
1150
- $view_html = PT_CV_Functions::view_process_settings( $id, $settings, null, $atts );
1151
- $result = PT_CV_Functions::view_final_output( $view_html );
1152
- do_action( PT_CV_PREFIX_ . 'flushed_output', $result );
1153
- }
1154
-
1155
- # Restore the global post
1156
- if ( isset( $GLOBALS[ 'cv_gpost_bak' ] ) ) {
1157
- $GLOBALS[ 'post' ] = $GLOBALS[ 'cv_gpost_bak' ];
1158
- }
1159
-
1160
- return $result;
1161
- }
1162
- }
1163
-
1164
- /**
1165
- * Final output of View: HTML & Assets
1166
- *
1167
- * @param string $html
1168
- */
1169
- static function view_final_output( $html ) {
1170
- ob_start();
1171
- PT_CV_Html::assets_of_view_types();
1172
- $view_assets = ob_get_clean();
1173
-
1174
- $class = apply_filters( PT_CV_PREFIX_ . 'wrapper_class', PT_CV_PREFIX . 'wrapper' );
1175
- return sprintf( '<div class="%s">%s</div>', $class, $html ) . $view_assets;
1176
- }
1177
-
1178
- /**
1179
- * Generate link to View page: Add view/ Edit view
1180
- *
1181
- * @param string $view_id The view id
1182
- * @param array $action Custom parameters
1183
- *
1184
- * @return string
1185
- */
1186
- public static function view_link( $view_id, $action = array() ) {
1187
- $edit_link = admin_url( 'admin.php?page=' . PT_CV_DOMAIN . '-add' );
1188
- if ( !empty( $view_id ) ) {
1189
- $query_args = apply_filters( PT_CV_PREFIX_ . 'view_link_args', array( 'id' => $view_id ) + $action );
1190
- $edit_link = add_query_arg( $query_args, $edit_link );
1191
- }
1192
-
1193
- return $edit_link;
1194
- }
1195
-
1196
- /**
1197
- * Callback function for ajax Preview action 'preview_request'
1198
- */
1199
- static function ajax_callback_preview_request() {
1200
- // Validate request
1201
- check_ajax_referer( PT_CV_PREFIX_ . 'ajax_nonce', 'ajax_nonce' );
1202
-
1203
- if ( !empty( $_POST[ 'data' ] ) ) {
1204
- define( 'PT_CV_DOING_PREVIEW', true );
1205
- do_action( PT_CV_PREFIX_ . 'preview_header' );
1206
-
1207
- $settings = array();
1208
- parse_str( $_POST[ 'data' ], $settings );
1209
-
1210
- $view_id = cv_sanitize_vid( PT_CV_Functions::url_extract_param( 'id' ) );
1211
- if ( empty( $view_id ) ) {
1212
- $view_id = PT_CV_Functions::string_random();
1213
- }
1214
-
1215
- // Show output
1216
- echo PT_CV_Functions::view_process_settings( $view_id, $settings );
1217
-
1218
- do_action( PT_CV_PREFIX_ . 'preview_footer' );
1219
- }
1220
-
1221
- // Must exit
1222
- die;
1223
- }
1224
-
1225
- /**
1226
- * Callback function for ajax Pagination action 'pagination_request'
1227
- */
1228
- static function ajax_callback_pagination_request() {
1229
- // Validate request
1230
- #check_ajax_referer( PT_CV_PREFIX_ . 'ajax_nonce', 'ajax_nonce' ); //disabled since 1.7.9 due to output -1 when use cache plugin, or nonce expired
1231
-
1232
- if ( !isset( $_POST[ 'sid' ] ) )
1233
- return 'Empty View ID';
1234
-
1235
- define( 'PT_CV_DOING_PAGINATION', true );
1236
-
1237
- $view_id = cv_sanitize_vid( $_POST[ 'sid' ] );
1238
- $settings = cv_comp_pagination_settings( 'get', NULL );
1239
- if ( !$settings ) {
1240
- $settings = PT_CV_Functions::view_get_settings( $view_id );
1241
- }
1242
-
1243
- // Switch language
1244
- $language = empty( $_POST[ 'lang' ] ) ? '' : cv_esc_sql( $_POST[ 'lang' ] );
1245
- self::switch_language( $language );
1246
-
1247
- // Show output
1248
- echo PT_CV_Functions::view_process_settings( $view_id, $settings, array( 'page' => absint( $_POST[ 'page' ] ) ) );
1249
-
1250
- // Must exit
1251
- die;
1252
- }
1253
-
1254
- /**
1255
- * Pagination output
1256
- *
1257
- * @param int $total_pages Total pages
1258
- * @param int $current_page Current page number
1259
- * @param int $pages_to_show Number of page to show
1260
- */
1261
- static function pagination( $total_pages, $current_page = 1, $pages_to_show = 4 ) {
1262
- if ( $total_pages == 1 )
1263
- return '';
1264
-
1265
- $pages_to_show = apply_filters( PT_CV_PREFIX_ . 'pages_to_show', $pages_to_show );
1266
- $labels = apply_filters( PT_CV_PREFIX_ . 'pagination_label', array(
1267
- 'prev' => '&lsaquo;',
1268
- 'next' => '&rsaquo;',
1269
- ) );
1270
-
1271
- $static_frontpage = (is_front_page() && !is_home());
1272
-
1273
- global $wp_filter, $wp_rewrite;
1274
- $filters_bak = $wp_filter;
1275
- remove_all_filters( 'paginate_links' );
1276
- remove_all_filters( 'get_pagenum_link' );
1277
- add_filter( 'paginate_links', 'cv_comp_pagination_remove_old_param' );
1278
-
1279
- $pb_bak = $wp_rewrite->pagination_base;
1280
- $wp_rewrite->pagination_base = $static_frontpage ? $pb_bak : PT_CV_PAGE_VAR;
1281
-
1282
- $params = array(
1283
- 'current' => $current_page,
1284
- 'total' => $total_pages,
1285
- 'type' => 'array',
1286
- 'prev_text' => $labels[ 'prev' ],
1287
- 'next_text' => $labels[ 'next' ],
1288
- 'mid_size' => $pages_to_show ? intval( $pages_to_show ) / 2 : 2,
1289
- );
1290
- if ( !$wp_rewrite->using_permalinks() && !$static_frontpage ) {
1291
- $params[ 'format' ] = '?' . PT_CV_PAGE_VAR . '=%#%';
1292
- }
1293
-
1294
- $links = paginate_links( $params );
1295
-
1296
- $wp_filter = $filters_bak;
1297
- $wp_rewrite->pagination_base = $pb_bak;
1298
-
1299
- $html = '';
1300
- foreach ( $links as $link ) {
1301
- $class = strpos( $link, 'current' ) !== false ? 'class="active"' : '';
1302
- $link = preg_replace( '/<span[^>]*>/', '<a href="#">', $link );
1303
- $link = str_replace( '</span>', '</a>', $link );
1304
- $link = str_replace( array( 'page-numbers', 'prev', 'next' ), '', $link );
1305
-
1306
- if ( get_query_var( 'paged' ) && !$static_frontpage && $wp_rewrite->using_permalinks() ) {
1307
- $link = preg_replace( "/\/page\/\d+/", '', $link );
1308
- }
1309
-
1310
- $html .= "<li $class>" . $link . "</li>\n\t";
1311
- }
1312
-
1313
- return $html;
1314
- }
1315
-
1316
- /**
1317
- * Get current page number
1318
- */
1319
- static function get_current_page( $pargs ) {
1320
- $paged = 1;
1321
-
1322
- if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination' ) ) {
1323
- if ( !empty( $pargs[ 'page' ] ) ) {
1324
- $paged = absint( $pargs[ 'page' ] );
1325
- }
1326
- $pagenum = cv_comp_get_page_number();
1327
- if ( !empty( $pagenum ) && PT_CV_Functions::setting_value( PT_CV_PREFIX . 'pagination-type' ) === 'normal' ) {
1328
- $paged = absint( $pagenum );
1329
- }
1330
- }
1331
-
1332
- return apply_filters( PT_CV_PREFIX_ . 'set_current_page', $paged );
1333
- }
1334
-
1335
- /**
1336
- * Check if using pagination: Non-ajax or First page (of Ajax pagination)
1337
- *
1338
- * @param array $dargs
1339
- * @param int $current_page
1340
- * @return bool
1341
- */
1342
- static function nonajax_or_firstpage( $dargs, $current_page ) {
1343
- if ( !PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination' ) ) {
1344
- return false;
1345
- }
1346
-
1347
- if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'normal' ) {
1348
- return true;
1349
- } else if ( $current_page === 1 ) {
1350
- return true;
1351
- } else {
1352
- return false;
1353
- }
1354
- }
1355
-
1356
- /**
1357
- * Extract param's value from URL
1358
- *
1359
- * @param string $pname Name of parameter
1360
- * @return string
1361
- */
1362
- static function url_extract_param( $pname, $default = null ) {
1363
- $query = array();
1364
- $url = $_SERVER[ 'REQUEST_URI' ];
1365
- if ( strpos( $url, 'admin-ajax.php' ) !== false ) {
1366
- $url = $_SERVER[ 'HTTP_REFERER' ];
1367
- }
1368
-
1369
- $parts = parse_url( $url );
1370
- if ( isset( $parts[ 'query' ] ) ) {
1371
- parse_str( $parts[ 'query' ], $query );
1372
-
1373
- return !empty( $query[ $pname ] ) ? $query[ $pname ] : $default;
1374
- }
1375
-
1376
- return $default;
1377
- }
1378
-
1379
- /**
1380
- * Set global variable
1381
- *
1382
- * @global array $pt_cv_glb
1383
- * @global string $pt_cv_id
1384
- * @param type $variable
1385
- * @param type $value
1386
- */
1387
- static function set_global_variable( $variable, $value ) {
1388
- global $pt_cv_glb, $pt_cv_id;
1389
- $pt_cv_glb[ $pt_cv_id ][ $variable ] = $value;
1390
- }
1391
-
1392
- /**
1393
- * Get global variable
1394
- *
1395
- * @global array $pt_cv_glb
1396
- * @global string $pt_cv_id
1397
- * @param string $variable
1398
- * @return mixed
1399
- */
1400
- static function get_global_variable( $variable, $unset = false ) {
1401
- global $pt_cv_glb, $pt_cv_id;
1402
- if ( !$pt_cv_glb || !$pt_cv_id )
1403
- return null;
1404
-
1405
- $value = isset( $pt_cv_glb[ $pt_cv_id ][ $variable ] ) ? $pt_cv_glb[ $pt_cv_id ][ $variable ] : null;
1406
-
1407
- // Unset after get
1408
- if ( $unset && $value ) {
1409
- unset( $pt_cv_glb[ $pt_cv_id ][ $variable ] );
1410
- }
1411
-
1412
- return $value;
1413
- }
1414
-
1415
- /**
1416
- * Output debug message (if debug is enable) / nice message (otherwise)
1417
- * @param string $log Raw log for debugging
1418
- * @param string $message Nice message for user
1419
- */
1420
- static function debug_output( $log, $message = '' ) {
1421
- return defined( 'PT_CV_DEBUG' ) ? ( PT_CV_DEBUG ? $log : $message ) : $message;
1422
- }
1423
-
1424
- // Reset WP query
1425
- static function reset_query() {
1426
- if ( apply_filters( PT_CV_PREFIX_ . 'reset_query', true ) ) {
1427
- wp_reset_postdata();
1428
- }
1429
- }
1430
-
1431
- /**
1432
- * Check duplicated View
1433
- * @return bool
1434
- */
1435
- static function duplicated_process( $view_id, $sc_params ) {
1436
- $duplicated = false;
1437
-
1438
- if ( apply_filters( PT_CV_PREFIX_ . 'check_duplicate', 0, $view_id, $sc_params ) ) {
1439
- global $pt_cv_views;
1440
-
1441
- $vid = $view_id . '-' . md5( serialize( $sc_params ) );
1442
- if ( !empty( $pt_cv_views[ $vid ] ) ) {
1443
- $duplicated = true;
1444
- } else {
1445
- $pt_cv_views[ $vid ] = 1;
1446
- }
1447
- }
1448
-
1449
- return $duplicated;
1450
- }
1451
-
1452
- /**
1453
- * Disable View shortcode in posts of current View
1454
- * @since 1.7.6
1455
- *
1456
- * @global array $shortcode_tags
1457
- * @global array $shortcode_tags_backup
1458
- * @param string $action
1459
- */
1460
- static function disable_view_shortcode( $action = 'disable' ) {
1461
- if ( apply_filters( PT_CV_PREFIX_ . 'disable_child_shortcode', true ) ) {
1462
- global $shortcode_tags, $shortcode_tags_backup;
1463
-
1464
- if ( $action == 'disable' ) {
1465
- $shortcode_tags_backup = $shortcode_tags;
1466
- $shortcode_tags[ 'pt_view' ] = '__return_false';
1467
- } else {
1468
- $shortcode_tags = $shortcode_tags_backup;
1469
- }
1470
- }
1471
- }
1472
-
1473
- }
1474
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1475
  }
1
+ <?php
2
+ /**
3
+ * Contain main functions to work with plugin, post, custom fields...
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( !function_exists( 'get_plugin_data' ) ) {
16
+ require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
17
+ }
18
+ if ( !class_exists( 'PT_CV_Functions' ) ) {
19
+
20
+ /**
21
+ * @name PT_CV_Functions
22
+ * @todo Utility functions
23
+ */
24
+ class PT_CV_Functions {
25
+
26
+ static $prev_random_string = '';
27
+
28
+ /**
29
+ * Compare current Wordpress version with a version
30
+ *
31
+ * @global string $wp_version
32
+ *
33
+ * @param string $version_to_compare
34
+ * @param string $operator
35
+ *
36
+ * @return boolean
37
+ */
38
+ static function wp_version_compare( $version_to_compare, $operator = '>=' ) {
39
+ if ( empty( $version_to_compare ) ) {
40
+ return true;
41
+ }
42
+
43
+ global $wp_version;
44
+
45
+ // Check if using Wordpress version 3.7 or higher
46
+ return version_compare( $wp_version, $version_to_compare, $operator );
47
+ }
48
+
49
+ /**
50
+ * Get current language of site
51
+ */
52
+ static function get_language() {
53
+ $language = '';
54
+
55
+ // WPML
56
+ global $sitepress;
57
+ if ( $sitepress && method_exists( $sitepress, 'get_current_language' ) ) {
58
+ $language = $sitepress->get_current_language();
59
+ }
60
+
61
+ /**
62
+ * qTranslate-X (and qTranslate, mqTranslate)
63
+ * @since 1.5.3
64
+ */
65
+ global $q_config;
66
+ if ( $q_config && !empty( $q_config[ 'language' ] ) ) {
67
+ $language = $q_config[ 'language' ];
68
+ }
69
+
70
+ return $language;
71
+ }
72
+
73
+ /**
74
+ * Switch language
75
+ *
76
+ * @global type $sitepress
77
+ * @param string $language Current language
78
+ */
79
+ static function switch_language( $language ) {
80
+ if ( !$language )
81
+ return;
82
+
83
+ // WPML
84
+ global $sitepress;
85
+ if ( $sitepress && $language ) {
86
+ $sitepress->switch_lang( $language, true );
87
+ }
88
+
89
+ /**
90
+ * qTranslate-X (and qTranslate, mqTranslate)
91
+ * @since 1.5.3
92
+ */
93
+ global $q_config;
94
+ if ( $q_config ) {
95
+ $q_config[ 'language' ] = $language;
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Get plugin info
101
+ *
102
+ * @param string $file Absolute path to the plugin file
103
+ * @param string $data Field of plugin data want to get
104
+ *
105
+ * @return array | null
106
+ */
107
+ static function plugin_info( $file, $data = '' ) {
108
+ $plugin_data = get_plugin_data( $file );
109
+
110
+ return isset( $plugin_data[ $data ] ) ? $plugin_data[ $data ] : NULL;
111
+ }
112
+
113
+ /**
114
+ * Add sub menu page
115
+ *
116
+ * @param string $parent_slug Slug of parent menu
117
+ * @param string $page_title Title of page
118
+ * @param string $menu_title Title of menu
119
+ * @param string $user_role Required role to see this menu
120
+ * @param string $sub_page Slug of sub menu
121
+ * @param string $class Class name which contains function to output content of page created by this menu
122
+ */
123
+ static function menu_add_sub( $parent_slug, $page_title, $menu_title, $user_role, $sub_page, $class ) {
124
+ return add_submenu_page(
125
+ $parent_slug, $page_title, $menu_title, $user_role, $parent_slug . '-' . $sub_page, array( $class, 'display_sub_page_' . $sub_page )
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Get current post type in Admin
131
+ *
132
+ * @global type $post
133
+ * @global type $typenow
134
+ * @global type $current_screen
135
+ * @return type
136
+ */
137
+ static function admin_current_post_type() {
138
+ global $post, $typenow, $current_screen;
139
+
140
+ //we have a post so we can just get the post type from that
141
+ if ( $post && $post->post_type ) {
142
+ return $post->post_type;
143
+ } //check the global $typenow - set in admin.php
144
+ elseif ( $typenow ) {
145
+ return $typenow;
146
+ } //check the global $current_screen object - set in sceen.php
147
+ elseif ( $current_screen && isset( $current_screen->post_type ) ) {
148
+ return $current_screen->post_type;
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Include content of file
154
+ *
155
+ * @param string $file_path Absolute path of file
156
+ *
157
+ * @return NULL | string Content of file
158
+ */
159
+ static function file_include_content( $file_path ) {
160
+ $content = NULL;
161
+
162
+ if ( file_exists( $file_path ) ) {
163
+ ob_start();
164
+ include_once $file_path;
165
+ $content = ob_get_clean();
166
+ }
167
+
168
+ return $content;
169
+ }
170
+
171
+ /**
172
+ * Get value of option Content Views Settings page
173
+ * @param string $option_name
174
+ * @param mixed $default
175
+ * @return mixed
176
+ */
177
+ static function get_option_value( $option_name, $default = '' ) {
178
+ $options = get_option( PT_CV_OPTION_NAME );
179
+ return isset( $options[ $option_name ] ) ? $options[ $option_name ] : $default;
180
+ }
181
+
182
+ /**
183
+ * Generate random string
184
+ *
185
+ * @param bool $prev_return Return previous generated string
186
+ *
187
+ * @return string
188
+ */
189
+ static function string_random( $prev_return = false ) {
190
+ if ( $prev_return ) {
191
+ return PT_CV_Functions::$prev_random_string;
192
+ }
193
+ // Don't use uniqid(), it will cause bug when multiple elements have same ID
194
+ $str = '0123456789abcdefghijklmnopqrstuvwxyz';
195
+ $rand = substr( md5( mt_rand() ), 0, 7 ) . substr( str_shuffle( $str ), 0, 3 );
196
+
197
+ PT_CV_Functions::$prev_random_string = $rand;
198
+
199
+ return PT_CV_Functions::$prev_random_string;
200
+ }
201
+
202
+ /**
203
+ * Create array from string, use explode function
204
+ *
205
+ * @param string $string String to explode
206
+ * @param string $delimiter Delimiter to explode string
207
+ *
208
+ * @return array
209
+ */
210
+ static function string_to_array( $string, $delimiter = ',' ) {
211
+ return is_array( $string ) ? $string : (array) explode( $delimiter, (string) str_replace( ' ', '', $string ) );
212
+ }
213
+
214
+ /**
215
+ * Slug to nice String
216
+ *
217
+ * @param string $slug Slug string
218
+ *
219
+ * @return string
220
+ */
221
+ static function string_slug_to_text( $slug ) {
222
+ $slug = preg_replace( '/[_\-]+/', ' ', $slug );
223
+
224
+ return ucwords( $slug );
225
+ }
226
+
227
+ /**
228
+ * Trims text to a certain number of words.
229
+ * @since 1.4.3
230
+ * @param string $text
231
+ * @param int $num_words
232
+ * @return string
233
+ */
234
+ static function cv_trim_words( $text, $num_words = 500 ) {
235
+ $text = apply_filters( PT_CV_PREFIX_ . 'before_generate_excerpt', $text );
236
+
237
+ if ( apply_filters( PT_CV_PREFIX_ . 'excerpt_strip_shortcode', true ) ) {
238
+ $text = self::cv_strip_shortcodes( $text );
239
+ } else {
240
+ $text = do_shortcode( $text );
241
+ }
242
+
243
+ // Prevent embedded URLs from showing
244
+ global $wp_embed;
245
+ if ( method_exists( $wp_embed, 'autoembed' ) ) {
246
+ $text = $wp_embed->autoembed( $text );
247
+ }
248
+
249
+ $result = self::cv_strip_tags( $text );
250
+ return self::trim_words( $result, $num_words );
251
+ }
252
+
253
+ /**
254
+ * Strip shortcodes in CV way, to replace WP strip_shortcodes()
255
+ * @after 1.8.3
256
+ * @param string $text
257
+ */
258
+ static function cv_strip_shortcodes( $text, $strip_all = true ) {
259
+ if ( apply_filters( PT_CV_PREFIX_ . 'excerpt_strip_all_shortcodes', false ) ) {
260
+ return strip_shortcodes( $text );
261
+ }
262
+
263
+ global $shortcode_tags, $cv_shortcode_tags_backup;
264
+ if ( !isset( $cv_shortcode_tags_backup ) ) {
265
+ $tagnames = array_keys( $shortcode_tags );
266
+ $tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );
267
+ } else {
268
+ $tagregexp = $cv_shortcode_tags_backup;
269
+ }
270
+
271
+ if ( $strip_all ) {
272
+ // Strip some shortcodes
273
+ $temp_shortcode_tags = $shortcode_tags;
274
+ $shortcode_tags = apply_filters( PT_CV_PREFIX_ . 'shortcode_to_strip', array( 'caption' => '', 'embed' => '' ) );
275
+ $text = strip_shortcodes( $text );
276
+ $shortcode_tags = $temp_shortcode_tags;
277
+ }
278
+
279
+ // Keep other shortcodes' content
280
+ return preg_replace( '/'
281
+ . '\[' // Opening bracket
282
+ . '(\/?)'
283
+ . "($tagregexp)" // All shortcode tags
284
+ . '[^\]]*' // Shortcode parameters
285
+ . '\]' // Closing bracket
286
+ . '/', '', $text );
287
+ }
288
+
289
+ /**
290
+ * Trim words in CV way
291
+ * @return string
292
+ */
293
+ static function trim_words( $text, $num_words ) {
294
+ $more = '';
295
+ $text = apply_filters( PT_CV_PREFIX_ . 'before_trim_words', $text );
296
+
297
+ /*
298
+ * translators: If your word count is based on single characters (e.g. East Asian characters),
299
+ * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
300
+ * Do not translate into your own language.
301
+ */
302
+ /**
303
+ * Do not use "[\r\n\t ]|\xC2\xA0|&nbsp;" as regex pattern, it can stop PHP process
304
+ * @since 1.9.5
305
+ */
306
+ $text = str_replace( array( '\xC2\xA0', '&nbsp;' ), ' ', $text );
307
+ if ( strpos( _x( 'words', 'Word count type. Do not translate!' ), 'characters' ) === 0 && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) ) {
308
+ $text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
309
+ preg_match_all( '/./u', $text, $words_array );
310
+ $words_array = array_slice( $words_array[ 0 ], 0, $num_words + 1 );
311
+ $sep = '';
312
+ } else {
313
+ $words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
314
+ $sep = ' ';
315
+ }
316
+
317
+ if ( count( $words_array ) > $num_words ) {
318
+ array_pop( $words_array );
319
+ $text = implode( $sep, $words_array );
320
+ $text = $text . $more;
321
+ } else {
322
+ $text = implode( $sep, $words_array );
323
+ }
324
+
325
+ return apply_filters( PT_CV_PREFIX_ . 'after_trim_words', $text );
326
+ }
327
+
328
+ /**
329
+ * Custom strip tags, allow some tags
330
+ *
331
+ * @since 1.4.6
332
+ * @param string $string
333
+ * @return string
334
+ */
335
+ static function cv_strip_tags( $string ) {
336
+ // Changes double line-breaks in the text into HTML paragraphs (<p>, <br>)
337
+ if ( apply_filters( PT_CV_PREFIX_ . 'wpautop', 0 ) ) {
338
+ $string = wpautop( $string );
339
+ }
340
+
341
+ // Remove entire tag content
342
+ $tags_to_rm = apply_filters( PT_CV_PREFIX_ . 'tag_to_remove', array( 'script', 'style' ) );
343
+ $string = preg_replace( array( '@<(' . implode( '|', $tags_to_rm ) . ')[^>]*(?>.*?</\\1>|/?>)@si' ), '', $string );
344
+
345
+ // Strip HTML tags
346
+ if ( apply_filters( PT_CV_PREFIX_ . 'strip_tags', 1 ) ) {
347
+ $allowed_tags = '';
348
+ if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
349
+ $allowable_tags = (array) apply_filters( PT_CV_PREFIX_ . 'allowable_tags', array( '<a>', '<br>', '<strong>', '<em>', '<strike>', '<i>', '<ul>', '<ol>', '<li>' ) );
350
+ $allowed_tags = implode( '', $allowable_tags );
351
+ }
352
+
353
+ $string = strip_tags( $string, $allowed_tags );
354
+ }
355
+
356
+ return trim( $string );
357
+ }
358
+
359
+ /**
360
+ * Handle slug of non-latin languages
361
+ * used in CVP < 4.1
362
+ *
363
+ * @param string $slug
364
+ * @param boolean $sanitize
365
+ * @return string
366
+ */
367
+ static function term_slug_sanitize( $slug, $sanitize = false ) {
368
+ if ( $sanitize && preg_match( '/%[0-9a-f][0-9a-f]/', $slug ) ) {
369
+ $slug = str_replace( '%', '@', $slug );
370
+ }
371
+
372
+ return $slug;
373
+ }
374
+
375
+ /**
376
+ * Get thumbnail dimensions
377
+ *
378
+ * @param array $fargs The settings of thumbnail
379
+ *
380
+ * @return array
381
+ */
382
+ static function field_thumbnail_dimensions( $fargs ) {
383
+ $size = $fargs[ 'size' ];
384
+
385
+ return (array) explode( '&times;', str_replace( ' ', '', $size ) );
386
+ }
387
+
388
+ /**
389
+ * Get value of a setting from global settings array
390
+ *
391
+ * @param string $field The full name of setting to get value
392
+ * @param array $array_to_get Array to get values of wanted setting
393
+ * @param mixed|null $assign The value to assign if setting is not found
394
+ */
395
+ static function setting_value( $field, $array_to_get = NULL, $assign = NULL ) {
396
+ if ( empty( $array_to_get ) ) {
397
+ $array_to_get = PT_CV_Functions::get_global_variable( 'view_settings' );
398
+ }
399
+
400
+ return isset( $array_to_get[ $field ] ) ? $array_to_get[ $field ] : $assign;
401
+ }
402
+
403
+ /**
404
+ * Get values of settings from global settings array
405
+ *
406
+ * @param array $fields Array of setting fields to get value
407
+ * @param array $array_to_save Array to save values of wanted setting fields
408
+ * @param array $array_to_get Array to get values of wanted setting fields
409
+ * @param string $prefix Prefix string to looking for fields in $array_to_get
410
+ */
411
+ static function settings_values( $fields, &$array_to_save, $array_to_get, $prefix ) {
412
+ foreach ( $fields as $tsetting ) {
413
+ $array_to_save[ $tsetting ] = PT_CV_Functions::setting_value( $prefix . $tsetting, $array_to_get );
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Get names of options for a setting group (setting name started by a prefix)
419
+ *
420
+ * @param string $prefix The prefix in name of settings
421
+ * @param array $options The options array (contain full paramaters of settings)
422
+ */
423
+ static function settings_keys( $prefix, $options ) {
424
+ $result = array();
425
+ foreach ( $options as $option ) {
426
+ if ( isset( $option[ 'params' ] ) ) {
427
+ foreach ( $option[ 'params' ] as $params ) {
428
+ // If name of setting match with prefix string, got it name
429
+ if ( isset( $params[ 'name' ] ) && substr( $params[ 'name' ], 0, strlen( $prefix ) ) === $prefix ) {
430
+ $result[] = substr( $params[ 'name' ], strlen( $prefix ) );
431
+ }
432
+ }
433
+ }
434
+ }
435
+
436
+ return $result;
437
+ }
438
+
439
+ /**
440
+ * Get value of some setting options by prefix
441
+ *
442
+ * @param string $prefix The prefix in name of setting options
443
+ * @param bool $backend Get settings from Backend form
444
+ */
445
+ static function settings_values_by_prefix( $prefix, $backend = FALSE ) {
446
+ $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
447
+
448
+ if ( !$view_settings && $backend ) {
449
+ global $pt_cv_admin_settings;
450
+ $view_settings = $pt_cv_admin_settings;
451
+ }
452
+
453
+ $result = array();
454
+ $strlen = strlen( $prefix );
455
+ foreach ( (array) $view_settings as $name => $value ) {
456
+ // If name of setting match with prefix string, got it
457
+ if ( strpos( $name, $prefix ) === 0 ) {
458
+ $result[ substr( $name, $strlen ) ] = $value;
459
+ }
460
+ }
461
+
462
+ return $result;
463
+ }
464
+
465
+ /**
466
+ * Get terms list of a post
467
+ *
468
+ * @param object $post The post object
469
+ *
470
+ * @return string
471
+ */
472
+ static function post_terms( $post ) {
473
+ global $pt_cv_glb;
474
+
475
+ $links = array();
476
+ $taxonomy_terms = array();
477
+ $post_terms = array();
478
+ $taxonomies = get_taxonomies( array( 'public' => true ), 'names' );
479
+ $taxonomies_to_show = apply_filters( PT_CV_PREFIX_ . 'taxonomies_to_show', $taxonomies );
480
+ $post_id = is_object( $post ) ? $post->ID : $post;
481
+ $terms = wp_get_object_terms( $post_id, $taxonomies );
482
+
483
+ foreach ( $terms as $term ) {
484
+ $term_html = '';
485
+ $term_slug = $term->slug;
486
+ $include_this = apply_filters( PT_CV_PREFIX_ . 'terms_include_this', true, $term ) && in_array( $term->taxonomy, $taxonomies_to_show );
487
+ if ( $include_this ) {
488
+ $href = esc_url( get_term_link( $term, $term->taxonomy ) );
489
+ $term_name = esc_attr( $term->name );
490
+ $class = esc_attr( PT_CV_PREFIX . 'tax-' . $term_slug );
491
+ $term_html = apply_filters( PT_CV_PREFIX_ . 'post_term_html', "<a href='$href' title='$term_name' class='$class'>{$term->name}</a>", $term );
492
+ $links[] = $term_html;
493
+ }
494
+
495
+ $term_info = apply_filters( PT_CV_PREFIX_ . 'post_term', array( 'key' => $term_slug, 'value' => $term->name ), $term );
496
+ $post_terms[ $term_info[ 'key' ] ] = $term_info[ 'value' ];
497
+
498
+ // Add this term to terms list of an item
499
+ if ( !isset( $taxonomy_terms[ $term->taxonomy ] ) ) {
500
+ $taxonomy_terms[ $term->taxonomy ] = array();
501
+ }
502
+ $taxonomy_terms[ $term->taxonomy ][] = $term_html;
503
+ }
504
+
505
+ if ( $post_terms ) {
506
+ if ( !isset( $pt_cv_glb[ 'item_terms' ] ) ) {
507
+ $pt_cv_glb[ 'item_terms' ] = array();
508
+ }
509
+
510
+ $pt_cv_glb[ 'item_terms' ][ $post_id ] = $post_terms;
511
+ }
512
+
513
+ return apply_filters( PT_CV_PREFIX_ . 'post_terms_output', implode( ', ', $links ), $links, $taxonomy_terms );
514
+ }
515
+
516
+ /**
517
+ * Insert/Update post
518
+ *
519
+ * @param string $arr Array of post data
520
+ */
521
+ static function post_insert( $arr ) {
522
+ if ( !isset( $arr[ 'ID' ] ) ) {
523
+ return;
524
+ }
525
+ // Create post object
526
+ $my_post = array(
527
+ 'ID' => (int) $arr[ 'ID' ],
528
+ 'post_type' => PT_CV_POST_TYPE,
529
+ 'post_content' => '',
530
+ 'post_title' => !empty( $arr[ 'title' ] ) ? $arr[ 'title' ] : __( '(no title)', 'content-views-query-and-display-post-page' ),
531
+ 'post_status' => 'publish',
532
+ );
533
+
534
+ // Insert the post into the database
535
+ return wp_insert_post( $my_post );
536
+ }
537
+
538
+ /**
539
+ * Get View id in post table, from "id" meta key value
540
+ *
541
+ * @param string $meta_id ID of custom field
542
+ *
543
+ * @return int Return Post ID of this view
544
+ */
545
+ static function post_id_from_meta_id( $meta_id ) {
546
+
547
+ $post_id = 0;
548
+ if ( !$meta_id ) {
549
+ return $post_id;
550
+ }
551
+
552
+ // Query view which has view id = $meta_id
553
+ $pt_query = new WP_Query(
554
+ array(
555
+ 'suppress_filters' => true,
556
+ 'post_type' => PT_CV_POST_TYPE,
557
+ 'post_status' => 'publish',
558
+ 'meta_key' => PT_CV_META_ID,
559
+ 'meta_value' => cv_esc_sql( $meta_id ),
560
+ 'cv_get_view' => true,
561
+ )
562
+ );
563
+
564
+ if ( $pt_query->have_posts() ) :
565
+ while ( $pt_query->have_posts() ):
566
+ $pt_query->the_post();
567
+ $post_id = get_the_ID();
568
+ endwhile;
569
+ endif;
570
+
571
+ self::reset_query();
572
+
573
+ return $post_id;
574
+ }
575
+
576
+ /**
577
+ * Get first key of array
578
+ *
579
+ * @param array $args Array data
580
+ *
581
+ * @return string
582
+ */
583
+ static function array_get_first_key( $args ) {
584
+ return current( array_keys( (array) $args ) );
585
+ }
586
+
587
+ /**
588
+ * Get view settings from view ID
589
+ *
590
+ * @param string $meta_id ID of custom field
591
+ *
592
+ * @return array
593
+ */
594
+ static function view_get_settings( $meta_id, &$post_id = null ) {
595
+ if ( !$meta_id ) {
596
+ return;
597
+ }
598
+
599
+ do_action( PT_CV_PREFIX_ . 'get_view_settings' );
600
+
601
+ $view_settings = array();
602
+
603
+ $post_id = PT_CV_Functions::post_id_from_meta_id( $meta_id );
604
+ if ( $post_id ) {
605
+ $view_settings = get_post_meta( $post_id, PT_CV_META_SETTINGS, true );
606
+ }
607
+
608
+ return apply_filters( PT_CV_PREFIX_ . 'view_settings', $view_settings );
609
+ }
610
+
611
+ /**
612
+ * Process view settings, return View output
613
+ *
614
+ * @param string $view_id View id
615
+ * @param array $settings Settings array
616
+ * @param array $pargs Pagination settings
617
+ * @param array $sc_params Shortcode parameters
618
+ *
619
+ * @return string View output
620
+ */
621
+ static function view_process_settings( $view_id, $settings, $pargs = array(), $sc_params = NULL ) {
622
+ if ( !defined( 'PT_CV_DOING_PREVIEW' ) && empty( $settings[ PT_CV_PREFIX . 'view-type' ] ) ) {
623
+ return sprintf( __( 'Error: View %s may not exist', 'content-views-query-and-display-post-page' ), "<strong>$view_id</strong>" );
624
+ }
625
+
626
+ do_action( PT_CV_PREFIX_ . 'view_process_start' );
627
+
628
+ global $pt_cv_glb, $pt_cv_id;
629
+
630
+ if ( !isset( $pt_cv_glb ) ) {
631
+ $pt_cv_glb = array();
632
+ }
633
+
634
+ $pt_cv_id = $view_id;
635
+ $pt_cv_glb[ $pt_cv_id ] = array();
636
+
637
+ $view_settings = array_map( 'cv_esc_sql', $settings );
638
+ $pt_cv_glb[ $pt_cv_id ][ 'view_settings' ] = $view_settings;
639
+
640
+ $content_type = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'content-type', $view_settings );
641
+ $view_type = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'view-type', $view_settings );
642
+ $view_type = apply_filters( PT_CV_PREFIX_ . 'view_layout', $view_type, $view_id, $view_settings, $sc_params );
643
+ $current_page = self::get_current_page( $pargs );
644
+
645
+ $pt_cv_glb[ $pt_cv_id ][ 'content_type' ] = $content_type;
646
+ $pt_cv_glb[ $pt_cv_id ][ 'view_type' ] = $view_type;
647
+ $pt_cv_glb[ $pt_cv_id ][ 'current_page' ] = $current_page;
648
+
649
+ # Important: store current View ID, prevent it from being modified when process posts which contains View shortcode
650
+ $cv_live_id = $view_id;
651
+
652
+ $rebuild = isset( $view_settings[ PT_CV_PREFIX . 'rebuild' ] ) ? $view_settings[ PT_CV_PREFIX . 'rebuild' ] : false;
653
+ $dargs = PT_CV_Functions::view_display_settings( $view_type, $dargs );
654
+ $args = $rebuild ? $rebuild : PT_CV_Functions::view_filter_settings( $content_type, $view_settings );
655
+
656
+ if ( $sc_params ) {
657
+ $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ] = $sc_params;
658
+ } elseif ( isset( $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ] ) ) {
659
+ $sc_params = $view_settings[ PT_CV_PREFIX . 'shortcode_atts' ];
660
+ }
661
+ $pt_cv_glb[ $pt_cv_id ][ 'shortcode_params' ] = $sc_params;
662
+
663
+ PT_CV_Functions::view_get_pagination_settings( $dargs, $args, $pargs );
664
+
665
+ $dargs = apply_filters( PT_CV_PREFIX_ . 'all_display_settings', $dargs );
666
+ $args = apply_filters( PT_CV_PREFIX_ . 'query_parameters', $args );
667
+ $pt_cv_glb[ $pt_cv_id ][ 'dargs' ] = $dargs;
668
+ $pt_cv_glb[ $pt_cv_id ][ 'args' ] = $args;
669
+ do_action( PT_CV_PREFIX_ . 'add_global_variables' );
670
+
671
+ // Validate settings, if some required parameters are missing, show error and exit
672
+ $error = !$rebuild ? apply_filters( PT_CV_PREFIX_ . 'validate_settings', array(), $args ) : false;
673
+ if ( $error ) {
674
+ return ( implode( '</p><p>', $error ) );
675
+ }
676
+
677
+ $content_items = $pt_query = $empty_result = null;
678
+
679
+ // What kind of content to display
680
+ $pt_cv_glb[ $pt_cv_id ][ 'display_what' ] = apply_filters( PT_CV_PREFIX_ . 'display_what', 'post' );
681
+ if ( $pt_cv_glb[ $pt_cv_id ][ 'display_what' ] === 'post' ) {
682
+ extract( self::get_posts_list( $args, $view_type ) );
683
+ } else {
684
+ $content_items = apply_filters( PT_CV_PREFIX_ . 'view_content', array() );
685
+ }
686
+
687
+ $pt_cv_id = $cv_live_id;
688
+
689
+ if ( apply_filters( PT_CV_PREFIX_ . 'hide_empty_result', false ) && $empty_result ) {
690
+ $html = '';
691
+ } else {
692
+ // Wrap items
693
+ $html = PT_CV_Html::content_items_wrap( $content_items, $current_page, $args[ 'posts_per_page' ], $pt_cv_id );
694
+
695
+ // Show pagination
696
+ if ( $pt_query && apply_filters( PT_CV_PREFIX_ . 'show_pagination', PT_CV_Functions::nonajax_or_firstpage( $dargs, $current_page ) ) ) {
697
+ // Total post founds
698
+ $found_posts = (int) apply_filters( PT_CV_PREFIX_ . 'found_posts', $pt_query->found_posts );
699
+
700
+ // Total number of items
701
+ $total_items = ( $args[ 'limit' ] > 0 && $found_posts > $args[ 'limit' ] ) ? $args[ 'limit' ] : $found_posts;
702
+ $total_items = apply_filters( PT_CV_PREFIX_ . 'total_posts', $total_items );
703
+
704
+ // Total number of pages
705
+ $items_per_page = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'pagination-items-per-page', $view_settings );
706
+ $max_num_pages = ceil( $total_items / $items_per_page );
707
+ $max_num_pages = (int) $max_num_pages;
708
+
709
+ $pt_cv_glb[ $pt_cv_id ][ 'pagination_info' ] = compact( "total_items", "max_num_pages", "current_page" );
710
+
711
+ // Output pagination
712
+ if ( $max_num_pages > 1 ) {
713
+ if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'ajax' ) {
714
+ cv_comp_pagination_settings( 'set', $view_settings );
715
+ }
716
+
717
+ $html .= "\n" . PT_CV_Html::pagination_output( $max_num_pages, $current_page, $pt_cv_id );
718
+ } else {
719
+ if ( $max_num_pages == 1 && defined( 'PT_CV_DOING_PREVIEW' ) ) {
720
+ $reason = sprintf( '%s %s', ($total_items == $found_posts) ? __( 'the number of results', 'content-views-query-and-display-post-page' ) : __( 'the <b>Limit</b> value', 'content-views-query-and-display-post-page' ), __( 'is less than or equal to (&le;) the <b>Items per page</b> value', 'content-views-query-and-display-post-page' ) );
721
+ $html .= "\n" . sprintf( '<p class="alert alert-warning" style="padding: 10px 5px">%s %s.</p>', __( '[Preview only] Pagination is disabled when there is only 1 page, because of', 'content-views-query-and-display-post-page' ), $reason );
722
+ }
723
+ }
724
+ }
725
+ }
726
+
727
+ do_action( PT_CV_PREFIX_ . 'view_process_end' );
728
+
729
+ return apply_filters( PT_CV_PREFIX_ . 'view_html', $html );
730
+ }
731
+
732
+ /**
733
+ * Query posts
734
+ *
735
+ * @global mixed $post
736
+ * @param array $args
737
+ * @param string $view_type
738
+ * @return array
739
+ */
740
+ static function get_posts_list( $args, $view_type ) {
741
+ $empty_result = false;
742
+ $content_items = array();
743
+ $args = apply_filters( PT_CV_PREFIX_ . 'query_params', $args );
744
+
745
+ // The Query
746
+ do_action( PT_CV_PREFIX_ . 'before_query' );
747
+ $pt_query = new WP_Query( $args );
748
+ do_action( PT_CV_PREFIX_ . 'after_query', $pt_query->request );
749
+
750
+ //DEBUG_QUERY
751
+ //print_r( $pt_query->request );
752
+ // The Loop
753
+ if ( $pt_query->have_posts() ) {
754
+ do_action( PT_CV_PREFIX_ . 'before_process_item' );
755
+
756
+ $all_posts = array();
757
+ $post_idx = 0;
758
+ while ( $pt_query->have_posts() ) {
759
+ $pt_query->the_post();
760
+ global $post;
761
+
762
+ if ( apply_filters( PT_CV_PREFIX_ . 'show_this_post', $post ) ) {
763
+ $content_items[ $post->ID ] = PT_CV_Html::view_type_output( $view_type, $post, $post_idx++ );
764
+ $all_posts[ $post->ID ] = $post;
765
+ }
766
+ }
767
+ $GLOBALS[ 'cv_posts' ] = $all_posts;
768
+
769
+ do_action( PT_CV_PREFIX_ . 'after_process_item' );
770
+ } else {
771
+ $_class = apply_filters( PT_CV_PREFIX_ . 'content_no_post_found_class', 'alert alert-warning ' . PT_CV_PREFIX . 'no-post' );
772
+ $_text = PT_CV_Html::no_post_found();
773
+ $content_items[] = sprintf( '<div class="%s">%s</div>', esc_attr( $_class ), $_text );
774
+ $empty_result = true;
775
+ PT_CV_Functions::set_global_variable( 'no_post_found', $empty_result );
776
+ }
777
+
778
+ self::reset_query();
779
+
780
+ return array( 'content_items' => apply_filters( PT_CV_PREFIX_ . 'content_items', $content_items, $view_type ), 'pt_query' => $pt_query, 'empty_result' => $empty_result );
781
+ }
782
+
783
+ /**
784
+ * Get query parameters of View
785
+ *
786
+ * @param string $content_type The current content type
787
+ * @param array $view_settings The settings of View
788
+ *
789
+ * @return array
790
+ */
791
+ static function view_filter_settings( $content_type, $view_settings ) {
792
+ /**
793
+ * Get Query parameters
794
+ * Set default values
795
+ */
796
+ $args = array(
797
+ 'post_type' => apply_filters( PT_CV_PREFIX_ . 'post_type', $content_type ),
798
+ 'post_status' => apply_filters( PT_CV_PREFIX_ . 'post_status', array( 'publish' ) ),
799
+ 'post__not_in' => array(),
800
+ );
801
+
802
+ // Ignore sticky posts
803
+ $args[ 'ignore_sticky_posts' ] = apply_filters( PT_CV_PREFIX_ . 'ignore_sticky_posts', 1 );
804
+
805
+ $post_in = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post__in', $view_settings );
806
+ $post_in = array_filter( PT_CV_Functions::string_to_array( $post_in ) );
807
+ if ( $post_in ) {
808
+ $args[ 'post__in' ] = array_map( 'intval', $post_in );
809
+ }
810
+
811
+ $post_not_in = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post__not_in', $view_settings );
812
+ $post_not_in = array_filter( PT_CV_Functions::string_to_array( $post_not_in ) );
813
+ if ( $post_not_in ) {
814
+ $args[ 'post__not_in' ] = array_map( 'intval', $post_not_in );
815
+ }
816
+ $args[ 'post__not_in' ] = apply_filters( PT_CV_PREFIX_ . 'post__not_in', $args[ 'post__not_in' ], $view_settings );
817
+
818
+ // Parent page
819
+ if ( in_array( $content_type, apply_filters( PT_CV_PREFIX_ . 'hierarchical_post_type', array( 'page' ) ) ) ) {
820
+ $post_parent = apply_filters( PT_CV_PREFIX_ . 'post_parent_id', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post_parent', $view_settings ) );
821
+ if ( !empty( $post_parent ) ) {
822
+ $args[ 'post_parent' ] = (int) $post_parent;
823
+ }
824
+ }
825
+
826
+ $args[ 'suppress_filters' ] = true;
827
+
828
+ PT_CV_Functions::view_get_advanced_settings( $args, $content_type );
829
+
830
+ return $args;
831
+ }
832
+
833
+ /**
834
+ * Get display parameters of View
835
+ *
836
+ * @param string $view_type The view type of View
837
+ *
838
+ * @return array
839
+ */
840
+ static function view_display_settings( $view_type, &$dargs = null ) {
841
+ $dargs = array();
842
+
843
+ $dargs[ 'view-type' ] = $view_type;
844
+
845
+ // Field settings of a item
846
+ PT_CV_Functions::view_get_display_settings( $dargs );
847
+
848
+ // Other settings
849
+ PT_CV_Functions::view_get_other_settings( $dargs );
850
+
851
+ // View type settings
852
+ $dargs[ 'view-type-settings' ] = PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . $view_type . '-' );
853
+
854
+ PT_CV_Functions::set_global_variable( 'dargs', $dargs );
855
+
856
+ return $dargs;
857
+ }
858
+
859
+ /**
860
+ * Get Advance settings
861
+ *
862
+ * @param array $args The parameters array
863
+ * @param string $content_type The content type
864
+ */
865
+ static function view_get_advanced_settings( &$args, $content_type ) {
866
+ $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
867
+ $advanced_settings = (array) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'advanced-settings', $view_settings );
868
+
869
+ if ( $advanced_settings ) {
870
+ foreach ( $advanced_settings as $setting ) {
871
+ switch ( $setting ) {
872
+
873
+ case 'author':
874
+ $wp37 = PT_CV_Functions::wp_version_compare( '3.7' );
875
+ $author_in = array_filter( PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'author__in', $view_settings ) ) );
876
+ $author_not_in = array_filter( PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'author__not_in', $view_settings ) ) );
877
+
878
+ if ( $author_in ) {
879
+ $args = array_merge(
880
+ $args, $wp37 ? array( 'author__in' => array_map( 'intval', $author_in ) ) : array( 'author' => intval( $author_in[ 0 ] ) )
881
+ );
882
+ }
883
+
884
+ if ( $author_not_in && $wp37 ) {
885
+ $args = array_merge(
886
+ $args, array( 'author__not_in' => array_map( 'intval', $author_not_in ) )
887
+ );
888
+ }
889
+
890
+ break;
891
+
892
+ case 'status':
893
+ $status = PT_CV_Functions::string_to_array( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'post_status', $view_settings, 'publish' ) );
894
+ $args = array_merge(
895
+ $args, array(
896
+ 'post_status' => apply_filters( PT_CV_PREFIX_ . 'post_status', $status ),
897
+ )
898
+ );
899
+ break;
900
+
901
+ case 'search':
902
+ if ( $search_val = PT_CV_Functions::setting_value( PT_CV_PREFIX . 's', $view_settings ) ) {
903
+ $args = array_merge(
904
+ $args, array(
905
+ 's' => $search_val,
906
+ )
907
+ );
908
+ }
909
+ break;
910
+
911
+ case 'taxonomy':
912
+ $taxonomies = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'taxonomy', $view_settings );
913
+ if ( !$taxonomies ) {
914
+ break;
915
+ }
916
+
917
+ $tax_settings = array();
918
+ foreach ( $taxonomies as $taxonomy ) {
919
+ $terms = (array) PT_CV_Functions::setting_value( PT_CV_PREFIX . $taxonomy . '-terms', $view_settings );
920
+ $terms = apply_filters( PT_CV_PREFIX_ . 'selected_terms', $terms, $taxonomy );
921
+ if ( $terms ) {
922
+ $operator = PT_CV_Functions::setting_value( PT_CV_PREFIX . $taxonomy . '-operator', $view_settings, 'IN' );
923
+ if ( $operator === 'AND' && count( $terms ) == 1 ) {
924
+ $operator = 'IN';
925
+ }
926
+
927
+ $tax_settings[] = array(
928
+ 'taxonomy' => $taxonomy,
929
+ 'field' => 'slug',
930
+ 'terms' => $terms,
931
+ 'operator' => $operator,
932
+ /**
933
+ * @since 1.7.2
934
+ * Bug: "No post found" when one of selected terms is hierarchical & operator is AND
935
+ */
936
+ 'include_children' => apply_filters( PT_CV_PREFIX_ . 'include_children', $operator == 'AND' ? false : true )
937
+ );
938
+ }
939
+ }
940
+
941
+ if ( count( $tax_settings ) > 1 ) {
942
+ $tax_settings[ 'relation' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'taxonomy-relation', $view_settings, 'AND' );
943
+ }
944
+
945
+ $args = array_merge( $args, array( 'tax_query' => apply_filters( PT_CV_PREFIX_ . 'taxonomy_setting', $tax_settings ) ) );
946
+ break;
947
+
948
+ case 'order':
949
+ $orderby = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'orderby', $view_settings );
950
+ $order = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'order', $view_settings );
951
+ $order_settings = apply_filters( PT_CV_PREFIX_ . 'order_setting', array(
952
+ 'orderby' => $orderby,
953
+ 'order' => $orderby ? $order : '',
954
+ ) );
955
+ $args = array_merge( $args, $order_settings );
956
+ break;
957
+ }
958
+ }
959
+ }
960
+ }
961
+
962
+ /**
963
+ * Get Fields settings
964
+ *
965
+ * @param array $dargs The settings array of Fields
966
+ */
967
+ static function view_get_display_settings( &$dargs ) {
968
+ $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
969
+ $view_type = $dargs[ 'view-type' ];
970
+
971
+ $dargs[ 'layout-format' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format', $view_settings );
972
+ $dargs[ 'number-columns' ] = apply_filters( PT_CV_PREFIX_ . 'item_per_row', PT_CV_Functions::setting_value( PT_CV_PREFIX . $view_type . '-' . 'number-columns', $view_settings, 1 ) );
973
+ $dargs[ 'number-rows' ] = PT_CV_Functions::setting_value( PT_CV_PREFIX . $view_type . '-' . 'number-rows', $view_settings, 1 );
974
+
975
+ $cfields_settings = PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . 'show-field-' );
976
+ $cfields = (array) array_keys( (array) $cfields_settings );
977
+ foreach ( $cfields as $field ) {
978
+ if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'show-field-' . $field, $view_settings ) ) {
979
+ $dargs[ 'fields' ][] = $field;
980
+
981
+ switch ( $field ) {
982
+ case 'title':
983
+ $prefix = PT_CV_PREFIX . 'field-title-';
984
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
985
+
986
+ $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_title_setting_values', $field_setting, $prefix );
987
+
988
+ break;
989
+
990
+ case 'thumbnail':
991
+ $prefix = PT_CV_PREFIX . 'field-thumbnail-';
992
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
993
+
994
+ $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_setting_values', $field_setting, $prefix );
995
+
996
+ break;
997
+
998
+ case 'meta-fields':
999
+ $prefix = PT_CV_PREFIX . 'meta-fields-';
1000
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1001
+
1002
+ $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_setting_values', $field_setting, $prefix );
1003
+
1004
+ break;
1005
+
1006
+ case 'content':
1007
+ $prefix = PT_CV_PREFIX . 'field-content-';
1008
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1009
+
1010
+ if ( $field_setting[ 'show' ] == 'excerpt' ) {
1011
+ $field_setting = array_merge( $field_setting, PT_CV_Functions::settings_values_by_prefix( PT_CV_PREFIX . 'field-excerpt-' ) );
1012
+ }
1013
+
1014
+ $dargs[ 'field-settings' ][ $field ] = apply_filters( PT_CV_PREFIX_ . 'field_content_setting_values', $field_setting, $prefix );
1015
+
1016
+ break;
1017
+ }
1018
+ }
1019
+ }
1020
+ }
1021
+
1022
+ /**
1023
+ * Get Pagination settings
1024
+ *
1025
+ * @param array $dargs The settings array of Fields
1026
+ * @param array $args The parameters array
1027
+ * @param array $pargs The pagination settings array
1028
+ */
1029
+ static function view_get_pagination_settings( &$dargs, &$args, $pargs ) {
1030
+ $view_settings = PT_CV_Functions::get_global_variable( 'view_settings' );
1031
+ $limit = trim( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'limit', $view_settings ) );
1032
+ $limit = ( empty( $limit ) || $limit === '-1' ) ? 10000000 : $limit;
1033
+ $limit = (int) apply_filters( PT_CV_PREFIX_ . 'settings_args_limit', $limit );
1034
+ $args[ 'limit' ] = $args[ 'posts_per_page' ] = $limit;
1035
+ $offset = 0;
1036
+
1037
+ $pagination = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination', $view_settings );
1038
+ if ( $pagination ) {
1039
+ $prefix = PT_CV_PREFIX . 'pagination-';
1040
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1041
+ $dargs[ 'pagination-settings' ] = apply_filters( PT_CV_PREFIX_ . 'pagination_settings', $field_setting, $prefix );
1042
+ if ( !isset( $dargs[ 'pagination-settings' ][ 'type' ] ) ) {
1043
+ $dargs[ 'pagination-settings' ][ 'type' ] = 'ajax';
1044
+ }
1045
+
1046
+ if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'normal' ) {
1047
+ $dargs[ 'pagination-settings' ][ 'style' ] = '';
1048
+ }
1049
+
1050
+ $ppp = $og_ppp = isset( $dargs[ 'pagination-settings' ][ 'items-per-page' ] ) ? (int) $dargs[ 'pagination-settings' ][ 'items-per-page' ] : $limit;
1051
+ if ( $ppp > $limit ) {
1052
+ $ppp = $limit;
1053
+ }
1054
+ $args[ 'posts_per_page' ] = $ppp;
1055
+
1056
+ $paged = (int) self::get_current_page( $pargs );
1057
+
1058
+ // Prevent out of range pages show beyond posts
1059
+ if ( $og_ppp && $paged > ceil( $limit / $og_ppp ) ) {
1060
+ $paged = ceil( $limit / $og_ppp );
1061
+ }
1062
+
1063
+ $offset = $ppp * ( $paged - 1 );
1064
+ if ( intval( $args[ 'posts_per_page' ] ) > $limit - $offset ) {
1065
+ $args[ 'posts_per_page' ] = $limit - $offset;
1066
+ }
1067
+ }
1068
+
1069
+ $args[ 'offset' ] = apply_filters( PT_CV_PREFIX_ . 'settings_args_offset', $offset );
1070
+ $args[ 'by_contentviews' ] = true;
1071
+ }
1072
+
1073
+ /**
1074
+ * Get Other settings
1075
+ *
1076
+ * @param array $dargs The settings array of Fields
1077
+ */
1078
+ static function view_get_other_settings( &$dargs ) {
1079
+ $prefix = PT_CV_PREFIX . 'other-';
1080
+ $field_setting = PT_CV_Functions::settings_values_by_prefix( $prefix );
1081
+ $dargs[ 'other-settings' ] = apply_filters( PT_CV_PREFIX_ . 'other_settings', $field_setting );
1082
+ }
1083
+
1084
+ /**
1085
+ * Process data when submit form add/edit view
1086
+ *
1087
+ * @return void
1088
+ */
1089
+ static function view_submit() {
1090
+ if ( empty( $_POST ) ) {
1091
+ return;
1092
+ }
1093
+
1094
+ if ( !isset( $_POST[ PT_CV_PREFIX_ . 'form_nonce' ] ) || !wp_verify_nonce( $_POST[ PT_CV_PREFIX_ . 'form_nonce' ], PT_CV_PREFIX_ . 'view_submit' ) ) {
1095
+ return;
1096
+ }
1097
+
1098
+ // Insert View
1099
+ $title = cv_esc_sql( $_POST[ PT_CV_PREFIX . 'view-title' ] );
1100
+ $cur_pid = cv_esc_sql( $_POST[ PT_CV_PREFIX . 'post-id' ] );
1101
+ if ( !$cur_pid ) {
1102
+ $post_id = PT_CV_Functions::post_insert( array( 'ID' => 0, 'title' => $title ) );
1103
+ } else {
1104
+ $post_id = absint( $cur_pid );
1105
+ }
1106
+
1107
+ // Add/Update View data
1108
+ $view_id = empty( $_POST[ PT_CV_PREFIX . 'view-id' ] ) ? PT_CV_Functions::string_random() : cv_sanitize_vid( $_POST[ PT_CV_PREFIX . 'view-id' ] );
1109
+ update_post_meta( $post_id, PT_CV_META_ID, $view_id );
1110
+ update_post_meta( $post_id, PT_CV_META_SETTINGS, apply_filters( PT_CV_PREFIX_ . 'pre_save_view_data', $_POST ) );
1111
+
1112
+ // Update View title
1113
+ if ( strpos( $title, '[ID:' ) === false ) {
1114
+ PT_CV_Functions::post_insert( array( 'ID' => $post_id, 'title' => sprintf( '%s [ID: %s]', $title, $view_id ) ) );
1115
+ }
1116
+
1117
+ $edit_link = PT_CV_Functions::view_link( $view_id );
1118
+ ?>
1119
+ <script type="text/javascript">
1120
+ window.location = '<?php echo str_replace( '&#038;', '&', esc_url( $edit_link ) ); ?>';
1121
+ </script>
1122
+ <?php
1123
+ exit;
1124
+ }
1125
+
1126
+ /**
1127
+ * Add shortcode
1128
+ *
1129
+ * @param array $atts Array of setting parameters for shortcode
1130
+ * @param string $content Content of shortcode
1131
+ */
1132
+ static function view_output( $atts ) {
1133
+ $atts = shortcode_atts( apply_filters( PT_CV_PREFIX_ . 'shortcode_params', array( 'id' => 0 ) ), $atts );
1134
+ $id = cv_sanitize_vid( $atts[ 'id' ] );
1135
+ if ( $id && !self::duplicated_process( $id, $atts ) ) {
1136
+ # Backup the global post, ensure this happens only one time per page
1137
+ if ( !isset( $GLOBALS[ 'cv_gpost_bak' ] ) && isset( $GLOBALS[ 'post' ] ) ) {
1138
+ $GLOBALS[ 'cv_gpost_bak' ] = $GLOBALS[ 'post' ];
1139
+ }
1140
+
1141
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_shortcode_output', null, $atts );
1142
+ if ( empty( $result ) ) {
1143
+ $settings = PT_CV_Functions::view_get_settings( $id );
1144
+ $view_html = PT_CV_Functions::view_process_settings( $id, $settings, null, $atts );
1145
+ $result = PT_CV_Functions::view_final_output( $view_html );
1146
+ do_action( PT_CV_PREFIX_ . 'flushed_output', $result );
1147
+ }
1148
+
1149
+ # Restore the global post
1150
+ if ( isset( $GLOBALS[ 'cv_gpost_bak' ] ) ) {
1151
+ $GLOBALS[ 'post' ] = $GLOBALS[ 'cv_gpost_bak' ];
1152
+ }
1153
+
1154
+ return $result;
1155
+ }
1156
+ }
1157
+
1158
+ /**
1159
+ * Final output of View: HTML & Assets
1160
+ *
1161
+ * @param string $html
1162
+ */
1163
+ static function view_final_output( $html ) {
1164
+ ob_start();
1165
+ PT_CV_Html::assets_of_view_types();
1166
+ $view_assets = ob_get_clean();
1167
+
1168
+ $class = apply_filters( PT_CV_PREFIX_ . 'wrapper_class', PT_CV_PREFIX . 'wrapper' );
1169
+ return sprintf( '<div class="%s">%s</div>', $class, $html ) . $view_assets;
1170
+ }
1171
+
1172
+ /**
1173
+ * Generate link to View page: Add view/ Edit view
1174
+ *
1175
+ * @param string $view_id The view id
1176
+ * @param array $action Custom parameters
1177
+ *
1178
+ * @return string
1179
+ */
1180
+ public static function view_link( $view_id, $action = array() ) {
1181
+ $edit_link = admin_url( 'admin.php?page=' . PT_CV_DOMAIN . '-add' );
1182
+ if ( !empty( $view_id ) ) {
1183
+ $query_args = apply_filters( PT_CV_PREFIX_ . 'view_link_args', array( 'id' => $view_id ) + $action );
1184
+ $edit_link = add_query_arg( $query_args, $edit_link );
1185
+ }
1186
+
1187
+ return $edit_link;
1188
+ }
1189
+
1190
+ /**
1191
+ * Callback function for ajax Preview action 'preview_request'
1192
+ */
1193
+ static function ajax_callback_preview_request() {
1194
+ // Validate request
1195
+ check_ajax_referer( PT_CV_PREFIX_ . 'ajax_nonce', 'ajax_nonce' );
1196
+
1197
+ if ( !empty( $_POST[ 'data' ] ) ) {
1198
+ define( 'PT_CV_DOING_PREVIEW', true );
1199
+ do_action( PT_CV_PREFIX_ . 'preview_header' );
1200
+
1201
+ $settings = array();
1202
+ parse_str( $_POST[ 'data' ], $settings );
1203
+
1204
+ $view_id = cv_sanitize_vid( PT_CV_Functions::url_extract_param( 'id' ) );
1205
+ if ( empty( $view_id ) ) {
1206
+ $view_id = PT_CV_Functions::string_random();
1207
+ }
1208
+
1209
+ // Show output
1210
+ echo PT_CV_Functions::view_process_settings( $view_id, $settings );
1211
+
1212
+ do_action( PT_CV_PREFIX_ . 'preview_footer' );
1213
+ }
1214
+
1215
+ // Must exit
1216
+ die;
1217
+ }
1218
+
1219
+ /**
1220
+ * Callback function for ajax Pagination action 'pagination_request'
1221
+ */
1222
+ static function ajax_callback_pagination_request() {
1223
+ // Validate request
1224
+ #check_ajax_referer( PT_CV_PREFIX_ . 'ajax_nonce', 'ajax_nonce' ); //disabled since 1.7.9 due to output -1 when use cache plugin, or nonce expired
1225
+
1226
+ if ( !isset( $_POST[ 'sid' ] ) )
1227
+ return 'Empty View ID';
1228
+
1229
+ define( 'PT_CV_DOING_PAGINATION', true );
1230
+
1231
+ $view_id = cv_sanitize_vid( $_POST[ 'sid' ] );
1232
+ $settings = cv_comp_pagination_settings( 'get', NULL );
1233
+ if ( !$settings ) {
1234
+ $settings = PT_CV_Functions::view_get_settings( $view_id );
1235
+ }
1236
+
1237
+ // Switch language
1238
+ $language = empty( $_POST[ 'lang' ] ) ? '' : cv_esc_sql( $_POST[ 'lang' ] );
1239
+ self::switch_language( $language );
1240
+
1241
+ // Show output
1242
+ echo PT_CV_Functions::view_process_settings( $view_id, $settings, array( 'page' => absint( $_POST[ 'page' ] ) ) );
1243
+
1244
+ // Must exit
1245
+ die;
1246
+ }
1247
+
1248
+ /**
1249
+ * Pagination output
1250
+ *
1251
+ * @param int $total_pages Total pages
1252
+ * @param int $current_page Current page number
1253
+ */
1254
+ static function pagination_links( $total_pages, $current_page = 1 ) {
1255
+ if ( $total_pages == 1 )
1256
+ return '';
1257
+
1258
+ $links = PT_CV_Functions::get_pagination_links( $current_page, $total_pages, 'array' );
1259
+
1260
+ // Generate the links
1261
+ $html = '';
1262
+ foreach ( $links as $link ) {
1263
+ $class = strpos( $link, 'current' ) !== false ? 'class="active"' : '';
1264
+ $link = preg_replace( '/<span[^>]*>/', '<a href="#">', $link );
1265
+ $link = str_replace( '</span>', '</a>', $link );
1266
+ $link = str_replace( array( 'page-numbers', 'prev', 'next' ), '', $link );
1267
+ $html .= "<li $class>" . $link . "</li>\n\t";
1268
+ }
1269
+
1270
+ return $html;
1271
+ }
1272
+
1273
+ /** Remove pagination parameters from URL
1274
+ * @param string $link
1275
+ * @return string
1276
+ */
1277
+ static function remove_pagination_params( $link ) {
1278
+ $params = apply_filters( PT_CV_PREFIX_ . 'pagination_params_removed', array( 'vpage', 'page' ) );
1279
+ return remove_query_arg( $params, $link );
1280
+ }
1281
+
1282
+ /** Get general page number from an URL
1283
+ * @return int
1284
+ */
1285
+ static function get_pagination_number() {
1286
+ $paged = null;
1287
+
1288
+ // Get old params
1289
+ foreach ( array( 'vpage', '_page' ) as $op ) {
1290
+ if ( !empty( $_GET[ $op ] ) ) {
1291
+ $paged = absint( $_GET[ $op ] );
1292
+ }
1293
+ }
1294
+
1295
+ // Get WP parameter
1296
+ if ( !$paged ) {
1297
+ if ( get_query_var( 'paged' ) ) {
1298
+ $paged = get_query_var( 'paged' );
1299
+ } elseif ( get_query_var( 'page' ) ) {
1300
+ $paged = get_query_var( 'page' );
1301
+ }
1302
+ }
1303
+
1304
+ return $paged;
1305
+ }
1306
+
1307
+ /** Get current page number of a View
1308
+ *
1309
+ * @param array $pargs Pagination settings of the View
1310
+ * @return int
1311
+ */
1312
+ static function get_current_page( $pargs ) {
1313
+ $paged = 1;
1314
+
1315
+ if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination' ) ) {
1316
+ if ( !empty( $pargs[ 'page' ] ) ) {
1317
+ $paged = absint( $pargs[ 'page' ] );
1318
+ }
1319
+ $pagenum = self::get_pagination_number();
1320
+ if ( !empty( $pagenum ) ) {
1321
+ $paged = absint( $pagenum );
1322
+ }
1323
+ }
1324
+
1325
+ return apply_filters( PT_CV_PREFIX_ . 'set_current_page', $paged );
1326
+ }
1327
+
1328
+ /**
1329
+ * Check if using pagination: Non-ajax or First page (of Ajax pagination)
1330
+ *
1331
+ * @param array $dargs
1332
+ * @param int $current_page
1333
+ * @return bool
1334
+ */
1335
+ static function nonajax_or_firstpage( $dargs, $current_page ) {
1336
+ if ( !PT_CV_Functions::setting_value( PT_CV_PREFIX . 'enable-pagination' ) ) {
1337
+ return false;
1338
+ }
1339
+
1340
+ if ( $dargs[ 'pagination-settings' ][ 'type' ] === 'normal' ) {
1341
+ return true;
1342
+ } else if ( !(defined( 'DOING_AJAX' ) && DOING_AJAX && !empty( $_POST[ 'action' ] ) && $_POST[ 'action' ] == 'pagination_request') ) {
1343
+ // Not requested by Ajax => show pagination
1344
+ return true;
1345
+ } else {
1346
+ return false;
1347
+ }
1348
+ }
1349
+
1350
+ /** Get list of pagination links
1351
+ * @since 2.3.0
1352
+ *
1353
+ * @param int $current_page
1354
+ * @param int $total_pages
1355
+ * @param string $type
1356
+ * @return string/array
1357
+ */
1358
+ static function get_pagination_links( $current_page = 1, $total_pages = 2, $type = 'array' ) {
1359
+ // Custom filters
1360
+ $pages_to_show = apply_filters( PT_CV_PREFIX_ . 'pages_to_show', 4 );
1361
+ $labels = apply_filters( PT_CV_PREFIX_ . 'pagination_label', array(
1362
+ 'prev' => '&lsaquo;',
1363
+ 'next' => '&rsaquo;',
1364
+ ) );
1365
+
1366
+ // Call WP functions
1367
+ global $wp_filter;
1368
+ $filters_bak = $wp_filter;
1369
+
1370
+ remove_all_filters( 'paginate_links' );
1371
+ remove_all_filters( 'get_pagenum_link' );
1372
+ add_filter( 'paginate_links', array( __CLASS__, 'remove_pagination_params' ) );
1373
+
1374
+ $params = array(
1375
+ 'format' => apply_filters( PT_CV_PREFIX_ . 'pagination_link_format', '?_page=%#%' ),
1376
+ 'current' => $current_page,
1377
+ 'total' => $total_pages,
1378
+ 'type' => $type,
1379
+ 'prev_text' => $labels[ 'prev' ],
1380
+ 'next_text' => $labels[ 'next' ],
1381
+ 'mid_size' => $pages_to_show ? absint( $pages_to_show ) / 2 : 2,
1382
+ );
1383
+
1384
+ $links = paginate_links( $params );
1385
+
1386
+ $wp_filter = $filters_bak;
1387
+
1388
+ return $links;
1389
+ }
1390
+
1391
+ /** Get the link for a page number
1392
+ * @param int $page_num The page number
1393
+ * @since 2.3.0
1394
+ */
1395
+ static function get_pagination_url( $page_num = 0 ) {
1396
+ $links = self::get_pagination_links( 2, 3, 'list' );
1397
+
1398
+ $matches = array();
1399
+ preg_match_all( '/href=["\']([^"\']+)["\']/', $links, $matches );
1400
+
1401
+ if ( !isset( $matches[ 1 ] ) ) {
1402
+ return null;
1403
+ } else {
1404
+ $pattern = '@([/?&](page|paged|_page)[/=])([0-9]+)@i';
1405
+ $page1 = html_entity_decode( $matches[ 1 ][ 0 ] );
1406
+ $pagen = html_entity_decode( $matches[ 1 ][ 3 ] );
1407
+
1408
+ if ( !empty( $page_num ) ) {
1409
+ return esc_url_raw( preg_replace( $pattern, '${1}' . absint( $page_num ), $pagen ) );
1410
+ } else {
1411
+ return array(
1412
+ 'page_1' => esc_url_raw( $page1 ),
1413
+ 'page_n' => esc_url_raw( preg_replace( $pattern, '${1}' . '_CVNUMBER_', $pagen ) ),
1414
+ );
1415
+ }
1416
+ }
1417
+ }
1418
+
1419
+ /**
1420
+ * Extract param's value from URL
1421
+ *
1422
+ * @param string $pname Name of parameter
1423
+ * @return string
1424
+ */
1425
+ static function url_extract_param( $pname, $default = null ) {
1426
+ $query = array();
1427
+ $url = $_SERVER[ 'REQUEST_URI' ];
1428
+ if ( strpos( $url, 'admin-ajax.php' ) !== false ) {
1429
+ $url = $_SERVER[ 'HTTP_REFERER' ];
1430
+ }
1431
+
1432
+ $parts = parse_url( $url );
1433
+ if ( isset( $parts[ 'query' ] ) ) {
1434
+ parse_str( $parts[ 'query' ], $query );
1435
+
1436
+ return !empty( $query[ $pname ] ) ? $query[ $pname ] : $default;
1437
+ }
1438
+
1439
+ return $default;
1440
+ }
1441
+
1442
+ /**
1443
+ * Set global variable
1444
+ *
1445
+ * @global array $pt_cv_glb
1446
+ * @global string $pt_cv_id
1447
+ * @param type $variable
1448
+ * @param type $value
1449
+ */
1450
+ static function set_global_variable( $variable, $value ) {
1451
+ global $pt_cv_glb, $pt_cv_id;
1452
+ $pt_cv_glb[ $pt_cv_id ][ $variable ] = $value;
1453
+ }
1454
+
1455
+ /**
1456
+ * Get global variable
1457
+ *
1458
+ * @global array $pt_cv_glb
1459
+ * @global string $pt_cv_id
1460
+ * @param string $variable
1461
+ * @return mixed
1462
+ */
1463
+ static function get_global_variable( $variable, $unset = false ) {
1464
+ global $pt_cv_glb, $pt_cv_id;
1465
+ if ( !$pt_cv_glb || !$pt_cv_id )
1466
+ return null;
1467
+
1468
+ $value = isset( $pt_cv_glb[ $pt_cv_id ][ $variable ] ) ? $pt_cv_glb[ $pt_cv_id ][ $variable ] : null;
1469
+
1470
+ // Unset after get
1471
+ if ( $unset && $value ) {
1472
+ unset( $pt_cv_glb[ $pt_cv_id ][ $variable ] );
1473
+ }
1474
+
1475
+ return $value;
1476
+ }
1477
+
1478
+ /**
1479
+ * Output debug message (if debug is enable) / nice message (otherwise)
1480
+ * @param string $log Raw log for debugging
1481
+ * @param string $message Nice message for user
1482
+ */
1483
+ static function debug_output( $log, $message = '' ) {
1484
+ return defined( 'PT_CV_DEBUG' ) ? ( PT_CV_DEBUG ? $log : $message ) : $message;
1485
+ }
1486
+
1487
+ // Reset WP query
1488
+ static function reset_query() {
1489
+ if ( apply_filters( PT_CV_PREFIX_ . 'reset_query', true ) ) {
1490
+ wp_reset_postdata();
1491
+ }
1492
+ }
1493
+
1494
+ /**
1495
+ * Check duplicated View
1496
+ * @return bool
1497
+ */
1498
+ static function duplicated_process( $view_id, $sc_params ) {
1499
+ $duplicated = false;
1500
+
1501
+ if ( apply_filters( PT_CV_PREFIX_ . 'check_duplicate', 0, $view_id, $sc_params ) ) {
1502
+ global $pt_cv_views;
1503
+
1504
+ $vid = $view_id . '-' . md5( serialize( $sc_params ) );
1505
+ if ( !empty( $pt_cv_views[ $vid ] ) ) {
1506
+ $duplicated = true;
1507
+ } else {
1508
+ $pt_cv_views[ $vid ] = 1;
1509
+ }
1510
+ }
1511
+
1512
+ return $duplicated;
1513
+ }
1514
+
1515
+ /**
1516
+ * Disable View shortcode in posts of current View
1517
+ * @since 1.7.6
1518
+ *
1519
+ * @global array $shortcode_tags
1520
+ * @global array $shortcode_tags_backup
1521
+ * @param string $action
1522
+ */
1523
+ static function disable_view_shortcode( $action = 'disable' ) {
1524
+ if ( apply_filters( PT_CV_PREFIX_ . 'disable_child_shortcode', true ) ) {
1525
+ global $shortcode_tags, $shortcode_tags_backup;
1526
+
1527
+ if ( $action == 'disable' ) {
1528
+ $shortcode_tags_backup = $shortcode_tags;
1529
+ $shortcode_tags[ 'pt_view' ] = '__return_false';
1530
+ } else {
1531
+ $shortcode_tags = $shortcode_tags_backup;
1532
+ }
1533
+ }
1534
+ }
1535
+
1536
+ }
1537
+
1538
  }
includes/hooks.php CHANGED
@@ -1,309 +1,297 @@
1
- <?php
2
- /**
3
- * Custom filters/actions
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- if ( !class_exists( 'PT_CV_Hooks' ) ) {
16
-
17
- /**
18
- * @name PT_CV_Hooks
19
- */
20
- class PT_CV_Hooks {
21
-
22
- /**
23
- * Add custom filters/actions
24
- */
25
- static function init() {
26
- add_filter( PT_CV_PREFIX_ . 'validate_settings', array( __CLASS__, 'filter_validate_settings' ), 10, 2 );
27
- add_filter( PT_CV_PREFIX_ . 'field_content_excerpt', array( __CLASS__, 'filter_field_content_excerpt' ), 9, 3 );
28
- add_filter( PT_CV_PREFIX_ . 'item_col_class', array( __CLASS__, 'filter_item_col_class' ), 20, 2 );
29
- add_filter( PT_CV_PREFIX_ . 'fields_html', array( __CLASS__, 'filter_fields_html' ), 20, 2 );
30
-
31
- if ( apply_filters( PT_CV_PREFIX_ . 'prevent_broken_excerpt', true ) ) {
32
- add_filter( PT_CV_PREFIX_ . 'before_trim_words', array( __CLASS__, 'filter_before_trim_words' ) );
33
- add_filter( PT_CV_PREFIX_ . 'after_trim_words', array( __CLASS__, 'filter_after_trim_words' ) );
34
- }
35
-
36
- /**
37
- * @since 1.7.5
38
- * able to disable responsive image of WordPress 4.4
39
- */
40
- add_filter( 'wp_get_attachment_image_attributes', array( __CLASS__, 'filter_disable_wp_responsive_image' ), 1000, 3 );
41
-
42
- // Do action
43
- add_action( PT_CV_PREFIX_ . 'before_query', array( __CLASS__, 'action_before_query' ) );
44
- add_action( PT_CV_PREFIX_ . 'before_process_item', array( __CLASS__, 'action_before_process_item' ) );
45
- add_action( PT_CV_PREFIX_ . 'after_process_item', array( __CLASS__, 'action_after_process_item' ) );
46
- add_action( PT_CV_PREFIX_ . 'before_content', array( __CLASS__, 'action_before_content' ) );
47
- }
48
-
49
- /**
50
- * Validate settings filter
51
- *
52
- * @param string $errors The error message
53
- * @param array $args The Query parameters array
54
- */
55
- public static function filter_validate_settings( $errors, $args ) {
56
- $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
57
- $messages = array(
58
- 'field' => array(
59
- 'select' => __( 'Please select an option in', 'content-views-query-and-display-post-page' ) . ' : ',
60
- 'text' => __( 'Please set value in', 'content-views-query-and-display-post-page' ) . ' : ',
61
- ),
62
- 'tab' => array(
63
- 'filter' => __( 'Filter Settings', 'content-views-query-and-display-post-page' ),
64
- 'display' => __( 'Display Settings', 'content-views-query-and-display-post-page' ),
65
- ),
66
- );
67
-
68
- // Post type
69
- if ( empty( $args[ 'post_type' ] ) ) {
70
- $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'filter' ] . ' > ' . __( 'Content type', 'content-views-query-and-display-post-page' );
71
- }
72
-
73
- // View type
74
- if ( empty( $dargs[ 'view-type' ] ) ) {
75
- $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Layout', 'content-views-query-and-display-post-page' );
76
- }
77
-
78
- // Layout format
79
- if ( empty( $dargs[ 'layout-format' ] ) ) {
80
- $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Format', 'content-views-query-and-display-post-page' );
81
- }
82
-
83
- // Field settings
84
- if ( !isset( $dargs[ 'fields' ] ) ) {
85
- $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Fields settings', 'content-views-query-and-display-post-page' );
86
- }
87
-
88
- // Item per page
89
- if ( isset( $dargs[ 'pagination-settings' ] ) ) {
90
- if ( empty( $dargs[ 'pagination-settings' ][ 'items-per-page' ] ) ) {
91
- $errors[] = $messages[ 'field' ][ 'text' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Pagination', 'content-views-query-and-display-post-page' ) . ' > ' . __( 'Items per page', 'content-views-query-and-display-post-page' );
92
- }
93
- }
94
-
95
- if ( !empty( $dargs[ 'view-type' ] ) ) {
96
- switch ( $dargs[ 'view-type' ] ) {
97
- case 'grid':
98
- if ( empty( $dargs[ 'number-columns' ] ) ) {
99
- $errors[] = $messages[ 'field' ][ 'text' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Layout', 'content-views-query-and-display-post-page' ) . ' > ' . __( 'Items per row', 'content-views-query-and-display-post-page' );
100
- }
101
- break;
102
- }
103
- }
104
-
105
- return array_filter( $errors );
106
- }
107
-
108
- /**
109
- * Filter content before generating excerpt
110
- *
111
- * @param type $args
112
- * @param type $fargs
113
- * @param type $post
114
- */
115
- public static function filter_field_content_excerpt( $args, $fargs, $post ) {
116
- /**
117
- * Get content of current language
118
- * qTranslate-X (and qTranslate, mqTranslate)
119
- * @since 1.7.8
120
- */
121
- if ( function_exists( 'qtranxf_use' ) ) {
122
- global $q_config;
123
- $args = qtranxf_use( $q_config[ 'language' ], $args );
124
- }
125
-
126
- return $args;
127
- }
128
-
129
- /**
130
- * Filter span with
131
- * @since 1.8.5
132
- *
133
- * @param array $args
134
- * @param int $span_width
135
- *
136
- * @return array
137
- */
138
- public static function filter_item_col_class( $args, $span_width ) {
139
- if ( PT_CV_Functions::get_global_variable( 'view_type' ) === 'grid' ) {
140
- $tablet_col = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'resp-tablet-number-columns' );
141
- $mobile_col = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'resp-number-columns' );
142
-
143
- $sm_class = 'col-sm-' . (int) ( 12 / ($tablet_col ? $tablet_col : 2) );
144
- $xs_class = 'col-xs-' . (int) ( 12 / ($mobile_col ? $mobile_col : 1) );
145
-
146
- if ( !in_array( $sm_class, $args ) ) {
147
- $args[] = $sm_class;
148
- }
149
-
150
- if ( !in_array( $xs_class, $args ) ) {
151
- $args[] = $xs_class;
152
- }
153
- }
154
-
155
- return $args;
156
- }
157
-
158
- /**
159
- * Do not wrap text around image when show thumbnail on left/right of text
160
- *
161
- * @since 1.9.9
162
- * @param array $args
163
- * @param object $post
164
- */
165
- public static function filter_fields_html( $args, $post ) {
166
- $format = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format' );
167
- $nowrap = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'lf-nowrap' );
168
-
169
- if ( !empty( $args[ 'thumbnail' ] ) && $format === '2-col' && $nowrap ) {
170
- $exclude_fields = apply_filters( PT_CV_PREFIX_ . '2col_nowrap_fields', array( 'thumbnail' ) );
171
-
172
- if ( PT_CV_Functions::get_global_variable( 'view_type' ) === 'collapsible' ) {
173
- $exclude_fields[] = 'title';
174
- }
175
-
176
- $others = array();
177
- foreach ( $args as $field => $value ) {
178
- if ( !in_array( $field, $exclude_fields ) ) {
179
- $others[ $field ] = $value;
180
- unset( $args[ $field ] );
181
- }
182
- }
183
-
184
- if ( $others ) {
185
- $args[ 'others-wrap' ] = '<div class="' . PT_CV_PREFIX . 'colwrap">' . implode( '', $others ) . '</div>';
186
- }
187
- }
188
-
189
- return $args;
190
- }
191
-
192
- public static function filter_before_trim_words( $content ) {
193
- if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
194
- global $cv_replaced_tags, $cv_replaced_idx;
195
- # reset for each post
196
- $cv_replaced_tags = array();
197
- $cv_replaced_idx = 0;
198
-
199
- $content = preg_replace_callback( '/<(\/?)[^>]+>/', array( __CLASS__, '_callback_before_trim_words' ), $content );
200
- }
201
-
202
- return $content;
203
- }
204
-
205
- /**
206
- * Temporary replace HTML tag content by a simple code which doesn't impact trimming word function
207
- * @since 1.9.4
208
- *
209
- * @global type $cv_replaced_tags
210
- * @global type $cv_replaced_idx
211
- * @param type $matches
212
- * @return string
213
- */
214
- public static function _callback_before_trim_words( $matches ) {
215
- global $cv_replaced_tags, $cv_replaced_idx;
216
-
217
- $return = $matches;
218
- if ( !empty( $matches[ 0 ] ) ) {
219
- $cv_replaced_tags[ ++$cv_replaced_idx ] = $matches[ 0 ];
220
- $return = "@$cv_replaced_idx@";
221
- }
222
-
223
- return $return;
224
- }
225
-
226
- public static function filter_after_trim_words( $content ) {
227
- if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
228
- $content = preg_replace_callback( '/@(\d+)@/', array( __CLASS__, '_callback_after_trim_words' ), $content );
229
- }
230
-
231
- return $content;
232
- }
233
-
234
- /**
235
- * Revert HTML tag content
236
- * @since 1.9.4
237
- *
238
- * @global type $cv_replaced_tags
239
- * @param type $matches
240
- * @return \type
241
- */
242
- public static function _callback_after_trim_words( $matches ) {
243
- global $cv_replaced_tags;
244
-
245
- $return = $matches;
246
- if ( !empty( $matches[ 1 ] ) && isset( $cv_replaced_tags[ (int) $matches[ 1 ] ] ) ) {
247
- $return = $cv_replaced_tags[ (int) $matches[ 1 ] ];
248
- }
249
-
250
- return $return;
251
- }
252
-
253
- // Disable WP 4.4 responsive image
254
- public static function filter_disable_wp_responsive_image( $args, $attachment = null, $size = null ) {
255
- if ( PT_CV_Html::is_responsive_image_disabled() ) {
256
- if ( isset( $args[ 'sizes' ] ) )
257
- unset( $args[ 'sizes' ] );
258
- if ( isset( $args[ 'srcset' ] ) )
259
- unset( $args[ 'srcset' ] );
260
- }
261
-
262
- return $args;
263
- }
264
-
265
- public static function action_before_query() {
266
- /** Fix problem with Paid Membership Pro plugin
267
- * It resets (instead of append) "post__not_in" parameter of WP query which makes:
268
- * - exclude function doesn't work
269
- * - output in Preview panel is different from output in front-end
270
- */
271
- if ( function_exists( 'pmpro_search_filter' ) ) {
272
- remove_filter( 'pre_get_posts', 'pmpro_search_filter' );
273
- }
274
- }
275
-
276
- public static function action_before_process_item() {
277
- // Disable View Shortcode in child page
278
- PT_CV_Functions::disable_view_shortcode();
279
- }
280
-
281
- public static function action_after_process_item() {
282
- // Enable View Shortcode again
283
- PT_CV_Functions::disable_view_shortcode( 'recovery' );
284
- }
285
-
286
- /**
287
- * Issue: shortcode is visible in pagination, preview
288
- * Solution: Backup shortcode tag in live page, to use for preview, pagination request
289
- *
290
- * @since 1.9.3
291
- */
292
- public static function action_before_content() {
293
- global $shortcode_tags, $cv_shortcode_tags_backup;
294
-
295
- if ( !$cv_shortcode_tags_backup ) {
296
- $trans_key = 'cv_shortcode_tags_193';
297
- if ( !defined( 'PT_CV_DOING_PAGINATION' ) && !defined( 'PT_CV_DOING_PREVIEW' ) ) {
298
- $tagnames = array_keys( $shortcode_tags );
299
- $cv_shortcode_tags_backup = join( '|', array_map( 'preg_quote', $tagnames ) );
300
- set_transient( $trans_key, $cv_shortcode_tags_backup, DAY_IN_SECONDS );
301
- } else {
302
- $cv_shortcode_tags_backup = get_transient( $trans_key );
303
- }
304
- }
305
- }
306
-
307
- }
308
-
309
- }
1
+ <?php
2
+ /**
3
+ * Custom filters/actions
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( !class_exists( 'PT_CV_Hooks' ) ) {
16
+
17
+ /**
18
+ * @name PT_CV_Hooks
19
+ */
20
+ class PT_CV_Hooks {
21
+
22
+ /**
23
+ * Add custom filters/actions
24
+ */
25
+ static function init() {
26
+ add_filter( PT_CV_PREFIX_ . 'validate_settings', array( __CLASS__, 'filter_validate_settings' ), 10, 2 );
27
+ add_filter( PT_CV_PREFIX_ . 'field_content_excerpt', array( __CLASS__, 'filter_field_content_excerpt' ), 9, 3 );
28
+ add_filter( PT_CV_PREFIX_ . 'item_col_class', array( __CLASS__, 'filter_item_col_class' ), 20, 2 );
29
+ add_filter( PT_CV_PREFIX_ . 'fields_html', array( __CLASS__, 'filter_fields_html' ), 20, 2 );
30
+
31
+ if ( apply_filters( PT_CV_PREFIX_ . 'prevent_broken_excerpt', true ) ) {
32
+ add_filter( PT_CV_PREFIX_ . 'before_trim_words', array( __CLASS__, 'filter_before_trim_words' ) );
33
+ add_filter( PT_CV_PREFIX_ . 'after_trim_words', array( __CLASS__, 'filter_after_trim_words' ) );
34
+ }
35
+
36
+ /**
37
+ * @since 1.7.5
38
+ * able to disable responsive image of WordPress 4.4
39
+ */
40
+ add_filter( 'wp_get_attachment_image_attributes', array( __CLASS__, 'filter_disable_wp_responsive_image' ), 1000, 3 );
41
+
42
+ // Do action
43
+ add_action( PT_CV_PREFIX_ . 'before_process_item', array( __CLASS__, 'action_before_process_item' ) );
44
+ add_action( PT_CV_PREFIX_ . 'after_process_item', array( __CLASS__, 'action_after_process_item' ) );
45
+ add_action( PT_CV_PREFIX_ . 'before_content', array( __CLASS__, 'action_before_content' ) );
46
+ }
47
+
48
+ /**
49
+ * Validate settings filter
50
+ *
51
+ * @param string $errors The error message
52
+ * @param array $args The Query parameters array
53
+ */
54
+ public static function filter_validate_settings( $errors, $args ) {
55
+ $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
56
+ $messages = array(
57
+ 'field' => array(
58
+ 'select' => __( 'Please select an option in', 'content-views-query-and-display-post-page' ) . ' : ',
59
+ 'text' => __( 'Please set value in', 'content-views-query-and-display-post-page' ) . ' : ',
60
+ ),
61
+ 'tab' => array(
62
+ 'filter' => __( 'Filter Settings', 'content-views-query-and-display-post-page' ),
63
+ 'display' => __( 'Display Settings', 'content-views-query-and-display-post-page' ),
64
+ ),
65
+ );
66
+
67
+ // Post type
68
+ if ( empty( $args[ 'post_type' ] ) ) {
69
+ $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'filter' ] . ' > ' . __( 'Content type', 'content-views-query-and-display-post-page' );
70
+ }
71
+
72
+ // View type
73
+ if ( empty( $dargs[ 'view-type' ] ) ) {
74
+ $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Layout', 'content-views-query-and-display-post-page' );
75
+ }
76
+
77
+ // Layout format
78
+ if ( empty( $dargs[ 'layout-format' ] ) ) {
79
+ $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Format', 'content-views-query-and-display-post-page' );
80
+ }
81
+
82
+ // Field settings
83
+ if ( !isset( $dargs[ 'fields' ] ) ) {
84
+ $errors[] = $messages[ 'field' ][ 'select' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Fields settings', 'content-views-query-and-display-post-page' );
85
+ }
86
+
87
+ // Item per page
88
+ if ( isset( $dargs[ 'pagination-settings' ] ) ) {
89
+ if ( empty( $dargs[ 'pagination-settings' ][ 'items-per-page' ] ) ) {
90
+ $errors[] = $messages[ 'field' ][ 'text' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Pagination', 'content-views-query-and-display-post-page' ) . ' > ' . __( 'Items per page', 'content-views-query-and-display-post-page' );
91
+ }
92
+ }
93
+
94
+ if ( !empty( $dargs[ 'view-type' ] ) ) {
95
+ switch ( $dargs[ 'view-type' ] ) {
96
+ case 'grid':
97
+ if ( empty( $dargs[ 'number-columns' ] ) ) {
98
+ $errors[] = $messages[ 'field' ][ 'text' ] . $messages[ 'tab' ][ 'display' ] . ' > ' . __( 'Layout', 'content-views-query-and-display-post-page' ) . ' > ' . __( 'Items per row', 'content-views-query-and-display-post-page' );
99
+ }
100
+ break;
101
+ }
102
+ }
103
+
104
+ return array_filter( $errors );
105
+ }
106
+
107
+ /**
108
+ * Filter content before generating excerpt
109
+ *
110
+ * @param type $args
111
+ * @param type $fargs
112
+ * @param type $post
113
+ */
114
+ public static function filter_field_content_excerpt( $args, $fargs, $post ) {
115
+ /**
116
+ * Get content of current language
117
+ * qTranslate-X (and qTranslate, mqTranslate)
118
+ * @since 1.7.8
119
+ */
120
+ if ( function_exists( 'qtranxf_use' ) ) {
121
+ global $q_config;
122
+ $args = qtranxf_use( $q_config[ 'language' ], $args );
123
+ }
124
+
125
+ return $args;
126
+ }
127
+
128
+ /**
129
+ * Filter span with
130
+ * @since 1.8.5
131
+ *
132
+ * @param array $args
133
+ * @param int $span_width
134
+ *
135
+ * @return array
136
+ */
137
+ public static function filter_item_col_class( $args, $span_width ) {
138
+ if ( PT_CV_Functions::get_global_variable( 'view_type' ) === 'grid' ) {
139
+ $tablet_col = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'resp-tablet-number-columns' );
140
+ $mobile_col = (int) PT_CV_Functions::setting_value( PT_CV_PREFIX . 'resp-number-columns' );
141
+
142
+ $sm_class = 'col-sm-' . (int) ( 12 / ($tablet_col ? $tablet_col : 2) );
143
+ $xs_class = 'col-xs-' . (int) ( 12 / ($mobile_col ? $mobile_col : 1) );
144
+
145
+ if ( !in_array( $sm_class, $args ) ) {
146
+ $args[] = $sm_class;
147
+ }
148
+
149
+ if ( !in_array( $xs_class, $args ) ) {
150
+ $args[] = $xs_class;
151
+ }
152
+ }
153
+
154
+ return $args;
155
+ }
156
+
157
+ /**
158
+ * Do not wrap text around image when show thumbnail on left/right of text
159
+ *
160
+ * @since 1.9.9
161
+ * @param array $args
162
+ * @param object $post
163
+ */
164
+ public static function filter_fields_html( $args, $post ) {
165
+ $format = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format' );
166
+ $nowrap = PT_CV_Functions::setting_value( PT_CV_PREFIX . 'lf-nowrap' );
167
+
168
+ if ( !empty( $args[ 'thumbnail' ] ) && $format === '2-col' && $nowrap ) {
169
+ $exclude_fields = apply_filters( PT_CV_PREFIX_ . '2col_nowrap_fields', array( 'thumbnail' ) );
170
+
171
+ if ( PT_CV_Functions::get_global_variable( 'view_type' ) === 'collapsible' ) {
172
+ $exclude_fields[] = 'title';
173
+ }
174
+
175
+ $others = array();
176
+ foreach ( $args as $field => $value ) {
177
+ if ( !in_array( $field, $exclude_fields ) ) {
178
+ $others[ $field ] = $value;
179
+ unset( $args[ $field ] );
180
+ }
181
+ }
182
+
183
+ if ( $others ) {
184
+ $args[ 'others-wrap' ] = '<div class="' . PT_CV_PREFIX . 'colwrap">' . implode( '', $others ) . '</div>';
185
+ }
186
+ }
187
+
188
+ return $args;
189
+ }
190
+
191
+ public static function filter_before_trim_words( $content ) {
192
+ if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
193
+ global $cv_replaced_tags, $cv_replaced_idx;
194
+ # reset for each post
195
+ $cv_replaced_tags = array();
196
+ $cv_replaced_idx = 0;
197
+
198
+ $content = preg_replace_callback( '/<(\/?)[^>]+>/', array( __CLASS__, '_callback_before_trim_words' ), $content );
199
+ }
200
+
201
+ return $content;
202
+ }
203
+
204
+ /**
205
+ * Temporary replace HTML tag content by a simple code which doesn't impact trimming word function
206
+ * @since 1.9.4
207
+ *
208
+ * @global type $cv_replaced_tags
209
+ * @global type $cv_replaced_idx
210
+ * @param type $matches
211
+ * @return string
212
+ */
213
+ public static function _callback_before_trim_words( $matches ) {
214
+ global $cv_replaced_tags, $cv_replaced_idx;
215
+
216
+ $return = $matches;
217
+ if ( !empty( $matches[ 0 ] ) ) {
218
+ $cv_replaced_tags[ ++$cv_replaced_idx ] = $matches[ 0 ];
219
+ $return = "@$cv_replaced_idx@";
220
+ }
221
+
222
+ return $return;
223
+ }
224
+
225
+ public static function filter_after_trim_words( $content ) {
226
+ if ( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-excerpt-allow_html' ) ) {
227
+ $content = preg_replace_callback( '/@(\d+)@/', array( __CLASS__, '_callback_after_trim_words' ), $content );
228
+ }
229
+
230
+ return $content;
231
+ }
232
+
233
+ /**
234
+ * Revert HTML tag content
235
+ * @since 1.9.4
236
+ *
237
+ * @global type $cv_replaced_tags
238
+ * @param type $matches
239
+ * @return \type
240
+ */
241
+ public static function _callback_after_trim_words( $matches ) {
242
+ global $cv_replaced_tags;
243
+
244
+ $return = $matches;
245
+ if ( !empty( $matches[ 1 ] ) && isset( $cv_replaced_tags[ (int) $matches[ 1 ] ] ) ) {
246
+ $return = $cv_replaced_tags[ (int) $matches[ 1 ] ];
247
+ }
248
+
249
+ return $return;
250
+ }
251
+
252
+ // Disable WP 4.4 responsive image
253
+ public static function filter_disable_wp_responsive_image( $args, $attachment = null, $size = null ) {
254
+ if ( PT_CV_Html::is_responsive_image_disabled() ) {
255
+ if ( isset( $args[ 'sizes' ] ) )
256
+ unset( $args[ 'sizes' ] );
257
+ if ( isset( $args[ 'srcset' ] ) )
258
+ unset( $args[ 'srcset' ] );
259
+ }
260
+
261
+ return $args;
262
+ }
263
+
264
+ public static function action_before_process_item() {
265
+ // Disable View Shortcode in child page
266
+ PT_CV_Functions::disable_view_shortcode();
267
+ }
268
+
269
+ public static function action_after_process_item() {
270
+ // Enable View Shortcode again
271
+ PT_CV_Functions::disable_view_shortcode( 'recovery' );
272
+ }
273
+
274
+ /**
275
+ * Issue: shortcode is visible in pagination, preview
276
+ * Solution: Backup shortcode tag in live page, to use for preview, pagination request
277
+ *
278
+ * @since 1.9.3
279
+ */
280
+ public static function action_before_content() {
281
+ global $shortcode_tags, $cv_shortcode_tags_backup;
282
+
283
+ if ( !$cv_shortcode_tags_backup ) {
284
+ $trans_key = 'cv_shortcode_tags_193';
285
+ if ( !defined( 'PT_CV_DOING_PAGINATION' ) && !defined( 'PT_CV_DOING_PREVIEW' ) ) {
286
+ $tagnames = array_keys( $shortcode_tags );
287
+ $cv_shortcode_tags_backup = join( '|', array_map( 'preg_quote', $tagnames ) );
288
+ set_transient( $trans_key, $cv_shortcode_tags_backup, DAY_IN_SECONDS );
289
+ } else {
290
+ $cv_shortcode_tags_backup = get_transient( $trans_key );
291
+ }
292
+ }
293
+ }
294
+
295
+ }
296
+
297
+ }
 
 
 
 
 
 
 
 
 
 
 
 
includes/html-viewtype.php CHANGED
@@ -278,10 +278,10 @@ if ( !class_exists( 'PT_CV_Html_ViewType' ) ) {
278
  $output = '';
279
  if ( $count_slides > 1 ) {
280
  $output = sprintf(
281
- '<a class="left carousel-control" href="#%1$s" data-cvslide="prev">
282
  <span class="glyphicon glyphicon-chevron-left"></span>
283
  </a>
284
- <a class="right carousel-control" href="#%1$s" data-cvslide="next">
285
  <span class="glyphicon glyphicon-chevron-right"></span>
286
  </a>', esc_attr( $wrapper_id )
287
  );
278
  $output = '';
279
  if ( $count_slides > 1 ) {
280
  $output = sprintf(
281
+ '<a class="left carousel-control" data-target="#%1$s" data-cvslide="prev">
282
  <span class="glyphicon glyphicon-chevron-left"></span>
283
  </a>
284
+ <a class="right carousel-control" data-target="#%1$s" data-cvslide="next">
285
  <span class="glyphicon glyphicon-chevron-right"></span>
286
  </a>', esc_attr( $wrapper_id )
287
  );
includes/html.php CHANGED
@@ -1,871 +1,880 @@
1
- <?php
2
- /**
3
- * HTML output, class, id generating
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- if ( !class_exists( 'PT_CV_Html' ) ) {
16
-
17
- /**
18
- * @name PT_CV_Html
19
- * @todo related HTML functions: Define HTML layout, Set class name...
20
- */
21
- class PT_CV_Html {
22
-
23
- // Store directory of selected view_types
24
- static $view_type_dir = array();
25
- // Store all selected styles
26
- static $style = array();
27
-
28
- /**
29
- * return class for Panel (Group of) group of params
30
- *
31
- * @return string
32
- */
33
- static function html_panel_group_class() {
34
- return 'panel-group';
35
- }
36
-
37
- /**
38
- * Return ID for Panel (Group of) group of params
39
- *
40
- * @param string $id Unique id of element
41
- *
42
- * @return string
43
- */
44
- static function html_panel_group_id( $id ) {
45
- return 'panel-group-' . $id;
46
- }
47
-
48
- /**
49
- * Return class for group of params
50
- *
51
- * @return string
52
- */
53
- static function html_group_class() {
54
- return PT_CV_PREFIX . 'group';
55
- }
56
-
57
- /**
58
- * Return ID for group of params
59
- *
60
- * @param string $id Unique id of element
61
- *
62
- * @return string
63
- */
64
- static function html_group_id( $id ) {
65
- return self::html_group_class() . '-' . $id;
66
- }
67
-
68
- /**
69
- * Collapse HTML
70
- *
71
- * @param string $parent_id Id of parent element
72
- * @param string $id Unique id of element
73
- * @param string $heading Heading text
74
- * @param string $content Content
75
- * @param bool $show Show/hide the content
76
- */
77
- static function html_collapse_one( $parent_id, $id, $heading, $content = '', $show = true ) {
78
- $class = $show ? 'in' : '';
79
- ob_start();
80
- ?>
81
- <div class="panel panel-primary pt-accordion">
82
- <div class="panel-heading">
83
- <h4 class="panel-title">
84
- <a class="pt-accordion-a" data-parent="#<?php echo esc_attr( $parent_id ); ?>" href="#<?php echo esc_attr( $id ); ?>">
85
- <?php echo $heading; ?>
86
- </a>
87
- </h4>
88
- <span class="pull-right clickable"><i class="glyphicon glyphicon-minus"></i></span>
89
- </div>
90
- <div id="<?php echo esc_attr( $id ); ?>" class="panel-body <?php echo esc_attr( $class ); ?>">
91
- <div class="panel-body">
92
- <?php echo $content; ?>
93
- </div>
94
- </div>
95
- </div>
96
- <?php
97
- return ob_get_clean();
98
- }
99
-
100
- /**
101
- * HTML content of Preview box
102
- */
103
- static function html_preview_box() {
104
- ob_start();
105
- ?>
106
- <div class="panel panel-default collapse <?php echo PT_CV_PREFIX; ?>wrapper" id="<?php echo PT_CV_PREFIX; ?>preview-box"></div>
107
- <div class="text-center hidden" style="position: absolute; left: 50%; top: 160px;">
108
- <?php echo self::html_loading_img(); ?>
109
- </div>
110
- <?php
111
- return ob_get_clean();
112
- }
113
-
114
- /**
115
- * Show loading image
116
- *
117
- * @param type $dimension
118
- *
119
- * @return type
120
- */
121
- static function html_loading_img( $dimension = 15, $class = '' ) {
122
- $img = sprintf( '<img width="%1$s" height="%1$s" class="%2$s" alt="%3$s" src="%4$s" /><div class="clear %5$s"></div>', esc_attr( $dimension ), esc_attr( $class ), __( 'Loading...', 'content-views-query-and-display-post-page' ), self::loading_img_src(), PT_CV_PREFIX . 'clear-pagination' );
123
- return apply_filters( PT_CV_PREFIX_ . 'loading_image', $img );
124
- }
125
-
126
- static function loading_img_src() {
127
- return apply_filters( PT_CV_PREFIX_ . 'loading_image_url', 'data:image/gif;base64,R0lGODlhDwAPALMPAMrKygwMDJOTkz09PZWVla+vr3p6euTk5M7OzuXl5TMzMwAAAJmZmWZmZszMzP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAPACwAAAAADwAPAAAEQvDJaZaZOIcV8iQK8VRX4iTYoAwZ4iCYoAjZ4RxejhVNoT+mRGP4cyF4Pp0N98sBGIBMEMOotl6YZ3S61Bmbkm4mAgAh+QQFCgAPACwAAAAADQANAAAENPDJSRSZeA418itN8QiK8BiLITVsFiyBBIoYqnoewAD4xPw9iY4XLGYSjkQR4UAUD45DLwIAIfkEBQoADwAsAAAAAA8ACQAABC/wyVlamTi3nSdgwFNdhEJgTJoNyoB9ISYoQmdjiZPcj7EYCAeCF1gEDo4Dz2eIAAAh+QQFCgAPACwCAAAADQANAAAEM/DJBxiYeLKdX3IJZT1FU0iIg2RNKx3OkZVnZ98ToRD4MyiDnkAh6BkNC0MvsAj0kMpHBAAh+QQFCgAPACwGAAAACQAPAAAEMDC59KpFDll73HkAA2wVY5KgiK5b0RRoI6MuzG6EQqCDMlSGheEhUAgqgUUAFRySIgAh+QQFCgAPACwCAAIADQANAAAEM/DJKZNLND/kkKaHc3xk+QAMYDKsiaqmZCxGVjSFFCxB1vwy2oOgIDxuucxAMTAJFAJNBAAh+QQFCgAPACwAAAYADwAJAAAEMNAs86q1yaWwwv2Ig0jUZx3OYa4XoRAfwADXoAwfo1+CIjyFRuEho60aSNYlOPxEAAAh+QQFCgAPACwAAAIADQANAAAENPA9s4y8+IUVcqaWJ4qEQozSoAzoIyhCK2NFU2SJk0hNnyEOhKR2AzAAj4Pj4GE4W0bkJQIAOw==' );
128
- }
129
-
130
- /**
131
- * Html output for button
132
- *
133
- * @param string $style Bootstrap type of button
134
- * @param string $text Text of button
135
- * @param string $class Class of button
136
- * @param string $size Size of button
137
- *
138
- * @return string
139
- */
140
- static function html_button( $style, $text = 'Button', $class = '', $size = '' ) {
141
- return sprintf( '<button type="button" class="btn btn-%s %s %s">%s</button>', $style, $class, $size, $text );
142
- }
143
-
144
- /**
145
- * Html output for a link, but style as button
146
- *
147
- * @deprecated since version 2.0
148
- * @param string $link Value for href attribute of link
149
- * @param string $style Bootstrap type of button
150
- * @param string $text Text of button
151
- * @param string $class Class of button
152
- * @param string $size Size of button
153
- *
154
- * @return string
155
- */
156
- static function link_button( $link, $style, $text = 'Button', $class = '', $size = '' ) {
157
- return sprintf( '<a href="%s" class="btn btn-%s %s %s">%s</a>', $link, $style, $class, $size, $text );
158
- }
159
-
160
- /**
161
- * Get Output HTML of a View type
162
- *
163
- * @param string $view_type The view type (grid, collapse...)
164
- * @param object $post The post object
165
- * @param string $style The style of view type (main, style2...)
166
- */
167
- static function view_type_output( $view_type, $post, $post_idx = 0, $style = 'main' ) {
168
- $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
169
- $content = NULL;
170
-
171
- if ( empty( $view_type ) ) {
172
- return $content;
173
- }
174
-
175
- // Get view type directory
176
- $view_type_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_dir', PT_CV_VIEW_TYPE_OUTPUT, $view_type ) . $view_type;
177
- // Compatible code for other Pro versions
178
- $view_type_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_dir_special', $view_type_dir, $view_type );
179
- if ( strpos( $view_type_dir, $view_type . $view_type ) !== false ) {
180
- $view_type_dir = str_replace( $view_type . $view_type, $view_type, $view_type_dir );
181
- }
182
-
183
- // Get asset directory
184
- $view_type_assets_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_asset', $view_type_dir, $view_type );
185
-
186
- if ( is_dir( $view_type_dir ) ) {
187
- // Store view type & asset information
188
- self::$view_type_dir[] = $view_type_assets_dir;
189
- self::$style[] = $style;
190
-
191
- // Generate HTML output of all content fields
192
- $fields_html = array();
193
- $other_dargs = apply_filters( PT_CV_PREFIX_ . 'dargs_others', $dargs, $post_idx );
194
- foreach ( (array) $other_dargs[ 'fields' ] as $field_name ) {
195
- // Get settings of fields
196
- $fargs = isset( $other_dargs[ 'field-settings' ] ) ? $other_dargs[ 'field-settings' ] : array();
197
-
198
- $fargs[ 'layout-format' ] = $other_dargs[ 'layout-format' ];
199
-
200
- // Get HTML output of field
201
- $item_html = self::field_item_html( $field_name, $post, $fargs );
202
- if ( $item_html ) {
203
- $fields_html[ $field_name ] = $item_html;
204
- }
205
- }
206
-
207
- $fields_html = apply_filters( PT_CV_PREFIX_ . 'fields_html', $fields_html, $post );
208
- $content = apply_filters( PT_CV_PREFIX_ . 'view_type_custom_output', $content, $fields_html, $post );
209
- if ( !$content ) {
210
- // Get HTML content of view type, with specific style
211
- $file_path = apply_filters( PT_CV_PREFIX_ . 'view_type_file', $view_type_dir . '/' . 'html' . '/' . $style . '.' . 'php' );
212
-
213
- if ( file_exists( $file_path ) ) {
214
- ob_start();
215
- // Include, not include_once
216
- include $file_path;
217
- $content = ob_get_clean();
218
- }
219
- }
220
- }
221
-
222
- return $content;
223
- }
224
-
225
- /**
226
- * Wrap content of a item
227
- *
228
- * @param array $html_item The HTML output of a item
229
- * @param string $class The extra wrapper class of a item, such as col span
230
- * @param array $post_id The post ID
231
- *
232
- * @return string Full HTML output of a item
233
- */
234
- static function content_item_wrap( $html_item, $class = '', $post_id = 0 ) {
235
- if ( empty( $html_item ) ) {
236
- return '';
237
- }
238
-
239
- $classes = array( $class );
240
- $classes[] = PT_CV_PREFIX . 'content-item';
241
- $classes[] = PT_CV_PREFIX . PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format' );
242
- $item_class = apply_filters( PT_CV_PREFIX_ . 'content_item_class', $classes, $post_id );
243
- $item_filter = apply_filters( PT_CV_PREFIX_ . 'content_item_filter_value', '', $post_id );
244
-
245
- ob_start();
246
- do_action( PT_CV_PREFIX_ . 'item_extra_html', $post_id );
247
- $html_item .= ob_get_clean();
248
-
249
- $result = sprintf( '<div class="%s" %s>%s</div>', esc_attr( implode( ' ', $item_class ) ), cv_sanitize_html_data( $item_filter ), force_balance_tags( $html_item ) );
250
- return apply_filters( PT_CV_PREFIX_ . 'item_final_html', $result, $post_id );
251
- }
252
-
253
- static function no_post_found() {
254
- return apply_filters( PT_CV_PREFIX_ . 'content_no_post_found_text', __( 'No posts found.' ) );
255
- }
256
-
257
- static function grid_item_wrap( $content_item ) {
258
- $class = PT_CV_PREFIX . 'ifield';
259
- return "<div class='$class'>$content_item</div>";
260
- }
261
-
262
- /**
263
- * Wrap content of all items
264
- *
265
- * @param array $content_items The array of Raw HTML output (is not wrapped) of each item
266
- * @param int $current_page The current page
267
- * @param int $post_per_page The number of posts per page
268
- * @param int $id ID of View
269
- *
270
- * @return string Full HTML output for Content View
271
- */
272
- static function content_items_wrap( $content_items, $current_page, $post_per_page, $id ) {
273
- if ( empty( $content_items ) ) {
274
- return PT_CV_Functions::debug_output( 'empty content_items', self::no_post_found() );
275
- }
276
-
277
- PT_CV_Functions::set_global_variable( 'content_items', $content_items );
278
- $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
279
- $content = array();
280
- $non_paging = !defined( 'PT_CV_DOING_PAGINATION' );
281
- $before_output = $non_paging ? apply_filters( PT_CV_PREFIX_ . 'before_output_html', '' ) : '';
282
- $view_type = $dargs[ 'view-type' ];
283
-
284
- switch ( $view_type ) {
285
- case 'grid':
286
- $content_items = array_map( array( __CLASS__, 'grid_item_wrap' ), $content_items );
287
- PT_CV_Html_ViewType::grid_wrapper( $content_items, $content );
288
-
289
- break;
290
-
291
- case 'collapsible':
292
- PT_CV_Html_ViewType::collapsible_wrapper( $content_items, $content );
293
-
294
- break;
295
-
296
- case 'scrollable':
297
- PT_CV_Html_ViewType::scrollable_wrapper( $content_items, $content );
298
-
299
- break;
300
-
301
- default :
302
- foreach ( $content_items as $post_id => $content_item ) {
303
- $content[] = PT_CV_Html::content_item_wrap( $content_item, '', $post_id );
304
- }
305
-
306
- $content = apply_filters( PT_CV_PREFIX_ . 'content_items_wrap', $content, $content_items, $current_page, $post_per_page );
307
-
308
- break;
309
- }
310
-
311
- $content_list = implode( "\n", $content );
312
-
313
- if ( apply_filters( PT_CV_PREFIX_ . 'wrap_in_page', true ) ) {
314
- $cols = sprintf( 'data-cvc="%s"', (int) $dargs[ 'number-columns' ] );
315
- $page_attr = apply_filters( PT_CV_PREFIX_ . 'page_attr', $cols, $view_type, $content_items );
316
- $html = sprintf( '<div data-id="%s" class="%s" %s>%s</div>', esc_attr( PT_CV_PREFIX . 'page' . '-' . $current_page ), esc_attr( apply_filters( PT_CV_PREFIX_ . 'page_class', PT_CV_PREFIX . 'page' ) ), cv_sanitize_html_data( $page_attr ), $content_list );
317
- } else {
318
- $html = $content_list;
319
- }
320
-
321
- // Wrap in View
322
- if ( $non_paging ) {
323
- $use_grid = PT_CV_Functions::get_global_variable( 'use_grid', true );
324
- $view_class = apply_filters( PT_CV_PREFIX_ . 'view_class', array( PT_CV_PREFIX . 'view', PT_CV_PREFIX . $view_type, $use_grid ? PT_CV_PREFIX . 'colsys' : '', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'lf-mobile-disable' ) ? PT_CV_PREFIX . 'nolf' : '' ) );
325
- $view_id = PT_CV_PREFIX . 'view-' . $id;
326
- $output = sprintf( '<div class="%s" id="%s">%s</div>', esc_attr( implode( ' ', array_filter( $view_class ) ) ), $view_id, $html );
327
-
328
- // Keep this action for CVP < 3.5
329
- do_action( PT_CV_PREFIX_ . 'store_view_data', $view_id );
330
- } else {
331
- $output = $html;
332
- }
333
-
334
- return apply_filters( PT_CV_PREFIX_ . 'view_all_output', $before_output . $output, $before_output, $output );
335
- }
336
-
337
- /**
338
- * HTML output of a field (thumbnail, title, content, meta fields...)
339
- *
340
- * @param string $field_name The field name
341
- * @param object $post The post object
342
- * @param array $fargs The array of Field settings
343
- *
344
- * @return string
345
- */
346
- static function field_item_html( $field_name, $post, $fargs ) {
347
- if ( empty( $field_name ) ) {
348
- return '';
349
- }
350
-
351
- $html = '';
352
-
353
- switch ( $field_name ) {
354
-
355
- case 'thumbnail':
356
- if ( !empty( $fargs[ 'thumbnail' ] ) ) {
357
- $html = self::_field_thumbnail( $post, $fargs );
358
- }
359
-
360
- break;
361
-
362
- case 'title':
363
- $html = self::_field_title( $post, $fargs );
364
-
365
- break;
366
-
367
- case 'content':
368
- if ( !empty( $fargs[ 'content' ] ) ) {
369
- $html = self::_field_content( $post, $fargs );
370
- }
371
-
372
- break;
373
-
374
- case 'meta-fields':
375
- if ( !empty( $fargs[ 'meta-fields' ] ) ) {
376
- $html = self::_field_meta( $post, $fargs[ 'meta-fields' ] );
377
- }
378
-
379
- break;
380
-
381
- default :
382
- $html = apply_filters( PT_CV_PREFIX_ . 'field_item_html', $html, $field_name, $post );
383
- break;
384
- }
385
-
386
- return apply_filters( PT_CV_PREFIX_ . 'item_' . $field_name, $html, $post );
387
- }
388
-
389
- /**
390
- * Get Title
391
- *
392
- * @return string
393
- */
394
- static function _field_title( $post, $fargs ) {
395
- $title_class = apply_filters( PT_CV_PREFIX_ . 'field_title_class', PT_CV_PREFIX . 'title' );
396
- $tag = !empty( $fargs[ 'title' ][ 'tag' ] ) ? $fargs[ 'title' ][ 'tag' ] : 'h4';
397
- $title = get_the_title( $post );
398
- if ( empty( $title ) ) {
399
- $title = __( '(no title)', 'content-views-query-and-display-post-page' );
400
- }
401
-
402
- $title = apply_filters( PT_CV_PREFIX_ . 'field_title_result', $title, $fargs, $post );
403
- $html = sprintf(
404
- '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $title_class ), self::_field_href( $post, $title )
405
- );
406
-
407
- return apply_filters( PT_CV_PREFIX_ . 'field_title_final', $html, $post );
408
- }
409
-
410
- /**
411
- * Get content
412
- *
413
- * @return string
414
- */
415
- static function _field_content( $post, $fargs ) {
416
- setup_postdata( $post );
417
-
418
- do_action( PT_CV_PREFIX_ . 'before_content' );
419
-
420
- $content_class = apply_filters( PT_CV_PREFIX_ . 'field_content_class', PT_CV_PREFIX . 'content' );
421
- $tag = apply_filters( PT_CV_PREFIX_ . 'field_content_tag', 'div' );
422
- $content = '';
423
-
424
- switch ( $fargs[ 'content' ][ 'show' ] ) {
425
- case 'excerpt':
426
- $length = (int) $fargs[ 'content' ][ 'length' ];
427
- $readmore_btn = '';
428
- $show_dots = apply_filters( PT_CV_PREFIX_ . 'field_excerpt_dots', 1, $fargs );
429
- $tail = $show_dots ? ' ...' : '';
430
-
431
- // Read more button
432
- if ( apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_enable', 1, $fargs[ 'content' ] ) ) {
433
- $readmore_text = self::get_readmore_text( $fargs[ 'content' ] );
434
- $btn_class = PT_CV_PREFIX . 'readmore ' . apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_class', 'btn btn-success', $fargs );
435
- $readmore_btn = self::_field_href( $post, $readmore_text, $btn_class );
436
- $tail .= apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_seperated', '<br/>', $fargs );
437
- }
438
-
439
- // Get excerpt
440
- if ( $length > 0 ) {
441
- $GLOBALS[ 'cv_excerpt_type' ] = 'content';
442
-
443
- $full_excerpt = apply_filters( PT_CV_PREFIX_ . 'field_content_excerpt', get_the_content( '' ), $fargs, $post );
444
-
445
- if ( apply_filters( PT_CV_PREFIX_ . 'trim_excerpt', $GLOBALS[ 'cv_excerpt_type' ] == 'content' ) ) {
446
- $excerpt = PT_CV_Functions::cv_trim_words( $full_excerpt, $length );
447
- } else {
448
- $excerpt = $full_excerpt;
449
- }
450
-
451
- // Append readmore button
452
- $content = apply_filters( PT_CV_PREFIX_ . 'excerpt_html', ($show_dots ? rtrim( $excerpt, '.' ) : $excerpt) . $tail, $post ) . $readmore_btn;
453
- } else {
454
- // Display only readmore button if length <= 0
455
- $content = $readmore_btn;
456
- }
457
-
458
- break;
459
-
460
- case 'full':
461
- ob_start();
462
- the_content();
463
- $content = ob_get_clean();
464
- $content = apply_filters( PT_CV_PREFIX_ . 'field_content_full', $content, $fargs, $post );
465
-
466
- break;
467
- }
468
-
469
- $content = apply_filters( PT_CV_PREFIX_ . 'field_content_final', $content, $post );
470
- $html = rtrim( $content, '.' ) ? sprintf( '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $content_class ), force_balance_tags( $content ) ) : '';
471
-
472
- return $html;
473
- }
474
-
475
- /**
476
- * Output link to item
477
- */
478
- static function _field_href( $post, $content, $defined_class = '' ) {
479
- $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
480
- $oargs = isset( $dargs[ 'other-settings' ] ) ? $dargs[ 'other-settings' ] : array();
481
-
482
- $open_in = isset( $oargs[ 'open-in' ] ) ? $oargs[ 'open-in' ] : '_blank';
483
- $href = apply_filters( PT_CV_PREFIX_ . 'field_href', get_permalink( $post->ID ), $post );
484
- $href_class = apply_filters( PT_CV_PREFIX_ . 'field_href_class', array( $open_in, $defined_class ), $oargs );
485
- $custom_attr = apply_filters( PT_CV_PREFIX_ . 'field_href_attrs', array(), $open_in, $oargs );
486
- $html = sprintf( '<a href="%s" class="%s" target="%s" %s>%s</a>', esc_url( $href ), esc_attr( implode( ' ', array_filter( $href_class ) ) ), esc_attr( $open_in ), cv_sanitize_html_data( implode( ' ', $custom_attr ) ), $content );
487
-
488
- return apply_filters( PT_CV_PREFIX_ . 'link_html', $html, array( $post, $content, $defined_class ) );
489
- }
490
-
491
- /**
492
- * HTML output of thumbnail field
493
- *
494
- * @param object $post The post object
495
- * @param array $_fargs The settings of this field
496
- *
497
- * @return string
498
- */
499
- static function _field_thumbnail( $post, $_fargs ) {
500
- $layout_format = $_fargs[ 'layout-format' ];
501
-
502
- // Get thumbnail settings
503
- $fargs = $_fargs[ 'thumbnail' ];
504
-
505
- // Thumbnail class
506
- $thumbnail_position = 'default';
507
- $thumbnail_class = array();
508
- $thumbnail_class[] = PT_CV_PREFIX . 'thumbnail';
509
- $thumbnail_class[] = isset( $fargs[ 'style' ] ) ? $fargs[ 'style' ] : '';
510
- if ( $layout_format === '2-col' ) {
511
- $thumbnail_position = isset( $fargs[ 'position' ] ) ? $fargs[ 'position' ] : 'left';
512
- $thumbnail_class[] = 'pull-' . $thumbnail_position;
513
- }
514
- $gargs = array(
515
- 'class' => apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_class', implode( ' ', array_filter( $thumbnail_class ) ) ),
516
- );
517
-
518
- /**
519
- * @since 1.7.5
520
- * able to disable responsive image of WordPress 4.4
521
- */
522
- if ( PT_CV_Html::is_responsive_image_disabled() ) {
523
- $gargs[ 'srcset' ] = 1;
524
- }
525
-
526
- // Get thumbnail dimensions
527
- $dimensions = (array) apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_dimension_output', PT_CV_Functions::field_thumbnail_dimensions( $fargs ), $fargs );
528
-
529
- // Check if has thumbnail ( has_post_thumbnail doesn't works )
530
- $thumbnail_id = get_post_thumbnail_id( $post->ID );
531
- $html = '';
532
- if ( !empty( $thumbnail_id ) ) {
533
- $thumbnail_size = count( $dimensions ) > 1 ? $dimensions : $dimensions[ 0 ];
534
- $html = wp_get_attachment_image( (int) $thumbnail_id, $thumbnail_size, false, $gargs );
535
- $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_image', $html, $post, $dimensions, $fargs );
536
- }
537
-
538
- // If no thumbnail
539
- if ( empty( $html ) || apply_filters( PT_CV_PREFIX_ . 'force_replace_thumbnail', 0 ) ) {
540
- $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_not_found', $html, $post, $dimensions, $gargs );
541
- }
542
-
543
- // Maybe add custom wrap for image
544
- $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_image_html', $html );
545
-
546
- return apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_nolink', false ) ? $html :
547
- self::_field_href( $post, $html, implode( ' ', array( PT_CV_PREFIX . 'href-thumbnail', PT_CV_PREFIX . 'thumb-' . $thumbnail_position ) ) );
548
- }
549
-
550
- /**
551
- * HTML output of meta fields group
552
- *
553
- * @param object $post The post object
554
- * @param array $fargs The settings of this field
555
- *
556
- * @return string
557
- */
558
- static function _field_meta( $post, $fargs ) {
559
- $html = array();
560
-
561
- setup_postdata( $post );
562
-
563
- foreach ( $fargs as $meta => $val ) {
564
- if ( !$val ) {
565
- continue;
566
- }
567
-
568
- switch ( $meta ) {
569
- case 'date':
570
- $date_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'entry-date', 'date' );
571
- $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'date' );
572
- $date_format = apply_filters( PT_CV_PREFIX_ . 'field_meta_date_format', get_option( 'date_format' ) );
573
- $date = apply_filters( PT_CV_PREFIX_ . 'field_meta_date_final', mysql2date( $date_format, $post->post_date ), get_the_time( 'U' ) );
574
-
575
- $html[ 'date' ] = sprintf( '<span class="%s">%s <time datetime="%s">%s</time></span>', esc_attr( $date_class ), $prefix_text, esc_attr( get_the_date( 'c' ) ), esc_html( $date ) );
576
- break;
577
-
578
- case 'taxonomy':
579
- $term_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'terms', 'terms' );
580
- $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'terms' );
581
-
582
- $terms = PT_CV_Functions::post_terms( $post );
583
- if ( !empty( $terms ) ) {
584
- $term_html = sprintf( '<span class="%s">%s %s</span>', esc_attr( $term_class ), $prefix_text, $terms );
585
- $html[ 'taxonomy' ] = apply_filters( PT_CV_PREFIX_ . 'field_term_html', $term_html, $terms );
586
- }
587
- break;
588
-
589
- case 'comment':
590
- if ( !post_password_required() && ( comments_open() || get_comments_number() ) ) :
591
- $comment_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'comments-link', 'comment' );
592
- $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'comment' );
593
-
594
- ob_start();
595
- comments_popup_link();
596
- $comment_content = ob_get_clean();
597
- $comment_content = apply_filters( PT_CV_PREFIX_ . 'comments_count', $comment_content );
598
- $comment_html = sprintf( '<span class="%s">%s %s</span>', esc_attr( $comment_class ), $prefix_text, $comment_content );
599
- $html[ 'comment' ] = apply_filters( PT_CV_PREFIX_ . 'field_comment_html', $comment_html, $post );
600
- endif;
601
- break;
602
-
603
- case 'author':
604
- $author_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'author', 'author' );
605
- $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'author' );
606
-
607
- $author_html = sprintf( '<span class="%s">%s <a href="%s" rel="author">%s</a></span>', esc_attr( $author_class ), $prefix_text, esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), get_the_author() );
608
- $html[ 'author' ] = apply_filters( PT_CV_PREFIX_ . 'field_meta_author_html', $author_html, $post );
609
- break;
610
-
611
- default:
612
- break;
613
- }
614
- }
615
-
616
- // Merge fields, or let them as seperate items in array
617
- $merge_fields = apply_filters( PT_CV_PREFIX_ . 'field_meta_merge_fields', true );
618
-
619
- if ( $merge_fields ) {
620
- $result = PT_CV_Html::_field_meta_wrap( $html );
621
- } else {
622
- $result = $html;
623
- }
624
-
625
- return $result;
626
- }
627
-
628
- /**
629
- * Wrap meta fields in a wrapper
630
- *
631
- * @param array $meta_html Array of meta fields to wrapping
632
- * @param string $seperator Seperator string when join meta fields
633
- *
634
- * @return string
635
- */
636
- static function _field_meta_wrap( $meta_html, $seperator = NULL ) {
637
- if ( !$meta_html ) {
638
- return '';
639
- }
640
-
641
- $seperator = isset( $seperator ) ? $seperator : apply_filters( PT_CV_PREFIX_ . 'field_meta_seperator', ' / ' );
642
- $class = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_class', PT_CV_PREFIX . 'meta-fields' );
643
- $tag = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_tag', 'div' );
644
- $wrapper = sprintf( '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $class ), '%s' );
645
- $meta_html = implode( $seperator, (array) apply_filters( PT_CV_PREFIX_ . 'meta_field_html', $meta_html ) );
646
- $html = !empty( $meta_html ) ? sprintf( $wrapper, $meta_html ) : '';
647
-
648
- return $html;
649
- }
650
-
651
- /**
652
- * Output pagination
653
- *
654
- * @param type $max_num_pages The total of pages
655
- * @param type $current_page The current pages
656
- * @param string $sid View ID
657
- *
658
- * @return type
659
- */
660
- static function pagination_output( $max_num_pages, $current_page, $sid ) {
661
- if ( !$max_num_pages ) {
662
- return '';
663
- }
664
-
665
- global $cv_unique_id;
666
- $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
667
- $pagination_btn = '';
668
- $type = isset( $dargs[ 'pagination-settings' ][ 'type' ] ) ? $dargs[ 'pagination-settings' ][ 'type' ] : 'ajax';
669
- $style = isset( $dargs[ 'pagination-settings' ][ 'style' ] ) ? $dargs[ 'pagination-settings' ][ 'style' ] : 'regular';
670
-
671
- if ( $type == 'normal' || $style == 'regular' ) {
672
- $ul_class = implode( ' ', array( PT_CV_PREFIX . 'pagination', PT_CV_PREFIX . $type, 'pagination' ) );
673
- $pagination_btn = sprintf( '<ul class="%s" data-totalpages="%s" data-currentpage="%s" data-sid="%s" data-unid="%s">%s</ul>', $ul_class, esc_attr( $max_num_pages ), esc_attr( $current_page ), esc_attr( $sid ), esc_attr( $cv_unique_id ), ($type == 'normal') ? PT_CV_Functions::pagination( $max_num_pages, $current_page ) : '<li></li>' );
674
- } else {
675
- $pagination_btn = apply_filters( PT_CV_PREFIX_ . 'btn_more_html', $pagination_btn, $max_num_pages, $sid );
676
- }
677
- $pagination_btn .= self::html_loading_img( 15, PT_CV_PREFIX . 'spinner' );
678
-
679
- $class = esc_attr( implode( ' ', array( apply_filters( PT_CV_PREFIX_ . 'pagination_class', '' ), PT_CV_PREFIX . 'pagination-wrapper' ) ) );
680
- $output = sprintf( '<div class="%s">%s</div>', $class, $pagination_btn );
681
-
682
- return apply_filters( PT_CV_PREFIX_ . 'pagination_output', $output );
683
- }
684
-
685
- static function assets_of_view_types() {
686
- global $pt_cv_glb, $pt_cv_id;
687
-
688
- // If already processed | have no View on this page -> return
689
- if ( !empty( $pt_cv_glb[ $pt_cv_id ][ 'applied_assets' ] ) || !$pt_cv_id ) {
690
- return;
691
- }
692
- // Mark as processed
693
- $pt_cv_glb[ $pt_cv_id ][ 'applied_assets' ] = 1;
694
-
695
- // Link to external files
696
- $assets_files = apply_filters( PT_CV_PREFIX_ . 'assets_files', array() );
697
-
698
- if ( is_admin() ) {
699
- // Include assets file in Preview
700
- foreach ( $assets_files as $type => $srcs ) {
701
- foreach ( $srcs as $src ) {
702
- PT_CV_Asset::include_inline( 'preview', $src, $type );
703
- }
704
- }
705
- } else {
706
- // Enqueue merged asset contents
707
- foreach ( $assets_files as $type => $srcs ) {
708
- foreach ( $srcs as $src ) {
709
- $type = ( $type == 'js' ) ? 'script' : 'style';
710
- $function = "wp_enqueue_{$type}";
711
-
712
- if ( function_exists( $function ) ) {
713
- $function( PT_CV_PREFIX . $type, $src );
714
- }
715
- }
716
- }
717
- }
718
-
719
- // Output custom inline style for Views
720
- if ( apply_filters( PT_CV_PREFIX_ . 'output_view_style', 1 ) ) {
721
- do_action( PT_CV_PREFIX_ . 'print_view_style' );
722
- }
723
- }
724
-
725
- /**
726
- * Scripts for Preview & WP frontend
727
- */
728
- static function frontend_scripts() {
729
- PT_CV_Asset::enqueue(
730
- 'content-views', 'script', array(
731
- 'src' => plugins_url( 'public/assets/js/cv.js', PT_CV_FILE ),
732
- 'deps' => array( 'jquery' ),
733
- )
734
- );
735
-
736
- PT_CV_Asset::localize_script(
737
- 'content-views', PT_CV_PREFIX_UPPER . 'PUBLIC', array(
738
- '_prefix' => PT_CV_PREFIX,
739
- 'page_to_show' => apply_filters( PT_CV_PREFIX_ . 'pages_to_show', 5 ),
740
- '_nonce' => wp_create_nonce( PT_CV_PREFIX_ . 'ajax_nonce' ),
741
- 'is_admin' => is_admin(),
742
- 'is_mobile' => apply_filters( PT_CV_PREFIX_ . 'is_mobile', wp_is_mobile() ),
743
- 'ajaxurl' => admin_url( 'admin-ajax.php' ),
744
- 'lang' => PT_CV_Functions::get_language(), #Get current language of site
745
- 'loading_image_src' => PT_CV_Html::loading_img_src(),
746
- ) + apply_filters( PT_CV_PREFIX_ . 'public_localize_script_extra', array() )
747
- );
748
-
749
- PT_CV_Asset::localize_script(
750
- array( 'content-views', 'bootstrap-admin' ), PT_CV_PREFIX_UPPER . 'PAGINATION', apply_filters( PT_CV_PREFIX_ . 'pagination_text', array(
751
- 'first' => '&laquo;',
752
- 'prev' => '&lsaquo;',
753
- 'next' => '&rsaquo;',
754
- 'last' => '&raquo;',
755
- 'goto_first' => __( 'Go to first page', 'content-views-query-and-display-post-page' ),
756
- 'goto_prev' => __( 'Go to previous page', 'content-views-query-and-display-post-page' ),
757
- 'goto_next' => __( 'Go to next page', 'content-views-query-and-display-post-page' ),
758
- 'goto_last' => __( 'Go to last page', 'content-views-query-and-display-post-page' ),
759
- 'current_page' => __( 'Current page is', 'content-views-query-and-display-post-page' ),
760
- 'goto_page' => __( 'Go to page', 'content-views-query-and-display-post-page' ),
761
- ) )
762
- );
763
-
764
- // Load Pro scripts
765
- do_action( PT_CV_PREFIX_ . 'frontend_scripts' );
766
- }
767
-
768
- /**
769
- * Styles for Preview & WP frontend
770
- *
771
- * @global bool $is_IE
772
- */
773
- static function frontend_styles() {
774
- PT_CV_Asset::enqueue(
775
- 'public', 'style', array(
776
- 'src' => plugins_url( 'public/assets/css/' . (!cv_is_damaged_style() ? 'cv.css' : 'cv.im.css'), PT_CV_FILE ),
777
- )
778
- );
779
-
780
- // Fix bootstrap error in IE
781
- global $is_IE;
782
- if ( $is_IE ) {
783
- PT_CV_Asset::enqueue(
784
- 'html5shiv', 'script', array(
785
- 'src' => plugins_url( 'assets/ie-fix/html5shiv.min.js', PT_CV_FILE ),
786
- 'ver' => '3.7.0',
787
- )
788
- );
789
- PT_CV_Asset::enqueue(
790
- 'respond', 'script', array(
791
- 'src' => plugins_url( 'assets/ie-fix/respond.js', PT_CV_FILE ),
792
- 'ver' => '1.4.2',
793
- )
794
- );
795
- }
796
-
797
- // Load Pro styles
798
- do_action( PT_CV_PREFIX_ . 'frontend_styles' );
799
- }
800
-
801
- /**
802
- * Print inline js code
803
- *
804
- * @param string $js The js code
805
- *
806
- * @return string
807
- */
808
- static function inline_script( $js, $wrap = true, $prefix = 'inline' ) {
809
- // Generate random id for script tag
810
- $random_id = PT_CV_Functions::string_random();
811
-
812
- ob_start();
813
- ?>
814
- <script type="text/javascript" id="<?php echo esc_attr( PT_CV_PREFIX . $prefix . '-script-' . $random_id ); ?>">
815
- <?php
816
- $newline = "\n";
817
- $format = $wrap ? "(function($){\$(function(){ {$newline}%s{$newline} });}(jQuery));" : '%s';
818
- printf( $format, $js );
819
- ?>
820
- </script>
821
- <?php
822
- return ob_get_clean();
823
- }
824
-
825
- /**
826
- * Print inline css code
827
- *
828
- * @param string $css The css code
829
- *
830
- * @return string
831
- */
832
- static function inline_style( $css, $prefix = 'inline' ) {
833
- // Generate random id for style tag
834
- $random_id = PT_CV_Functions::string_random();
835
-
836
- ob_start();
837
- ?>
838
- <style type="text/css" id="<?php echo esc_attr( PT_CV_PREFIX . $prefix . '-style-' . $random_id ); ?>"><?php echo '' . $css; ?></style>
839
- <?php
840
- return ob_get_clean();
841
- }
842
-
843
- static function is_responsive_image_disabled() {
844
- return apply_filters( PT_CV_PREFIX_ . 'disable_responsive_image', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-thumbnail-nowprpi' ) );
845
- }
846
-
847
- /**
848
- * Return Readmore text, able to get translation from CV, WP
849
- *
850
- * @since 1.9.1
851
- * @param array $args
852
- * @return string
853
- */
854
- static function get_readmore_text( $args ) {
855
- $result = '';
856
- if ( !empty( $args[ 'readmore-text' ] ) ) {
857
- $result = stripslashes( cv_sanitize_tag_content( $args[ 'readmore-text' ] ) );
858
- // CV translation
859
- if ( $result === 'Read More' ) {
860
- $result = __( 'Read More', 'content-views-query-and-display-post-page' );
861
- }
862
- } else {
863
- // WP translation
864
- $result = ucwords( rtrim( __( 'Read more...' ), '.' ) );
865
- }
866
- return $result;
867
- }
868
-
869
- }
870
-
 
 
 
 
 
 
 
 
 
871
  }
1
+ <?php
2
+ /**
3
+ * HTML output, class, id generating
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( !class_exists( 'PT_CV_Html' ) ) {
16
+
17
+ /**
18
+ * @name PT_CV_Html
19
+ * @todo related HTML functions: Define HTML layout, Set class name...
20
+ */
21
+ class PT_CV_Html {
22
+
23
+ // Store directory of selected view_types
24
+ static $view_type_dir = array();
25
+ // Store all selected styles
26
+ static $style = array();
27
+
28
+ /**
29
+ * return class for Panel (Group of) group of params
30
+ *
31
+ * @return string
32
+ */
33
+ static function html_panel_group_class() {
34
+ return 'panel-group';
35
+ }
36
+
37
+ /**
38
+ * Return ID for Panel (Group of) group of params
39
+ *
40
+ * @param string $id Unique id of element
41
+ *
42
+ * @return string
43
+ */
44
+ static function html_panel_group_id( $id ) {
45
+ return 'panel-group-' . $id;
46
+ }
47
+
48
+ /**
49
+ * Return class for group of params
50
+ *
51
+ * @return string
52
+ */
53
+ static function html_group_class() {
54
+ return PT_CV_PREFIX . 'group';
55
+ }
56
+
57
+ /**
58
+ * Return ID for group of params
59
+ *
60
+ * @param string $id Unique id of element
61
+ *
62
+ * @return string
63
+ */
64
+ static function html_group_id( $id ) {
65
+ return self::html_group_class() . '-' . $id;
66
+ }
67
+
68
+ /**
69
+ * Collapse HTML
70
+ *
71
+ * @param string $parent_id Id of parent element
72
+ * @param string $id Unique id of element
73
+ * @param string $heading Heading text
74
+ * @param string $content Content
75
+ * @param bool $show Show/hide the content
76
+ */
77
+ static function html_collapse_one( $parent_id, $id, $heading, $content = '', $show = true ) {
78
+ $class = $show ? 'in' : '';
79
+ ob_start();
80
+ ?>
81
+ <div class="panel panel-primary pt-accordion">
82
+ <div class="panel-heading">
83
+ <h4 class="panel-title">
84
+ <a class="pt-accordion-a" data-parent="#<?php echo esc_attr( $parent_id ); ?>" data-target="#<?php echo esc_attr( $id ); ?>">
85
+ <?php echo $heading; ?>
86
+ </a>
87
+ </h4>
88
+ <span class="pull-right clickable"><i class="glyphicon glyphicon-minus"></i></span>
89
+ </div>
90
+ <div id="<?php echo esc_attr( $id ); ?>" class="panel-body <?php echo esc_attr( $class ); ?>">
91
+ <div class="panel-body">
92
+ <?php echo $content; ?>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ <?php
97
+ return ob_get_clean();
98
+ }
99
+
100
+ /**
101
+ * HTML content of Preview box
102
+ */
103
+ static function html_preview_box() {
104
+ ob_start();
105
+ ?>
106
+ <div class="panel panel-default collapse <?php echo PT_CV_PREFIX; ?>wrapper" id="<?php echo PT_CV_PREFIX; ?>preview-box"></div>
107
+ <div class="text-center hidden" style="position: absolute; left: 50%; top: 160px;">
108
+ <?php echo self::html_loading_img(); ?>
109
+ </div>
110
+ <?php
111
+ return ob_get_clean();
112
+ }
113
+
114
+ /**
115
+ * Show loading image
116
+ *
117
+ * @param type $dimension
118
+ *
119
+ * @return type
120
+ */
121
+ static function html_loading_img( $dimension = 15, $class = '' ) {
122
+ $img = sprintf( '<img width="%1$s" height="%1$s" class="%2$s" alt="%3$s" src="%4$s" /><div class="clear %5$s"></div>', esc_attr( $dimension ), esc_attr( $class ), __( 'Loading...', 'content-views-query-and-display-post-page' ), self::loading_img_src(), PT_CV_PREFIX . 'clear-pagination' );
123
+ return apply_filters( PT_CV_PREFIX_ . 'loading_image', $img );
124
+ }
125
+
126
+ static function loading_img_src() {
127
+ return apply_filters( PT_CV_PREFIX_ . 'loading_image_url', 'data:image/gif;base64,R0lGODlhDwAPALMPAMrKygwMDJOTkz09PZWVla+vr3p6euTk5M7OzuXl5TMzMwAAAJmZmWZmZszMzP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAPACwAAAAADwAPAAAEQvDJaZaZOIcV8iQK8VRX4iTYoAwZ4iCYoAjZ4RxejhVNoT+mRGP4cyF4Pp0N98sBGIBMEMOotl6YZ3S61Bmbkm4mAgAh+QQFCgAPACwAAAAADQANAAAENPDJSRSZeA418itN8QiK8BiLITVsFiyBBIoYqnoewAD4xPw9iY4XLGYSjkQR4UAUD45DLwIAIfkEBQoADwAsAAAAAA8ACQAABC/wyVlamTi3nSdgwFNdhEJgTJoNyoB9ISYoQmdjiZPcj7EYCAeCF1gEDo4Dz2eIAAAh+QQFCgAPACwCAAAADQANAAAEM/DJBxiYeLKdX3IJZT1FU0iIg2RNKx3OkZVnZ98ToRD4MyiDnkAh6BkNC0MvsAj0kMpHBAAh+QQFCgAPACwGAAAACQAPAAAEMDC59KpFDll73HkAA2wVY5KgiK5b0RRoI6MuzG6EQqCDMlSGheEhUAgqgUUAFRySIgAh+QQFCgAPACwCAAIADQANAAAEM/DJKZNLND/kkKaHc3xk+QAMYDKsiaqmZCxGVjSFFCxB1vwy2oOgIDxuucxAMTAJFAJNBAAh+QQFCgAPACwAAAYADwAJAAAEMNAs86q1yaWwwv2Ig0jUZx3OYa4XoRAfwADXoAwfo1+CIjyFRuEho60aSNYlOPxEAAAh+QQFCgAPACwAAAIADQANAAAENPA9s4y8+IUVcqaWJ4qEQozSoAzoIyhCK2NFU2SJk0hNnyEOhKR2AzAAj4Pj4GE4W0bkJQIAOw==' );
128
+ }
129
+
130
+ /**
131
+ * Html output for button
132
+ *
133
+ * @param string $style Bootstrap type of button
134
+ * @param string $text Text of button
135
+ * @param string $class Class of button
136
+ * @param string $size Size of button
137
+ *
138
+ * @return string
139
+ */
140
+ static function html_button( $style, $text = 'Button', $class = '', $size = '' ) {
141
+ return sprintf( '<button type="button" class="btn btn-%s %s %s">%s</button>', $style, $class, $size, $text );
142
+ }
143
+
144
+ /**
145
+ * Html output for a link, but style as button
146
+ *
147
+ * @deprecated since version 2.0
148
+ * @param string $link Value for href attribute of link
149
+ * @param string $style Bootstrap type of button
150
+ * @param string $text Text of button
151
+ * @param string $class Class of button
152
+ * @param string $size Size of button
153
+ *
154
+ * @return string
155
+ */
156
+ static function link_button( $link, $style, $text = 'Button', $class = '', $size = '' ) {
157
+ return sprintf( '<a href="%s" class="btn btn-%s %s %s">%s</a>', $link, $style, $class, $size, $text );
158
+ }
159
+
160
+ /**
161
+ * Get Output HTML of a View type
162
+ *
163
+ * @param string $view_type The view type (grid, collapse...)
164
+ * @param object $post The post object
165
+ * @param string $style The style of view type (main, style2...)
166
+ */
167
+ static function view_type_output( $view_type, $post, $post_idx = 0, $style = 'main' ) {
168
+ $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
169
+ $content = NULL;
170
+
171
+ if ( empty( $view_type ) ) {
172
+ return $content;
173
+ }
174
+
175
+ // Sanitize view_type
176
+ $view_type = in_array( $view_type, array_keys( PT_CV_Values::view_type() ) ) ? $view_type : 'grid';
177
+
178
+ // Get view type directory
179
+ $view_type_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_dir', PT_CV_VIEW_TYPE_OUTPUT, $view_type ) . $view_type;
180
+ // Compatible code for other Pro versions
181
+ $view_type_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_dir_special', $view_type_dir, $view_type );
182
+ if ( strpos( $view_type_dir, $view_type . $view_type ) !== false ) {
183
+ $view_type_dir = str_replace( $view_type . $view_type, $view_type, $view_type_dir );
184
+ }
185
+
186
+ // Get asset directory
187
+ $view_type_assets_dir = apply_filters( PT_CV_PREFIX_ . 'view_type_asset', $view_type_dir, $view_type );
188
+
189
+ if ( is_dir( $view_type_dir ) ) {
190
+ // Store view type & asset information
191
+ self::$view_type_dir[] = $view_type_assets_dir;
192
+ self::$style[] = $style;
193
+
194
+ // Generate HTML output of all content fields
195
+ $fields_html = array();
196
+ $other_dargs = apply_filters( PT_CV_PREFIX_ . 'dargs_others', $dargs, $post_idx );
197
+ foreach ( (array) $other_dargs[ 'fields' ] as $field_name ) {
198
+ // Get settings of fields
199
+ $fargs = isset( $other_dargs[ 'field-settings' ] ) ? $other_dargs[ 'field-settings' ] : array();
200
+
201
+ $fargs[ 'layout-format' ] = $other_dargs[ 'layout-format' ];
202
+
203
+ // Get HTML output of field
204
+ $item_html = self::field_item_html( $field_name, $post, $fargs );
205
+ if ( $item_html ) {
206
+ $fields_html[ $field_name ] = $item_html;
207
+ }
208
+ }
209
+
210
+ $fields_html = apply_filters( PT_CV_PREFIX_ . 'fields_html', $fields_html, $post );
211
+ $content = apply_filters( PT_CV_PREFIX_ . 'view_type_custom_output', $content, $fields_html, $post );
212
+ if ( !$content ) {
213
+ // Get HTML content of view type, with specific style
214
+ $file_path = apply_filters( PT_CV_PREFIX_ . 'view_type_file', $view_type_dir . '/' . 'html' . '/' . $style . '.' . 'php' );
215
+
216
+ if ( file_exists( $file_path ) ) {
217
+ ob_start();
218
+ // Include, not include_once
219
+ include $file_path;
220
+ $content = ob_get_clean();
221
+ }
222
+ }
223
+ }
224
+
225
+ return $content;
226
+ }
227
+
228
+ /**
229
+ * Wrap content of a item
230
+ *
231
+ * @param array $html_item The HTML output of a item
232
+ * @param string $class The extra wrapper class of a item, such as col span
233
+ * @param array $post_id The post ID
234
+ *
235
+ * @return string Full HTML output of a item
236
+ */
237
+ static function content_item_wrap( $html_item, $class = '', $post_id = 0 ) {
238
+ if ( empty( $html_item ) ) {
239
+ return '';
240
+ }
241
+
242
+ $classes = array( $class );
243
+ $classes[] = PT_CV_PREFIX . 'content-item';
244
+ $classes[] = PT_CV_PREFIX . PT_CV_Functions::setting_value( PT_CV_PREFIX . 'layout-format' );
245
+ $item_class = apply_filters( PT_CV_PREFIX_ . 'content_item_class', $classes, $post_id );
246
+ $item_filter = apply_filters( PT_CV_PREFIX_ . 'content_item_filter_value', '', $post_id );
247
+
248
+ ob_start();
249
+ do_action( PT_CV_PREFIX_ . 'item_extra_html', $post_id );
250
+ $html_item .= ob_get_clean();
251
+
252
+ $result = sprintf( '<div class="%s" %s>%s</div>', esc_attr( implode( ' ', $item_class ) ), cv_sanitize_html_data( $item_filter ), $html_item );
253
+ return apply_filters( PT_CV_PREFIX_ . 'item_final_html', $result, $post_id );
254
+ }
255
+
256
+ static function no_post_found() {
257
+ return apply_filters( PT_CV_PREFIX_ . 'content_no_post_found_text', __( 'No posts found.' ) );
258
+ }
259
+
260
+ static function grid_item_wrap( $content_item ) {
261
+ $class = PT_CV_PREFIX . 'ifield';
262
+ return "<div class='$class'>$content_item</div>";
263
+ }
264
+
265
+ /**
266
+ * Wrap content of all items
267
+ *
268
+ * @param array $content_items The array of Raw HTML output (is not wrapped) of each item
269
+ * @param int $current_page The current page
270
+ * @param int $post_per_page The number of posts per page
271
+ * @param int $id ID of View
272
+ *
273
+ * @return string Full HTML output for Content View
274
+ */
275
+ static function content_items_wrap( $content_items, $current_page, $post_per_page, $id ) {
276
+ if ( empty( $content_items ) ) {
277
+ return PT_CV_Functions::debug_output( 'empty content_items', self::no_post_found() );
278
+ }
279
+
280
+ PT_CV_Functions::set_global_variable( 'content_items', $content_items );
281
+ $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
282
+ $content = array();
283
+ $non_paging = !defined( 'PT_CV_DOING_PAGINATION' );
284
+ $before_output = $non_paging ? apply_filters( PT_CV_PREFIX_ . 'before_output_html', '' ) : '';
285
+ $view_type = $dargs[ 'view-type' ];
286
+
287
+ switch ( $view_type ) {
288
+ case 'grid':
289
+ $content_items = array_map( array( __CLASS__, 'grid_item_wrap' ), $content_items );
290
+ PT_CV_Html_ViewType::grid_wrapper( $content_items, $content );
291
+
292
+ break;
293
+
294
+ case 'collapsible':
295
+ PT_CV_Html_ViewType::collapsible_wrapper( $content_items, $content );
296
+
297
+ break;
298
+
299
+ case 'scrollable':
300
+ PT_CV_Html_ViewType::scrollable_wrapper( $content_items, $content );
301
+
302
+ break;
303
+
304
+ default :
305
+ foreach ( $content_items as $post_id => $content_item ) {
306
+ $content[] = PT_CV_Html::content_item_wrap( $content_item, '', $post_id );
307
+ }
308
+
309
+ $content = apply_filters( PT_CV_PREFIX_ . 'content_items_wrap', $content, $content_items, $current_page, $post_per_page );
310
+
311
+ break;
312
+ }
313
+
314
+ $content_list = implode( "\n", $content );
315
+
316
+ if ( apply_filters( PT_CV_PREFIX_ . 'wrap_in_page', true ) ) {
317
+ $cols = sprintf( 'data-cvc="%s"', (int) $dargs[ 'number-columns' ] );
318
+ $page_attr = apply_filters( PT_CV_PREFIX_ . 'page_attr', $cols, $view_type, $content_items );
319
+ $html = sprintf( '<div data-id="%s" class="%s" %s>%s</div>', esc_attr( PT_CV_PREFIX . 'page' . '-' . $current_page ), esc_attr( apply_filters( PT_CV_PREFIX_ . 'page_class', PT_CV_PREFIX . 'page' ) ), cv_sanitize_html_data( $page_attr ), $content_list );
320
+ } else {
321
+ $html = $content_list;
322
+ }
323
+
324
+ // Wrap in View
325
+ if ( $non_paging ) {
326
+ $use_grid = PT_CV_Functions::get_global_variable( 'use_grid', true );
327
+ $view_class = apply_filters( PT_CV_PREFIX_ . 'view_class', array( PT_CV_PREFIX . 'view', PT_CV_PREFIX . $view_type, $use_grid ? PT_CV_PREFIX . 'colsys' : '', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'lf-mobile-disable' ) ? PT_CV_PREFIX . 'nolf' : '' ) );
328
+ $view_id = PT_CV_PREFIX . 'view-' . $id;
329
+ $output = sprintf( '<div class="%s" id="%s">%s</div>', esc_attr( implode( ' ', array_filter( $view_class ) ) ), $view_id, $html );
330
+
331
+ // Keep this action for CVP < 3.5
332
+ do_action( PT_CV_PREFIX_ . 'store_view_data', $view_id );
333
+ } else {
334
+ $output = $html;
335
+ }
336
+
337
+ return apply_filters( PT_CV_PREFIX_ . 'view_all_output', $before_output . $output, $before_output, $output );
338
+ }
339
+
340
+ /**
341
+ * HTML output of a field (thumbnail, title, content, meta fields...)
342
+ *
343
+ * @param string $field_name The field name
344
+ * @param object $post The post object
345
+ * @param array $fargs The array of Field settings
346
+ *
347
+ * @return string
348
+ */
349
+ static function field_item_html( $field_name, $post, $fargs ) {
350
+ if ( empty( $field_name ) ) {
351
+ return '';
352
+ }
353
+
354
+ $html = '';
355
+
356
+ switch ( $field_name ) {
357
+
358
+ case 'thumbnail':
359
+ if ( !empty( $fargs[ 'thumbnail' ] ) ) {
360
+ $html = self::_field_thumbnail( $post, $fargs );
361
+ }
362
+
363
+ break;
364
+
365
+ case 'title':
366
+ $html = self::_field_title( $post, $fargs );
367
+
368
+ break;
369
+
370
+ case 'content':
371
+ if ( !empty( $fargs[ 'content' ] ) ) {
372
+ $html = self::_field_content( $post, $fargs );
373
+ }
374
+
375
+ break;
376
+
377
+ case 'meta-fields':
378
+ if ( !empty( $fargs[ 'meta-fields' ] ) ) {
379
+ $html = self::_field_meta( $post, $fargs[ 'meta-fields' ] );
380
+ }
381
+
382
+ break;
383
+
384
+ default :
385
+ $html = apply_filters( PT_CV_PREFIX_ . 'field_item_html', $html, $field_name, $post );
386
+ break;
387
+ }
388
+
389
+ return apply_filters( PT_CV_PREFIX_ . 'item_' . $field_name, $html, $post );
390
+ }
391
+
392
+ /**
393
+ * Get Title
394
+ *
395
+ * @return string
396
+ */
397
+ static function _field_title( $post, $fargs ) {
398
+ $title_class = apply_filters( PT_CV_PREFIX_ . 'field_title_class', PT_CV_PREFIX . 'title' );
399
+ $tag = !empty( $fargs[ 'title' ][ 'tag' ] ) ? $fargs[ 'title' ][ 'tag' ] : 'h4';
400
+ $title = get_the_title( $post );
401
+ if ( empty( $title ) ) {
402
+ $title = __( '(no title)', 'content-views-query-and-display-post-page' );
403
+ }
404
+
405
+ $title = apply_filters( PT_CV_PREFIX_ . 'field_title_result', $title, $fargs, $post );
406
+ $html = sprintf(
407
+ '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $title_class ), self::_field_href( $post, $title )
408
+ );
409
+
410
+ return apply_filters( PT_CV_PREFIX_ . 'field_title_final', $html, $post );
411
+ }
412
+
413
+ /**
414
+ * Get content
415
+ *
416
+ * @return string
417
+ */
418
+ static function _field_content( $post, $fargs ) {
419
+ setup_postdata( $post );
420
+
421
+ do_action( PT_CV_PREFIX_ . 'before_content' );
422
+
423
+ $content_class = apply_filters( PT_CV_PREFIX_ . 'field_content_class', PT_CV_PREFIX . 'content' );
424
+ $tag = apply_filters( PT_CV_PREFIX_ . 'field_content_tag', 'div' );
425
+ $content = '';
426
+ $balance_tags = true;
427
+
428
+ switch ( $fargs[ 'content' ][ 'show' ] ) {
429
+ case 'excerpt':
430
+ $length = (int) $fargs[ 'content' ][ 'length' ];
431
+ $readmore_btn = '';
432
+ $show_dots = apply_filters( PT_CV_PREFIX_ . 'field_excerpt_dots', 1, $fargs );
433
+ $tail = $show_dots ? ' ...' : '';
434
+
435
+ // Read more button
436
+ if ( apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_enable', 1, $fargs[ 'content' ] ) ) {
437
+ $readmore_text = self::get_readmore_text( $fargs[ 'content' ] );
438
+ $btn_class = PT_CV_PREFIX . 'readmore ' . apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_class', 'btn btn-success', $fargs );
439
+ $readmore_btn = self::_field_href( $post, $readmore_text, $btn_class );
440
+ $tail .= apply_filters( PT_CV_PREFIX_ . 'field_content_readmore_seperated', '<br/>', $fargs );
441
+ }
442
+
443
+ // Get excerpt
444
+ if ( $length > 0 ) {
445
+ $GLOBALS[ 'cv_excerpt_type' ] = 'content';
446
+
447
+ $full_excerpt = apply_filters( PT_CV_PREFIX_ . 'field_content_excerpt', get_the_content( '' ), $fargs, $post );
448
+
449
+ if ( apply_filters( PT_CV_PREFIX_ . 'trim_excerpt', $GLOBALS[ 'cv_excerpt_type' ] == 'content' ) ) {
450
+ $excerpt = PT_CV_Functions::cv_trim_words( $full_excerpt, $length );
451
+ } else {
452
+ $excerpt = $full_excerpt;
453
+ }
454
+
455
+ // Append readmore button
456
+ $content = apply_filters( PT_CV_PREFIX_ . 'excerpt_html', ($show_dots ? rtrim( $excerpt, '.' ) : $excerpt) . $tail, $post ) . $readmore_btn;
457
+ } else {
458
+ // Display only readmore button if length <= 0
459
+ $content = $readmore_btn;
460
+ }
461
+
462
+ break;
463
+
464
+ case 'full':
465
+ ob_start();
466
+ the_content();
467
+ $content = ob_get_clean();
468
+ $content = apply_filters( PT_CV_PREFIX_ . 'field_content_full', $content, $fargs, $post );
469
+
470
+ if ( !empty( $fargs[ 'content' ][ 'skip-balance-tag' ] ) ) {
471
+ $balance_tags = false;
472
+ }
473
+
474
+ break;
475
+ }
476
+
477
+ $content = apply_filters( PT_CV_PREFIX_ . 'field_content_final', $content, $post );
478
+ $html = rtrim( $content, '.' ) ? sprintf( '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $content_class ), $balance_tags ? force_balance_tags( $content ) : $content ) : '';
479
+
480
+ return $html;
481
+ }
482
+
483
+ /**
484
+ * Output link to item
485
+ */
486
+ static function _field_href( $post, $content, $defined_class = '' ) {
487
+ $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
488
+ $oargs = isset( $dargs[ 'other-settings' ] ) ? $dargs[ 'other-settings' ] : array();
489
+
490
+ $open_in = isset( $oargs[ 'open-in' ] ) ? $oargs[ 'open-in' ] : '_blank';
491
+ $href = apply_filters( PT_CV_PREFIX_ . 'field_href', get_permalink( $post->ID ), $post );
492
+ $href_class = apply_filters( PT_CV_PREFIX_ . 'field_href_class', array( $open_in, $defined_class ), $oargs );
493
+ $custom_attr = apply_filters( PT_CV_PREFIX_ . 'field_href_attrs', array(), $open_in, $oargs );
494
+ $html = sprintf( '<a href="%s" class="%s" target="%s" %s>%s</a>', esc_url( $href ), esc_attr( implode( ' ', array_filter( $href_class ) ) ), esc_attr( $open_in ), cv_sanitize_html_data( implode( ' ', $custom_attr ) ), $content );
495
+
496
+ return apply_filters( PT_CV_PREFIX_ . 'link_html', $html, array( $post, $content, $defined_class ) );
497
+ }
498
+
499
+ /**
500
+ * HTML output of thumbnail field
501
+ *
502
+ * @param object $post The post object
503
+ * @param array $_fargs The settings of this field
504
+ *
505
+ * @return string
506
+ */
507
+ static function _field_thumbnail( $post, $_fargs ) {
508
+ $layout_format = $_fargs[ 'layout-format' ];
509
+
510
+ // Get thumbnail settings
511
+ $fargs = $_fargs[ 'thumbnail' ];
512
+
513
+ // Thumbnail class
514
+ $thumbnail_position = 'default';
515
+ $thumbnail_class = array();
516
+ $thumbnail_class[] = PT_CV_PREFIX . 'thumbnail';
517
+ $thumbnail_class[] = isset( $fargs[ 'style' ] ) ? $fargs[ 'style' ] : '';
518
+ if ( $layout_format === '2-col' ) {
519
+ $thumbnail_position = isset( $fargs[ 'position' ] ) ? $fargs[ 'position' ] : 'left';
520
+ $thumbnail_class[] = 'pull-' . $thumbnail_position;
521
+ }
522
+ $gargs = array(
523
+ 'class' => apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_class', implode( ' ', array_filter( $thumbnail_class ) ) ),
524
+ );
525
+
526
+ /**
527
+ * @since 1.7.5
528
+ * able to disable responsive image of WordPress 4.4
529
+ */
530
+ if ( PT_CV_Html::is_responsive_image_disabled() ) {
531
+ $gargs[ 'srcset' ] = 1;
532
+ }
533
+
534
+ // Get thumbnail dimensions
535
+ $dimensions = (array) apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_dimension_output', PT_CV_Functions::field_thumbnail_dimensions( $fargs ), $fargs );
536
+
537
+ // Check if has thumbnail ( has_post_thumbnail doesn't works )
538
+ $thumbnail_id = get_post_thumbnail_id( $post->ID );
539
+ $html = '';
540
+ if ( !empty( $thumbnail_id ) ) {
541
+ $thumbnail_size = count( $dimensions ) > 1 ? $dimensions : $dimensions[ 0 ];
542
+ $html = wp_get_attachment_image( (int) $thumbnail_id, $thumbnail_size, false, $gargs );
543
+ $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_image', $html, $post, $dimensions, $fargs );
544
+ }
545
+
546
+ // If no thumbnail
547
+ if ( empty( $html ) || apply_filters( PT_CV_PREFIX_ . 'force_replace_thumbnail', 0 ) ) {
548
+ $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_not_found', $html, $post, $dimensions, $gargs );
549
+ }
550
+
551
+ // Maybe add custom wrap for image
552
+ $html = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_image_html', $html );
553
+
554
+ return apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_nolink', false ) ? $html :
555
+ self::_field_href( $post, $html, implode( ' ', array( PT_CV_PREFIX . 'href-thumbnail', PT_CV_PREFIX . 'thumb-' . $thumbnail_position ) ) );
556
+ }
557
+
558
+ /**
559
+ * HTML output of meta fields group
560
+ *
561
+ * @param object $post The post object
562
+ * @param array $fargs The settings of this field
563
+ *
564
+ * @return string
565
+ */
566
+ static function _field_meta( $post, $fargs ) {
567
+ $html = array();
568
+
569
+ setup_postdata( $post );
570
+
571
+ foreach ( $fargs as $meta => $val ) {
572
+ if ( !$val ) {
573
+ continue;
574
+ }
575
+
576
+ switch ( $meta ) {
577
+ case 'date':
578
+ $date_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'entry-date', 'date' );
579
+ $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'date' );
580
+ $date_format = apply_filters( PT_CV_PREFIX_ . 'field_meta_date_format', get_option( 'date_format' ) );
581
+ $date = apply_filters( PT_CV_PREFIX_ . 'field_meta_date_final', mysql2date( $date_format, $post->post_date ), get_the_time( 'U' ) );
582
+
583
+ $html[ 'date' ] = sprintf( '<span class="%s">%s <time datetime="%s">%s</time></span>', esc_attr( $date_class ), $prefix_text, esc_attr( get_the_date( 'c' ) ), esc_html( $date ) );
584
+ break;
585
+
586
+ case 'taxonomy':
587
+ $term_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'terms', 'terms' );
588
+ $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'terms' );
589
+
590
+ $terms = PT_CV_Functions::post_terms( $post );
591
+ if ( !empty( $terms ) ) {
592
+ $term_html = sprintf( '<span class="%s">%s %s</span>', esc_attr( $term_class ), $prefix_text, $terms );
593
+ $html[ 'taxonomy' ] = apply_filters( PT_CV_PREFIX_ . 'field_term_html', $term_html, $terms );
594
+ }
595
+ break;
596
+
597
+ case 'comment':
598
+ if ( !post_password_required() && ( comments_open() || get_comments_number() ) ) :
599
+ $comment_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'comments-link', 'comment' );
600
+ $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'comment' );
601
+
602
+ ob_start();
603
+ comments_popup_link();
604
+ $comment_content = ob_get_clean();
605
+ $comment_content = apply_filters( PT_CV_PREFIX_ . 'comments_count', $comment_content );
606
+ $comment_html = sprintf( '<span class="%s">%s %s</span>', esc_attr( $comment_class ), $prefix_text, $comment_content );
607
+ $html[ 'comment' ] = apply_filters( PT_CV_PREFIX_ . 'field_comment_html', $comment_html, $post );
608
+ endif;
609
+ break;
610
+
611
+ case 'author':
612
+ $author_class = apply_filters( PT_CV_PREFIX_ . 'field_meta_class', 'author', 'author' );
613
+ $prefix_text = apply_filters( PT_CV_PREFIX_ . 'field_meta_prefix_text', '', 'author' );
614
+
615
+ $author_html = sprintf( '<span class="%s">%s <a href="%s" rel="author">%s</a></span>', esc_attr( $author_class ), $prefix_text, esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), get_the_author() );
616
+ $html[ 'author' ] = apply_filters( PT_CV_PREFIX_ . 'field_meta_author_html', $author_html, $post );
617
+ break;
618
+
619
+ default:
620
+ break;
621
+ }
622
+ }
623
+
624
+ // Merge fields, or let them as seperate items in array
625
+ $merge_fields = apply_filters( PT_CV_PREFIX_ . 'field_meta_merge_fields', true );
626
+
627
+ if ( $merge_fields ) {
628
+ $result = PT_CV_Html::_field_meta_wrap( $html );
629
+ } else {
630
+ $result = $html;
631
+ }
632
+
633
+ return $result;
634
+ }
635
+
636
+ /**
637
+ * Wrap meta fields in a wrapper
638
+ *
639
+ * @param array $meta_html Array of meta fields to wrapping
640
+ * @param string $seperator Seperator string when join meta fields
641
+ *
642
+ * @return string
643
+ */
644
+ static function _field_meta_wrap( $meta_html, $seperator = NULL ) {
645
+ if ( !$meta_html ) {
646
+ return '';
647
+ }
648
+
649
+ $seperator = isset( $seperator ) ? $seperator : apply_filters( PT_CV_PREFIX_ . 'field_meta_seperator', ' / ' );
650
+ $class = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_class', PT_CV_PREFIX . 'meta-fields' );
651
+ $tag = apply_filters( PT_CV_PREFIX_ . 'field_meta_fields_tag', 'div' );
652
+ $wrapper = sprintf( '<%1$s class="%2$s">%3$s</%1$s>', tag_escape( $tag ), esc_attr( $class ), '%s' );
653
+ $meta_html = implode( $seperator, (array) apply_filters( PT_CV_PREFIX_ . 'meta_field_html', $meta_html ) );
654
+ $html = !empty( $meta_html ) ? sprintf( $wrapper, $meta_html ) : '';
655
+
656
+ return $html;
657
+ }
658
+
659
+ /**
660
+ * Output pagination
661
+ *
662
+ * @param type $max_num_pages The total of pages
663
+ * @param type $current_page The current pages
664
+ * @param string $sid View ID
665
+ *
666
+ * @return type
667
+ */
668
+ static function pagination_output( $max_num_pages, $current_page, $sid ) {
669
+ if ( !$max_num_pages ) {
670
+ return '';
671
+ }
672
+
673
+ global $cv_unique_id;
674
+ $dargs = PT_CV_Functions::get_global_variable( 'dargs' );
675
+ $pagination_btn = '';
676
+ $type = isset( $dargs[ 'pagination-settings' ][ 'type' ] ) ? $dargs[ 'pagination-settings' ][ 'type' ] : 'ajax';
677
+ $style = isset( $dargs[ 'pagination-settings' ][ 'style' ] ) ? $dargs[ 'pagination-settings' ][ 'style' ] : 'regular';
678
+
679
+ if ( $type == 'normal' || $style == 'regular' ) {
680
+ $ul_class = implode( ' ', array( PT_CV_PREFIX . 'pagination', PT_CV_PREFIX . $type, 'pagination' ) );
681
+ $pagination_btn = sprintf( '<ul class="%s" data-totalpages="%s" data-currentpage="%s" data-sid="%s" data-unid="%s">%s</ul>', $ul_class, esc_attr( $max_num_pages ), esc_attr( $current_page ), esc_attr( $sid ), esc_attr( $cv_unique_id ), PT_CV_Functions::pagination_links( $max_num_pages, $current_page ) );
682
+ } else {
683
+ $pagination_btn = apply_filters( PT_CV_PREFIX_ . 'btn_more_html', $pagination_btn, $max_num_pages, $sid );
684
+ }
685
+ $pagination_btn .= self::html_loading_img( 15, PT_CV_PREFIX . 'spinner' );
686
+
687
+ $class = esc_attr( implode( ' ', array( apply_filters( PT_CV_PREFIX_ . 'pagination_class', '' ), PT_CV_PREFIX . 'pagination-wrapper' ) ) );
688
+ $output = sprintf( '<div class="%s">%s</div>', $class, $pagination_btn );
689
+
690
+ return apply_filters( PT_CV_PREFIX_ . 'pagination_output', $output );
691
+ }
692
+
693
+ static function assets_of_view_types() {
694
+ global $pt_cv_glb, $pt_cv_id;
695
+
696
+ // If already processed | have no View on this page -> return
697
+ if ( !empty( $pt_cv_glb[ $pt_cv_id ][ 'applied_assets' ] ) || !$pt_cv_id ) {
698
+ return;
699
+ }
700
+ // Mark as processed
701
+ $pt_cv_glb[ $pt_cv_id ][ 'applied_assets' ] = 1;
702
+
703
+ // Link to external files
704
+ $assets_files = apply_filters( PT_CV_PREFIX_ . 'assets_files', array() );
705
+
706
+ if ( is_admin() ) {
707
+ // Include assets file in Preview
708
+ foreach ( $assets_files as $type => $srcs ) {
709
+ foreach ( $srcs as $src ) {
710
+ PT_CV_Asset::include_inline( 'preview', $src, $type );
711
+ }
712
+ }
713
+ } else {
714
+ // Enqueue merged asset contents
715
+ foreach ( $assets_files as $type => $srcs ) {
716
+ foreach ( $srcs as $src ) {
717
+ $type = ( $type == 'js' ) ? 'script' : 'style';
718
+ $function = "wp_enqueue_{$type}";
719
+
720
+ if ( function_exists( $function ) ) {
721
+ $function( PT_CV_PREFIX . $type, $src );
722
+ }
723
+ }
724
+ }
725
+ }
726
+
727
+ // Output custom inline style for Views
728
+ if ( apply_filters( PT_CV_PREFIX_ . 'output_view_style', 1 ) ) {
729
+ do_action( PT_CV_PREFIX_ . 'print_view_style' );
730
+ }
731
+ }
732
+
733
+ /**
734
+ * Scripts for Preview & WP frontend
735
+ */
736
+ static function frontend_scripts() {
737
+ PT_CV_Asset::enqueue(
738
+ 'content-views', 'script', array(
739
+ 'src' => plugins_url( 'public/assets/js/cv.js', PT_CV_FILE ),
740
+ 'deps' => array( 'jquery' ),
741
+ )
742
+ );
743
+
744
+ PT_CV_Asset::localize_script(
745
+ 'content-views', PT_CV_PREFIX_UPPER . 'PUBLIC', array(
746
+ '_prefix' => PT_CV_PREFIX,
747
+ 'page_to_show' => apply_filters( PT_CV_PREFIX_ . 'pages_to_show', 5 ),
748
+ '_nonce' => wp_create_nonce( PT_CV_PREFIX_ . 'ajax_nonce' ),
749
+ 'is_admin' => is_admin(),
750
+ 'is_mobile' => apply_filters( PT_CV_PREFIX_ . 'is_mobile', wp_is_mobile() ),
751
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
752
+ 'lang' => PT_CV_Functions::get_language(), #Get current language of site
753
+ 'loading_image_src' => PT_CV_Html::loading_img_src(),
754
+ ) + apply_filters( PT_CV_PREFIX_ . 'public_localize_script_extra', array() )
755
+ );
756
+
757
+ PT_CV_Asset::localize_script(
758
+ array( 'content-views', 'bootstrap-admin' ), PT_CV_PREFIX_UPPER . 'PAGINATION', apply_filters( PT_CV_PREFIX_ . 'pagination_text', array(
759
+ 'links' => PT_CV_Functions::get_pagination_url(),
760
+ 'first' => '&laquo;',
761
+ 'prev' => '&lsaquo;',
762
+ 'next' => '&rsaquo;',
763
+ 'last' => '&raquo;',
764
+ 'goto_first' => __( 'Go to first page', 'content-views-query-and-display-post-page' ),
765
+ 'goto_prev' => __( 'Go to previous page', 'content-views-query-and-display-post-page' ),
766
+ 'goto_next' => __( 'Go to next page', 'content-views-query-and-display-post-page' ),
767
+ 'goto_last' => __( 'Go to last page', 'content-views-query-and-display-post-page' ),
768
+ 'current_page' => __( 'Current page is', 'content-views-query-and-display-post-page' ),
769
+ 'goto_page' => __( 'Go to page', 'content-views-query-and-display-post-page' ),
770
+ ) )
771
+ );
772
+
773
+ // Load Pro scripts
774
+ do_action( PT_CV_PREFIX_ . 'frontend_scripts' );
775
+ }
776
+
777
+ /**
778
+ * Styles for Preview & WP frontend
779
+ *
780
+ * @global bool $is_IE
781
+ */
782
+ static function frontend_styles() {
783
+ PT_CV_Asset::enqueue(
784
+ 'public', 'style', array(
785
+ 'src' => plugins_url( 'public/assets/css/' . (!cv_is_damaged_style() ? 'cv.css' : 'cv.im.css'), PT_CV_FILE ),
786
+ )
787
+ );
788
+
789
+ // Fix bootstrap error in IE
790
+ global $is_IE;
791
+ if ( $is_IE ) {
792
+ PT_CV_Asset::enqueue(
793
+ 'html5shiv', 'script', array(
794
+ 'src' => plugins_url( 'assets/ie-fix/html5shiv.min.js', PT_CV_FILE ),
795
+ 'ver' => '3.7.0',
796
+ )
797
+ );
798
+ PT_CV_Asset::enqueue(
799
+ 'respond', 'script', array(
800
+ 'src' => plugins_url( 'assets/ie-fix/respond.js', PT_CV_FILE ),
801
+ 'ver' => '1.4.2',
802
+ )
803
+ );
804
+ }
805
+
806
+ // Load Pro styles
807
+ do_action( PT_CV_PREFIX_ . 'frontend_styles' );
808
+ }
809
+
810
+ /**
811
+ * Print inline js code
812
+ *
813
+ * @param string $js The js code
814
+ *
815
+ * @return string
816
+ */
817
+ static function inline_script( $js, $wrap = true, $prefix = 'inline' ) {
818
+ // Generate random id for script tag
819
+ $random_id = PT_CV_Functions::string_random();
820
+
821
+ ob_start();
822
+ ?>
823
+ <script type="text/javascript" id="<?php echo esc_attr( PT_CV_PREFIX . $prefix . '-script-' . $random_id ); ?>">
824
+ <?php
825
+ $newline = "\n";
826
+ $format = $wrap ? "(function($){\$(function(){ {$newline}%s{$newline} });}(jQuery));" : '%s';
827
+ printf( $format, $js );
828
+ ?>
829
+ </script>
830
+ <?php
831
+ return ob_get_clean();
832
+ }
833
+
834
+ /**
835
+ * Print inline css code
836
+ *
837
+ * @param string $css The css code
838
+ *
839
+ * @return string
840
+ */
841
+ static function inline_style( $css, $prefix = 'inline' ) {
842
+ // Generate random id for style tag
843
+ $random_id = PT_CV_Functions::string_random();
844
+
845
+ ob_start();
846
+ ?>
847
+ <style type="text/css" id="<?php echo esc_attr( PT_CV_PREFIX . $prefix . '-style-' . $random_id ); ?>"><?php echo '' . $css; ?></style>
848
+ <?php
849
+ return ob_get_clean();
850
+ }
851
+
852
+ static function is_responsive_image_disabled() {
853
+ return apply_filters( PT_CV_PREFIX_ . 'disable_responsive_image', PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-thumbnail-nowprpi' ) );
854
+ }
855
+
856
+ /**
857
+ * Return Readmore text, able to get translation from CV, WP
858
+ *
859
+ * @since 1.9.1
860
+ * @param array $args
861
+ * @return string
862
+ */
863
+ static function get_readmore_text( $args ) {
864
+ $result = '';
865
+ if ( !empty( $args[ 'readmore-text' ] ) ) {
866
+ $result = stripslashes( cv_sanitize_tag_content( $args[ 'readmore-text' ] ) );
867
+ // CV translation
868
+ if ( $result === 'Read More' ) {
869
+ $result = __( 'Read More', 'content-views-query-and-display-post-page' );
870
+ }
871
+ } else {
872
+ // WP translation
873
+ $result = ucwords( rtrim( __( 'Read more...' ), '.' ) );
874
+ }
875
+ return $result;
876
+ }
877
+
878
+ }
879
+
880
  }
includes/settings.php CHANGED
@@ -1,932 +1,972 @@
1
- <?php
2
- /**
3
- * Define settings for options
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- if ( !class_exists( 'PT_CV_Settings' ) ) {
16
-
17
- /**
18
- * @name PT_CV_Settings
19
- * @todo Define settings for options
20
- */
21
- class PT_CV_Settings {
22
-
23
- /**
24
- * Get collection : Taxonomies => Terms
25
- *
26
- * @param string $taxonomies Array of taxonomies
27
- * @param array $args Array of query parameters
28
- */
29
- static function terms_of_taxonomies( $taxonomies = array(), $args = array() ) {
30
- $terms_of_taxonomies = $result = array();
31
- // Get taxonomies
32
- $taxonomies = PT_CV_Values::taxonomy_list();
33
- // Get slug list of taxonomies
34
- $taxonomies_slug = array_keys( $taxonomies );
35
-
36
- foreach ( $taxonomies_slug as $taxonomy_slug ) {
37
- PT_CV_Values::term_of_taxonomy( $taxonomy_slug, $terms_of_taxonomies, $args );
38
- }
39
-
40
- foreach ( $terms_of_taxonomies as $taxonomy_slug => $terms ) {
41
-
42
- $result[ $taxonomy_slug ] = apply_filters( PT_CV_PREFIX_ . 'taxonomy_settings', array(
43
- // Select term to filter
44
- array(
45
- 'label' => array(
46
- 'text' => __( 'Select terms', 'content-views-query-and-display-post-page' ),
47
- ),
48
- 'params' => array(
49
- array(
50
- 'type' => 'select',
51
- 'name' => $taxonomy_slug . '-terms[]',
52
- 'options' => $terms,
53
- 'std' => '',
54
- 'class' => apply_filters( PT_CV_PREFIX_ . 'select_term_class', 'select2' ),
55
- 'multiple' => '1',
56
- ),
57
- ),
58
- ),
59
- //Operator
60
- array(
61
- 'label' => array(
62
- 'text' => __( 'Operator', 'content-views-query-and-display-post-page' ),
63
- ),
64
- 'params' => array(
65
- array(
66
- 'type' => 'select',
67
- 'name' => $taxonomy_slug . '-operator',
68
- 'options' => PT_CV_Values::taxonomy_operators(),
69
- 'std' => 'IN',
70
- ),
71
- ),
72
- 'dependence' => array( 'taxonomy-term-info', 'as_output', '!=' ),
73
- ),
74
- ), $taxonomy_slug );
75
- }
76
-
77
- return $result;
78
- }
79
-
80
- /**
81
- * Order by options
82
- *
83
- * @return array
84
- */
85
- static function orderby() {
86
- $result = array();
87
-
88
- $result[ 'common' ] = array(
89
- // Order By
90
- array(
91
- 'label' => array(
92
- 'text' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
93
- ),
94
- 'params' => array(
95
- array(
96
- 'type' => 'select',
97
- 'name' => 'orderby',
98
- 'options' => PT_CV_Values::post_regular_orderby(),
99
- 'std' => '',
100
- ),
101
- ),
102
- ),
103
- // Upgrade to Pro: More sort by options
104
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Sort by drag & drop, custom field, slug, random order, menu order', 'content-views-query-and-display-post-page' ) ) : '',
105
- // Order
106
- apply_filters( PT_CV_PREFIX_ . 'orders', array(
107
- 'label' => array(
108
- 'text' => __( 'Order' ),
109
- ),
110
- 'params' => array(
111
- array(
112
- 'type' => 'radio',
113
- 'name' => 'order',
114
- 'options' => PT_CV_Values::orders(),
115
- 'std' => 'asc',
116
- ),
117
- ),
118
- ) ),
119
- );
120
-
121
- $result = apply_filters( PT_CV_PREFIX_ . 'orderby', $result );
122
-
123
- return $result;
124
- }
125
-
126
- /**
127
- * Pagination settings
128
- *
129
- * @return array
130
- */
131
- static function settings_pagination() {
132
-
133
- $prefix = 'pagination-';
134
-
135
- $result = array(
136
- // Pagination
137
- array(
138
- 'label' => array(
139
- 'text' => '',
140
- ),
141
- 'extra_setting' => array(
142
- 'params' => array(
143
- 'width' => 12,
144
- ),
145
- ),
146
- 'params' => array(
147
- array(
148
- 'type' => 'checkbox',
149
- 'name' => 'enable-pagination',
150
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Enable' ) ),
151
- 'std' => '',
152
- ),
153
- ),
154
- ),
155
- // Items per page
156
- array(
157
- 'label' => array(
158
- 'text' => __( 'Items per page', 'content-views-query-and-display-post-page' ),
159
- ),
160
- 'extra_setting' => array(
161
- 'params' => array(
162
- 'wrap-class' => PT_CV_PREFIX . 'w200',
163
- ),
164
- ),
165
- 'params' => array(
166
- array(
167
- 'type' => 'number',
168
- 'name' => $prefix . 'items-per-page',
169
- 'std' => '5',
170
- 'placeholder' => 'for example: 5',
171
- 'desc' => sprintf( __( 'If value of the %s setting is not empty, this value should be smaller than that', 'content-views-query-and-display-post-page' ), sprintf( '<code>%s</code>', __( 'Limit', 'content-views-query-and-display-post-page' ) ) ),
172
- ),
173
- ),
174
- 'dependence' => array( 'enable-pagination', 'yes' ),
175
- ),
176
- // Pagination Type
177
- array(
178
- 'label' => array(
179
- 'text' => __( 'Type' ),
180
- ),
181
- 'params' => array(
182
- array(
183
- 'type' => 'radio',
184
- 'name' => $prefix . 'type',
185
- 'options' => PT_CV_Values::pagination_types(),
186
- 'std' => 'ajax',
187
- ),
188
- ),
189
- 'dependence' => array( 'enable-pagination', 'yes' ),
190
- ),
191
- // Pagination Style
192
- array(
193
- 'label' => array(
194
- 'text' => '',
195
- ),
196
- 'extra_setting' => array(
197
- 'params' => array(
198
- 'width' => 12,
199
- ),
200
- ),
201
- 'params' => array(
202
- array(
203
- 'type' => 'group',
204
- 'params' => array(
205
- array(
206
- 'label' => array(
207
- 'text' => __( 'Style', 'content-views-query-and-display-post-page' ),
208
- ),
209
- 'params' => array(
210
- array(
211
- 'type' => 'radio',
212
- 'name' => $prefix . 'style',
213
- 'options' => PT_CV_Values::pagination_styles(),
214
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::pagination_styles() ),
215
- ),
216
- ),
217
- 'dependence' => array( $prefix . 'type', 'normal', '!=' ),
218
- ),
219
- ),
220
- ),
221
- ),
222
- 'dependence' => array( 'enable-pagination', 'yes' ),
223
- ),
224
- );
225
-
226
- $result = apply_filters( PT_CV_PREFIX_ . 'settings_pagination', $result, $prefix );
227
-
228
- return $result;
229
- }
230
-
231
- /**
232
- * Other settings for All View Type
233
- */
234
- static function settings_other() {
235
-
236
- $prefix = 'other-';
237
-
238
- $result = array(
239
- // Open an item in
240
- array(
241
- 'label' => array(
242
- 'text' => __( 'Open item in', 'content-views-query-and-display-post-page' ),
243
- ),
244
- 'params' => array(
245
- array(
246
- 'type' => 'radio',
247
- 'name' => $prefix . 'open-in',
248
- 'options' => PT_CV_Values::open_in(),
249
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::open_in() ),
250
- 'desc' => __( 'How to open item when click on Title, Thumbnail, Read-more button', 'content-views-query-and-display-post-page' ),
251
- ),
252
- ),
253
- ),
254
- );
255
-
256
- $result = apply_filters( PT_CV_PREFIX_ . 'settings_other', $result, $prefix );
257
-
258
- return $result;
259
- }
260
-
261
- /**
262
- * Fields settings
263
- */
264
- static function field_settings() {
265
-
266
- $prefix = 'field-';
267
- $prefix2 = 'show-' . $prefix;
268
-
269
- $result = array(
270
- // Fields display
271
- array(
272
- 'label' => array(
273
- 'text' => '',
274
- ),
275
- 'extra_setting' => array(
276
- 'params' => array(
277
- 'wrap-class' => PT_CV_Html::html_group_class(),
278
- 'width' => 12,
279
- ),
280
- ),
281
- 'params' => array(
282
- array(
283
- 'type' => 'group',
284
- 'params' => PT_CV_Settings::field_display_settings(),
285
- ),
286
- ),
287
- ),
288
- // Upgrade to Pro: Drag & Drop
289
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Show Custom Fields, show Title above Thumbnail...', 'content-views-query-and-display-post-page' ), 12, 'margin-top: -15px; margin-bottom: 5px; width: 100%;' ) : '',
290
- // Title settings
291
- get_option( 'pt_cv_version_pro' ) ? apply_filters( PT_CV_PREFIX_ . 'settings_title_display', array(), $prefix, $prefix2 ) :
292
- array(
293
- 'label' => array(
294
- 'text' => __( 'Title' ),
295
- ),
296
- 'extra_setting' => array(
297
- 'params' => array(
298
- 'group-class' => PT_CV_PREFIX . 'field-setting',
299
- 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'title-setting',
300
- ),
301
- ),
302
- 'params' => array(
303
- array(
304
- 'type' => 'group',
305
- 'params' => array(
306
- PT_CV_Settings::title_heading_tag( $prefix )
307
- ),
308
- ),
309
- ),
310
- 'dependence' => array( $prefix2 . 'title', 'yes' ),
311
- )
312
- ,
313
- // Thumbnail settings
314
- array(
315
- 'label' => array(
316
- 'text' => __( 'Thumbnail' ),
317
- ),
318
- 'extra_setting' => array(
319
- 'params' => array(
320
- 'group-class' => PT_CV_PREFIX . 'field-setting',
321
- 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'thumbnail-setting' . ' ' . PT_CV_PREFIX . 'w50',
322
- ),
323
- ),
324
- 'params' => array(
325
- array(
326
- 'type' => 'group',
327
- 'params' => PT_CV_Settings::field_thumbnail_settings( $prefix ),
328
- ),
329
- ),
330
- 'dependence' => array( $prefix2 . 'thumbnail', 'yes' ),
331
- ),
332
- // Content settings
333
- array(
334
- 'label' => array(
335
- 'text' => __( 'Content' ),
336
- ),
337
- 'extra_setting' => array(
338
- 'params' => array(
339
- 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'content-setting',
340
- ),
341
- ),
342
- 'params' => array(
343
- array(
344
- 'type' => 'radio',
345
- 'name' => $prefix . 'content-show',
346
- 'options' => array(
347
- 'full' => __( 'Show Full Content', 'content-views-query-and-display-post-page' ),
348
- 'excerpt' => __( 'Show Excerpt', 'content-views-query-and-display-post-page' ),
349
- ),
350
- 'std' => 'excerpt',
351
- ),
352
- ),
353
- 'dependence' => array( $prefix2 . 'content', 'yes' ),
354
- ),
355
- // Excerpt settings
356
- array(
357
- 'label' => array(
358
- 'text' => '',
359
- ),
360
- 'extra_setting' => array(
361
- 'params' => array(
362
- 'width' => 12,
363
- 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'excerpt-setting',
364
- 'wrap-id' => PT_CV_Html::html_group_id( 'excerpt-settings' ),
365
- ),
366
- ),
367
- 'params' => array(
368
- array(
369
- 'type' => 'group',
370
- 'params' => array(
371
- array(
372
- 'label' => array(
373
- 'text' => '',
374
- ),
375
- 'extra_setting' => array(
376
- 'params' => array(
377
- 'width' => 12,
378
- ),
379
- ),
380
- 'params' => array(
381
- array(
382
- 'type' => 'group',
383
- 'params' => apply_filters(
384
- PT_CV_PREFIX_ . 'excerpt_settings', array(
385
- // Excerpt length
386
- array(
387
- 'label' => array(
388
- 'text' => __( 'Excerpt settings', 'content-views-query-and-display-post-page' ),
389
- ),
390
- 'params' => array(
391
- array(
392
- 'type' => 'number',
393
- 'name' => $prefix . 'excerpt-length',
394
- 'std' => '20',
395
- 'placeholder' => 'for example: 20',
396
- 'append_text' => 'words',
397
- 'desc' => __( 'Generate excerpt by selecting the first X words of post content', 'content-views-query-and-display-post-page' ),
398
- ),
399
- ),
400
- ),
401
- // Upgrade to Pro: Manual excerpt
402
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Use manual excerpt (in the Excerpt field under the post edit box)', 'content-views-query-and-display-post-page' ) ) : '',
403
- // Allow HTML tags
404
- array(
405
- 'label' => array(
406
- 'text' => '',
407
- ),
408
- 'params' => array(
409
- array(
410
- 'type' => 'checkbox',
411
- 'name' => $prefix . 'excerpt-allow_html',
412
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Allow HTML tags (a, br, strong, em, strike, i, ul, ol, li) in excerpt', 'content-views-query-and-display-post-page' ) ),
413
- 'std' => '',
414
- ),
415
- ),
416
- ),
417
- // Read more text
418
- !get_option( 'pt_cv_version_pro' ) ? array(
419
- 'label' => array(
420
- 'text' => __( 'Read More text', 'content-views-query-and-display-post-page' ),
421
- ),
422
- 'params' => array(
423
- array(
424
- 'type' => 'text',
425
- 'name' => $prefix . 'excerpt-readmore-text',
426
- 'std' => ucwords( rtrim( __( 'Read more...' ), '.' ) ),
427
- 'desc' => '<span class="alert-warning">' . sprintf( __( 'To change color of this button, <a href="%s" target="_blank"> please check this document </a>', 'content-views-query-and-display-post-page' ), 'http://docs.contentviewspro.com/change-color-read-more-button/?utm_source=client&utm_medium=read-more-color&utm_campaign=gopro' ) . '</span>',
428
- ),
429
- ),
430
- ) : '',
431
- ), $prefix . 'excerpt-'
432
- ),
433
- ),
434
- ),
435
- 'dependence' => array( $prefix . 'content-show', 'excerpt' ),
436
- ),
437
- ),
438
- ),
439
- ),
440
- 'dependence' => array( $prefix2 . 'content', 'yes' ),
441
- ),
442
- // Meta fields settings
443
- array(
444
- 'label' => array(
445
- 'text' => __( 'Meta fields', 'content-views-query-and-display-post-page' ),
446
- ),
447
- 'extra_setting' => array(
448
- 'params' => array(
449
- 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'metafield-setting',
450
- 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'meta-fields-settings',
451
- ),
452
- ),
453
- 'params' => array(
454
- array(
455
- 'type' => 'group',
456
- 'params' => PT_CV_Settings::field_meta_fields( 'meta-fields-' ),
457
- 'desc' => apply_filters( PT_CV_PREFIX_ . 'settings_sort_text', '' ),
458
- ),
459
- ),
460
- 'dependence' => array( $prefix2 . 'meta-fields', 'yes' ),
461
- ),
462
- // Taxonomies settings
463
- apply_filters( PT_CV_PREFIX_ . 'settings_taxonomies_display', array(), 'meta-fields-' ),
464
- );
465
-
466
- $result = apply_filters( PT_CV_PREFIX_ . 'field_settings', $result, $prefix2 );
467
-
468
- return $result;
469
- }
470
-
471
- /**
472
- * Fields display
473
- *
474
- * @return array
475
- */
476
- static function field_display_settings() {
477
-
478
- $field_display_settings = array(
479
- array(
480
- 'label' => array(
481
- 'text' => '',
482
- ),
483
- 'extra_setting' => array(
484
- 'params' => array(
485
- 'width' => 12,
486
- 'wrap-class' => PT_CV_PREFIX . 'field-display',
487
- ),
488
- ),
489
- 'params' => array(
490
- array(
491
- 'type' => 'group',
492
- 'params' => PT_CV_Settings::field_display(),
493
- 'desc' => apply_filters( PT_CV_PREFIX_ . 'settings_sort_text', '' ),
494
- ),
495
- ),
496
- ),
497
- );
498
-
499
- $result = apply_filters( PT_CV_PREFIX_ . 'field_display_settings', $field_display_settings );
500
-
501
- return $result;
502
- }
503
-
504
- /**
505
- * Options to check/uncheck to display fields
506
- *
507
- * @return array
508
- */
509
- static function field_display() {
510
-
511
- $prefix = 'show-field-';
512
-
513
- $result = array(
514
- // Thumbnail position
515
- array(
516
- 'label' => array(
517
- 'text' => __( 'Thumbnail position', 'content-views-query-and-display-post-page' ),
518
- ),
519
- 'extra_setting' => array(
520
- 'params' => array(
521
- 'group-class' => PT_CV_PREFIX . 'thumb-position',
522
- 'wrap-class' => PT_CV_PREFIX . 'w200',
523
- ),
524
- ),
525
- 'params' => array(
526
- array(
527
- 'type' => 'select',
528
- 'name' => 'field-' . 'thumbnail-position',
529
- 'options' => PT_CV_Values::thumbnail_position(),
530
- 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::thumbnail_position() ),
531
- ),
532
- ),
533
- 'dependence' => array( 'layout-format', '2-col' ),
534
- ),
535
- // Show Thumbnail
536
- array(
537
- 'label' => array(
538
- 'text' => '',
539
- ),
540
- 'extra_setting' => array(
541
- 'params' => array(
542
- 'width' => 12,
543
- ),
544
- ),
545
- 'params' => array(
546
- array(
547
- 'type' => 'checkbox',
548
- 'name' => $prefix . 'thumbnail',
549
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Thumbnail', 'content-views-query-and-display-post-page' ) ),
550
- 'std' => 'yes',
551
- ),
552
- ),
553
- ),
554
- // Show Title
555
- array(
556
- 'label' => array(
557
- 'text' => '',
558
- ),
559
- 'extra_setting' => array(
560
- 'params' => array(
561
- 'width' => 12,
562
- ),
563
- ),
564
- 'params' => array(
565
- array(
566
- 'type' => 'checkbox',
567
- 'name' => $prefix . 'title',
568
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Title', 'content-views-query-and-display-post-page' ) ),
569
- 'std' => 'yes',
570
- ),
571
- ),
572
- ),
573
- // Show Content
574
- array(
575
- 'label' => array(
576
- 'text' => '',
577
- ),
578
- 'extra_setting' => array(
579
- 'params' => array(
580
- 'width' => 12,
581
- ),
582
- ),
583
- 'params' => array(
584
- array(
585
- 'type' => 'checkbox',
586
- 'name' => $prefix . 'content',
587
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Content', 'content-views-query-and-display-post-page' ) ),
588
- 'std' => 'yes',
589
- ),
590
- ),
591
- ),
592
- // Show Meta fields
593
- array(
594
- 'label' => array(
595
- 'text' => '',
596
- ),
597
- 'extra_setting' => array(
598
- 'params' => array(
599
- 'width' => 12,
600
- ),
601
- ),
602
- 'params' => array(
603
- array(
604
- 'type' => 'checkbox',
605
- 'name' => $prefix . 'meta-fields',
606
- 'options' => PT_CV_Values::yes_no( 'yes', sprintf( '%s (%s, %s, %s, %s)', __( 'Show Meta Fields', 'content-views-query-and-display-post-page' ), __( 'Taxonomy', 'content-views-query-and-display-post-page' ), __( 'Author' ), __( 'Date' ), __( 'Comment' ) ) ),
607
- 'std' => '',
608
- ),
609
- ),
610
- ),
611
- );
612
-
613
- // Add/remove params
614
- $result = apply_filters( PT_CV_PREFIX_ . 'field_display', $result, $prefix );
615
-
616
- // Sort array of params by saved order
617
- $result = apply_filters( PT_CV_PREFIX_ . 'settings_sort', $result, PT_CV_PREFIX . $prefix );
618
-
619
- return $result;
620
- }
621
-
622
- /**
623
- * Setting options for Field = Thumbnail
624
- */
625
- static function field_thumbnail_settings( $prefix ) {
626
-
627
- $result = array(
628
- // Size
629
- array(
630
- 'label' => array(
631
- 'text' => __( 'Size' ),
632
- ),
633
- 'params' => array(
634
- array(
635
- 'type' => 'select',
636
- 'name' => $prefix . 'thumbnail-size',
637
- 'options' => PT_CV_Values::field_thumbnail_sizes(),
638
- 'std' => 'medium',
639
- ),
640
- ),
641
- ),
642
- // Disable WP 4.4 responsive image
643
- !PT_CV_Functions::wp_version_compare( '4.4' ) ? '' :
644
- 'disable-wp44-resimg' => array(
645
- 'label' => array(
646
- 'text' => '',
647
- ),
648
- 'params' => array(
649
- array(
650
- 'type' => 'checkbox',
651
- 'name' => $prefix . 'thumbnail-nowprpi',
652
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Disable responsive image of WordPress', 'content-views-query-and-display-post-page' ) ),
653
- 'std' => '',
654
- 'desc' => __( 'Check this option if thumbnail looks blurry', 'content-views-query-and-display-post-page' ),
655
- ),
656
- ),
657
- ),
658
- // Upgrade to Pro: Show image/video in content as thumbnail
659
- !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( sprintf( __( 'In this lite version, thumbnail is only shown if the post has %s.<br>In the Pro version, you can show the first image in post as thumbnail, without having to set a featured image', 'content-views-query-and-display-post-page' ), sprintf( '<a target="_blank" href="https://codex.wordpress.org/Post_Thumbnails">%s</a>', __( 'Featured Image' ) ) ), 12, null, true ) : '',
660
- );
661
-
662
- $result = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_settings', $result, $prefix );
663
-
664
- return $result;
665
- }
666
-
667
- /**
668
- * Show settings of other fields
669
- */
670
- static function field_meta_fields( $prefix ) {
671
-
672
- $result = array(
673
- // Date
674
- array(
675
- 'label' => array(
676
- 'text' => '',
677
- ),
678
- 'extra_setting' => array(
679
- 'params' => array(
680
- 'width' => 12,
681
- ),
682
- ),
683
- 'params' => array(
684
- array(
685
- 'type' => 'checkbox',
686
- 'name' => $prefix . 'date',
687
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Date', 'content-views-query-and-display-post-page' ) ),
688
- 'std' => 'yes',
689
- ),
690
- ),
691
- ),
692
- // Author
693
- array(
694
- 'label' => array(
695
- 'text' => '',
696
- ),
697
- 'extra_setting' => array(
698
- 'params' => array(
699
- 'width' => 12,
700
- ),
701
- ),
702
- 'params' => array(
703
- array(
704
- 'type' => 'checkbox',
705
- 'name' => $prefix . 'author',
706
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Author', 'content-views-query-and-display-post-page' ) ),
707
- 'std' => '',
708
- ),
709
- ),
710
- ),
711
- // Taxonomy
712
- array(
713
- 'label' => array(
714
- 'text' => '',
715
- ),
716
- 'extra_setting' => array(
717
- 'params' => array(
718
- 'width' => 12,
719
- ),
720
- ),
721
- 'params' => array(
722
- array(
723
- 'type' => 'checkbox',
724
- 'name' => $prefix . 'taxonomy',
725
- 'options' => PT_CV_Values::yes_no( 'yes', sprintf( __( 'Show Taxonomies (%s, %s...)', 'content-views-query-and-display-post-page' ), __( 'Categories' ), __( 'Tags' ) ) ),
726
- 'std' => 'yes',
727
- ),
728
- ),
729
- ),
730
- // Comment
731
- array(
732
- 'label' => array(
733
- 'text' => '',
734
- ),
735
- 'extra_setting' => array(
736
- 'params' => array(
737
- 'width' => 12,
738
- ),
739
- ),
740
- 'params' => array(
741
- array(
742
- 'type' => 'checkbox',
743
- 'name' => $prefix . 'comment',
744
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Comment Count', 'content-views-query-and-display-post-page' ) ),
745
- 'std' => '',
746
- ),
747
- ),
748
- ),
749
- );
750
-
751
- // Sort array of params by saved order
752
- $result = apply_filters( PT_CV_PREFIX_ . 'settings_sort', $result, PT_CV_PREFIX . $prefix );
753
-
754
- return $result;
755
- }
756
-
757
- /**
758
- * Settings of View Type = Grid
759
- *
760
- * @return array
761
- */
762
- static function view_type_settings_grid() {
763
-
764
- $prefix = 'grid-';
765
-
766
- $result = array(
767
- // Number of columns
768
- array(
769
- 'label' => array(
770
- 'text' => __( 'Items per row', 'content-views-query-and-display-post-page' ),
771
- ),
772
- 'params' => array(
773
- array(
774
- 'type' => 'number',
775
- 'name' => $prefix . 'number-columns',
776
- 'std' => '2',
777
- 'append_text' => '1 &rarr; 12',
778
- ),
779
- ),
780
- 'dependence' => array( 'view-type', 'grid' ),
781
- ),
782
- );
783
-
784
- $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_grid', $result );
785
-
786
- return $result;
787
- }
788
-
789
- /**
790
- * Settings of View Type = Collapsible
791
- *
792
- * @return array
793
- */
794
- static function view_type_settings_collapsible() {
795
- $prefix = 'collapsible-';
796
- $result = array(
797
- array(
798
- 'label' => array(
799
- 'text' => '',
800
- ),
801
- 'extra_setting' => array(
802
- 'params' => array(
803
- 'width' => 12,
804
- ),
805
- ),
806
- 'params' => array(
807
- array(
808
- 'type' => 'checkbox',
809
- 'name' => $prefix . 'open-first-item',
810
- 'options' => PT_CV_Values::yes_no( 'yes', __( 'Open the first item by default', 'content-views-query-and-display-post-page' ) ),
811
- 'std' => 'yes',
812
- ),
813
- ),
814
- ),
815
- );
816
-
817
- $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_collapsible_184', $result );
818
-
819
- return $result;
820
- }
821
-
822
- /**
823
- * Settings of View Type = Scrollable
824
- *
825
- * @return array
826
- */
827
- static function view_type_settings_scrollable() {
828
-
829
- $prefix = 'scrollable-';
830
-
831
- $result = array(
832
- PT_CV_Settings::setting_no_option(),
833
- );
834
-
835
- $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_scrollable', $result );
836
-
837
- return $result;
838
- }
839
-
840
- /**
841
- * Setting with no option
842
- *
843
- * @return array
844
- */
845
- static function setting_no_option( $only_text = false ) {
846
- $msg = !get_option( 'pt_cv_version_pro' ) ? '' : __( 'There is no option', 'content-views-query-and-display-post-page' );
847
- $class = PT_CV_PREFIX . 'text cv-noop-profe';
848
- $text = "<div class='$class' style='color:#999'>$msg</div>";
849
-
850
- return $only_text ? $text : array(
851
- 'label' => array(
852
- 'text' => '',
853
- ),
854
- 'extra_setting' => array(
855
- 'params' => array(
856
- 'width' => 12,
857
- ),
858
- ),
859
- 'params' => array(
860
- array(
861
- 'type' => 'html',
862
- 'content' => $text,
863
- ),
864
- ),
865
- );
866
- }
867
-
868
- /**
869
- * Show Get CVPro
870
- *
871
- * @param string $text
872
- * @param int $width
873
- * @param string $style
874
- * @param bool $notice
875
- * @return string
876
- */
877
- static function get_cvpro( $text, $width = 10, $style = '', $notice = false ) {
878
- $url = sprintf( ' &raquo; <a href="%s" target="_blank">%s</a>', esc_url( 'https://www.contentviewspro.com/pricing/?utm_source=client&utm_medium=view_fields&utm_campaign=gopro' ), __( 'get Pro version', 'content-views-query-and-display-post-page' ) );
879
-
880
- return array(
881
- 'label' => array(
882
- 'text' => '',
883
- ),
884
- 'extra_setting' => array(
885
- 'params' => array(
886
- 'width' => $width,
887
- ),
888
- ),
889
- 'params' => array(
890
- array(
891
- 'type' => 'html',
892
- 'content' => $notice ?
893
- sprintf( '<div class="alert alert-warning cvgopro"><strong>%s:</strong> %s</div>', __( 'Notice', 'content-views-query-and-display-post-page' ), $text . $url . '.' ) :
894
- sprintf( '<p class="text-muted cvgopro" style="%s">&rarr; %s</p>', $style, $text . $url ),
895
- ),
896
- ),
897
- );
898
- }
899
-
900
- /**
901
- * Adjust title heading tag
902
- *
903
- * @since 1.9.7
904
- * @param string $prefix
905
- * @return array
906
- */
907
- static function title_heading_tag( $prefix ) {
908
- $tags = apply_filters( PT_CV_PREFIX_ . 'filter_title_tag', array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'div' ) );
909
-
910
- return array(
911
- 'label' => array(
912
- 'text' => __( 'HTML tag', 'content-views-query-and-display-post-page' ),
913
- ),
914
- 'extra_setting' => array(
915
- 'params' => array(
916
- 'wrap-class' => PT_CV_PREFIX . 'w200',
917
- ),
918
- ),
919
- 'params' => array(
920
- array(
921
- 'type' => 'select',
922
- 'options' => array_combine( $tags, $tags ),
923
- 'name' => $prefix . 'title-tag',
924
- 'std' => apply_filters( PT_CV_PREFIX_ . 'field_title_tag', 'h4' ),
925
- ),
926
- ),
927
- );
928
- }
929
-
930
- }
931
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
932
  }
1
+ <?php
2
+ /**
3
+ * Define settings for options
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( !class_exists( 'PT_CV_Settings' ) ) {
16
+
17
+ /**
18
+ * @name PT_CV_Settings
19
+ * @todo Define settings for options
20
+ */
21
+ class PT_CV_Settings {
22
+
23
+ /**
24
+ * Get collection : Taxonomies => Terms
25
+ *
26
+ * @param string $taxonomies Array of taxonomies
27
+ * @param array $args Array of query parameters
28
+ */
29
+ static function terms_of_taxonomies( $taxonomies = array(), $args = array() ) {
30
+ $terms_of_taxonomies = $result = array();
31
+ // Get taxonomies
32
+ $taxonomies = PT_CV_Values::taxonomy_list();
33
+ // Get slug list of taxonomies
34
+ $taxonomies_slug = array_keys( $taxonomies );
35
+
36
+ foreach ( $taxonomies_slug as $taxonomy_slug ) {
37
+ PT_CV_Values::term_of_taxonomy( $taxonomy_slug, $terms_of_taxonomies, $args );
38
+ }
39
+
40
+ foreach ( $terms_of_taxonomies as $taxonomy_slug => $terms ) {
41
+
42
+ $result[ $taxonomy_slug ] = apply_filters( PT_CV_PREFIX_ . 'taxonomy_settings', array(
43
+ // Select term to filter
44
+ array(
45
+ 'label' => array(
46
+ 'text' => __( 'Select terms', 'content-views-query-and-display-post-page' ),
47
+ ),
48
+ 'params' => array(
49
+ array(
50
+ 'type' => 'select',
51
+ 'name' => $taxonomy_slug . '-terms[]',
52
+ 'options' => $terms,
53
+ 'std' => '',
54
+ 'class' => apply_filters( PT_CV_PREFIX_ . 'select_term_class', 'select2' ),
55
+ 'multiple' => '1',
56
+ ),
57
+ ),
58
+ ),
59
+ //Operator
60
+ array(
61
+ 'label' => array(
62
+ 'text' => __( 'Operator', 'content-views-query-and-display-post-page' ),
63
+ ),
64
+ 'params' => array(
65
+ array(
66
+ 'type' => 'select',
67
+ 'name' => $taxonomy_slug . '-operator',
68
+ 'options' => PT_CV_Values::taxonomy_operators(),
69
+ 'std' => 'IN',
70
+ ),
71
+ ),
72
+ 'dependence' => array( 'taxonomy-term-info', 'as_output', '!=' ),
73
+ ),
74
+ ), $taxonomy_slug );
75
+ }
76
+
77
+ return $result;
78
+ }
79
+
80
+ /**
81
+ * Order by options
82
+ *
83
+ * @return array
84
+ */
85
+ static function orderby() {
86
+ $result = array();
87
+
88
+ $result[ 'common' ] = array(
89
+ // Order By
90
+ array(
91
+ 'label' => array(
92
+ 'text' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
93
+ ),
94
+ 'params' => array(
95
+ array(
96
+ 'type' => 'select',
97
+ 'name' => 'orderby',
98
+ 'options' => PT_CV_Values::post_regular_orderby(),
99
+ 'std' => '',
100
+ ),
101
+ ),
102
+ ),
103
+ // Upgrade to Pro: More sort by options
104
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Sort by drag & drop, custom field, slug, random order, menu order', 'content-views-query-and-display-post-page' ) ) : '',
105
+ // Order
106
+ apply_filters( PT_CV_PREFIX_ . 'orders', array(
107
+ 'label' => array(
108
+ 'text' => __( 'Order' ),
109
+ ),
110
+ 'params' => array(
111
+ array(
112
+ 'type' => 'radio',
113
+ 'name' => 'order',
114
+ 'options' => PT_CV_Values::orders(),
115
+ 'std' => 'asc',
116
+ ),
117
+ ),
118
+ ) ),
119
+ );
120
+
121
+ $result = apply_filters( PT_CV_PREFIX_ . 'orderby', $result );
122
+
123
+ return $result;
124
+ }
125
+
126
+ /**
127
+ * Pagination settings
128
+ *
129
+ * @return array
130
+ */
131
+ static function settings_pagination() {
132
+
133
+ $prefix = 'pagination-';
134
+
135
+ $result = array(
136
+ // Pagination
137
+ array(
138
+ 'label' => array(
139
+ 'text' => '',
140
+ ),
141
+ 'extra_setting' => array(
142
+ 'params' => array(
143
+ 'width' => 12,
144
+ ),
145
+ ),
146
+ 'params' => array(
147
+ array(
148
+ 'type' => 'checkbox',
149
+ 'name' => 'enable-pagination',
150
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Enable' ) ),
151
+ 'std' => '',
152
+ ),
153
+ ),
154
+ ),
155
+ // Items per page
156
+ array(
157
+ 'label' => array(
158
+ 'text' => __( 'Items per page', 'content-views-query-and-display-post-page' ),
159
+ ),
160
+ 'extra_setting' => array(
161
+ 'params' => array(
162
+ 'wrap-class' => PT_CV_PREFIX . 'w200',
163
+ ),
164
+ ),
165
+ 'params' => array(
166
+ array(
167
+ 'type' => 'number',
168
+ 'name' => $prefix . 'items-per-page',
169
+ 'std' => '5',
170
+ 'placeholder' => 'for example: 5',
171
+ 'desc' => sprintf( __( 'If value of the %s setting is not empty, this value should be smaller than that', 'content-views-query-and-display-post-page' ), sprintf( '<code>%s</code>', __( 'Limit', 'content-views-query-and-display-post-page' ) ) ),
172
+ ),
173
+ ),
174
+ 'dependence' => array( 'enable-pagination', 'yes' ),
175
+ ),
176
+ // Pagination Type
177
+ array(
178
+ 'label' => array(
179
+ 'text' => __( 'Type' ),
180
+ ),
181
+ 'params' => array(
182
+ array(
183
+ 'type' => 'radio',
184
+ 'name' => $prefix . 'type',
185
+ 'options' => PT_CV_Values::pagination_types(),
186
+ 'std' => 'ajax',
187
+ ),
188
+ ),
189
+ 'dependence' => array( 'enable-pagination', 'yes' ),
190
+ ),
191
+ // Pagination Style
192
+ array(
193
+ 'label' => array(
194
+ 'text' => '',
195
+ ),
196
+ 'extra_setting' => array(
197
+ 'params' => array(
198
+ 'width' => 12,
199
+ ),
200
+ ),
201
+ 'params' => array(
202
+ array(
203
+ 'type' => 'group',
204
+ 'params' => array(
205
+ array(
206
+ 'label' => array(
207
+ 'text' => __( 'Style', 'content-views-query-and-display-post-page' ),
208
+ ),
209
+ 'params' => array(
210
+ array(
211
+ 'type' => 'radio',
212
+ 'name' => $prefix . 'style',
213
+ 'options' => PT_CV_Values::pagination_styles(),
214
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::pagination_styles() ),
215
+ ),
216
+ ),
217
+ 'dependence' => array( $prefix . 'type', 'normal', '!=' ),
218
+ ),
219
+ ),
220
+ ),
221
+ ),
222
+ 'dependence' => array( 'enable-pagination', 'yes' ),
223
+ ),
224
+ );
225
+
226
+ $result = apply_filters( PT_CV_PREFIX_ . 'settings_pagination', $result, $prefix );
227
+
228
+ return $result;
229
+ }
230
+
231
+ /**
232
+ * Other settings for All View Type
233
+ */
234
+ static function settings_other() {
235
+
236
+ $prefix = 'other-';
237
+
238
+ $result = array(
239
+ // Open an item in
240
+ array(
241
+ 'label' => array(
242
+ 'text' => __( 'Open item in', 'content-views-query-and-display-post-page' ),
243
+ ),
244
+ 'params' => array(
245
+ array(
246
+ 'type' => 'radio',
247
+ 'name' => $prefix . 'open-in',
248
+ 'options' => PT_CV_Values::open_in(),
249
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::open_in() ),
250
+ 'desc' => __( 'How to open item when click on Title, Thumbnail, Read-more button', 'content-views-query-and-display-post-page' ),
251
+ ),
252
+ ),
253
+ ),
254
+ );
255
+
256
+ $result = apply_filters( PT_CV_PREFIX_ . 'settings_other', $result, $prefix );
257
+
258
+ return $result;
259
+ }
260
+
261
+ /**
262
+ * Fields settings
263
+ */
264
+ static function field_settings() {
265
+
266
+ $prefix = 'field-';
267
+ $prefix2 = 'show-' . $prefix;
268
+
269
+ $result = array(
270
+ // Fields display
271
+ array(
272
+ 'label' => array(
273
+ 'text' => '',
274
+ ),
275
+ 'extra_setting' => array(
276
+ 'params' => array(
277
+ 'wrap-class' => PT_CV_Html::html_group_class(),
278
+ 'width' => 12,
279
+ ),
280
+ ),
281
+ 'params' => array(
282
+ array(
283
+ 'type' => 'group',
284
+ 'params' => PT_CV_Settings::field_display_settings(),
285
+ ),
286
+ ),
287
+ ),
288
+ // Upgrade to Pro: Drag & Drop
289
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Show Custom Fields, show Title above Thumbnail...', 'content-views-query-and-display-post-page' ), 12, 'margin-top: -15px; margin-bottom: 5px; width: 100%;' ) : '',
290
+ // Title settings
291
+ get_option( 'pt_cv_version_pro' ) ? apply_filters( PT_CV_PREFIX_ . 'settings_title_display', array(), $prefix, $prefix2 ) :
292
+ array(
293
+ 'label' => array(
294
+ 'text' => __( 'Title' ),
295
+ ),
296
+ 'extra_setting' => array(
297
+ 'params' => array(
298
+ 'group-class' => PT_CV_PREFIX . 'field-setting',
299
+ 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'title-setting',
300
+ ),
301
+ ),
302
+ 'params' => array(
303
+ array(
304
+ 'type' => 'group',
305
+ 'params' => array(
306
+ PT_CV_Settings::title_heading_tag( $prefix )
307
+ ),
308
+ ),
309
+ ),
310
+ 'dependence' => array( $prefix2 . 'title', 'yes' ),
311
+ )
312
+ ,
313
+ // Thumbnail settings
314
+ array(
315
+ 'label' => array(
316
+ 'text' => __( 'Thumbnail' ),
317
+ ),
318
+ 'extra_setting' => array(
319
+ 'params' => array(
320
+ 'group-class' => PT_CV_PREFIX . 'field-setting',
321
+ 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'thumbnail-setting' . ' ' . PT_CV_PREFIX . 'w50',
322
+ ),
323
+ ),
324
+ 'params' => array(
325
+ array(
326
+ 'type' => 'group',
327
+ 'params' => PT_CV_Settings::field_thumbnail_settings( $prefix ),
328
+ ),
329
+ ),
330
+ 'dependence' => array( $prefix2 . 'thumbnail', 'yes' ),
331
+ ),
332
+ // Content settings
333
+ array(
334
+ 'label' => array(
335
+ 'text' => __( 'Content' ),
336
+ ),
337
+ 'extra_setting' => array(
338
+ 'params' => array(
339
+ 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'content-setting',
340
+ ),
341
+ ),
342
+ 'params' => array(
343
+ array(
344
+ 'type' => 'radio',
345
+ 'name' => $prefix . 'content-show',
346
+ 'options' => array(
347
+ 'full' => __( 'Show Full Content', 'content-views-query-and-display-post-page' ),
348
+ 'excerpt' => __( 'Show Excerpt', 'content-views-query-and-display-post-page' ),
349
+ ),
350
+ 'std' => 'excerpt',
351
+ ),
352
+ ),
353
+ 'dependence' => array( $prefix2 . 'content', 'yes' ),
354
+ ),
355
+ // Full content (use same group class to use existing js + css)
356
+ array(
357
+ 'label' => array(
358
+ 'text' => '',
359
+ ),
360
+ 'extra_setting' => array(
361
+ 'params' => array(
362
+ 'width' => 12,
363
+ 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'excerpt-setting',
364
+ ),
365
+ ),
366
+ 'params' => array(
367
+ array(
368
+ 'type' => 'group',
369
+ 'params' => array(
370
+ array(
371
+ 'label' => array(
372
+ 'text' => '',
373
+ ),
374
+ 'extra_setting' => array(
375
+ 'params' => array(
376
+ 'width' => 12,
377
+ ),
378
+ ),
379
+ 'params' => array(
380
+ array(
381
+ 'type' => 'checkbox',
382
+ 'name' => $prefix . 'content-skip-balance-tag',
383
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Do not attempt to balance HTML tags in content', 'content-views-query-and-display-post-page' ) ),
384
+ 'std' => '',
385
+ 'desc' => __( 'Balancing tag prevents unmatched elements. But it does not work for all cases.<br> Check this option to show original content', 'content-views-query-and-display-post-page' ),
386
+ ),
387
+ ),
388
+ 'dependence' => array( $prefix . 'content-show', 'full' ),
389
+ ),
390
+ ),
391
+ ),
392
+ ),
393
+ 'dependence' => array( $prefix2 . 'content', 'yes' ),
394
+ ),
395
+ // Excerpt settings
396
+ array(
397
+ 'label' => array(
398
+ 'text' => '',
399
+ ),
400
+ 'extra_setting' => array(
401
+ 'params' => array(
402
+ 'width' => 12,
403
+ 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'excerpt-setting',
404
+ 'wrap-id' => PT_CV_Html::html_group_id( 'excerpt-settings' ),
405
+ ),
406
+ ),
407
+ 'params' => array(
408
+ array(
409
+ 'type' => 'group',
410
+ 'params' => array(
411
+ array(
412
+ 'label' => array(
413
+ 'text' => '',
414
+ ),
415
+ 'extra_setting' => array(
416
+ 'params' => array(
417
+ 'width' => 12,
418
+ ),
419
+ ),
420
+ 'params' => array(
421
+ array(
422
+ 'type' => 'group',
423
+ 'params' => apply_filters(
424
+ PT_CV_PREFIX_ . 'excerpt_settings', array(
425
+ // Excerpt length
426
+ array(
427
+ 'label' => array(
428
+ 'text' => __( 'Excerpt settings', 'content-views-query-and-display-post-page' ),
429
+ ),
430
+ 'params' => array(
431
+ array(
432
+ 'type' => 'number',
433
+ 'name' => $prefix . 'excerpt-length',
434
+ 'std' => '20',
435
+ 'placeholder' => 'for example: 20',
436
+ 'append_text' => 'words',
437
+ 'desc' => __( 'Generate excerpt by selecting the first X words of post content', 'content-views-query-and-display-post-page' ),
438
+ ),
439
+ ),
440
+ ),
441
+ // Upgrade to Pro: Manual excerpt
442
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( __( 'Use manual excerpt (in the Excerpt field under the post edit box)', 'content-views-query-and-display-post-page' ) ) : '',
443
+ // Allow HTML tags
444
+ array(
445
+ 'label' => array(
446
+ 'text' => '',
447
+ ),
448
+ 'params' => array(
449
+ array(
450
+ 'type' => 'checkbox',
451
+ 'name' => $prefix . 'excerpt-allow_html',
452
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Allow HTML tags (a, br, strong, em, strike, i, ul, ol, li) in excerpt', 'content-views-query-and-display-post-page' ) ),
453
+ 'std' => '',
454
+ ),
455
+ ),
456
+ ),
457
+ // Read more text
458
+ !get_option( 'pt_cv_version_pro' ) ? array(
459
+ 'label' => array(
460
+ 'text' => __( 'Read More text', 'content-views-query-and-display-post-page' ),
461
+ ),
462
+ 'params' => array(
463
+ array(
464
+ 'type' => 'text',
465
+ 'name' => $prefix . 'excerpt-readmore-text',
466
+ 'std' => ucwords( rtrim( __( 'Read more...' ), '.' ) ),
467
+ 'desc' => '<span class="alert-warning">' . sprintf( __( 'To change color of this button, <a href="%s" target="_blank"> please check this document </a>', 'content-views-query-and-display-post-page' ), 'http://docs.contentviewspro.com/change-color-read-more-button/?utm_source=client&utm_medium=read-more-color&utm_campaign=gopro' ) . '</span>',
468
+ ),
469
+ ),
470
+ ) : '',
471
+ ), $prefix . 'excerpt-'
472
+ ),
473
+ ),
474
+ ),
475
+ 'dependence' => array( $prefix . 'content-show', 'excerpt' ),
476
+ ),
477
+ ),
478
+ ),
479
+ ),
480
+ 'dependence' => array( $prefix2 . 'content', 'yes' ),
481
+ ),
482
+ // Meta fields settings
483
+ array(
484
+ 'label' => array(
485
+ 'text' => __( 'Meta fields', 'content-views-query-and-display-post-page' ),
486
+ ),
487
+ 'extra_setting' => array(
488
+ 'params' => array(
489
+ 'group-class' => PT_CV_PREFIX . 'field-setting' . ' ' . PT_CV_PREFIX . 'metafield-setting',
490
+ 'wrap-class' => PT_CV_Html::html_group_class() . ' ' . PT_CV_PREFIX . 'meta-fields-settings',
491
+ ),
492
+ ),
493
+ 'params' => array(
494
+ array(
495
+ 'type' => 'group',
496
+ 'params' => PT_CV_Settings::field_meta_fields( 'meta-fields-' ),
497
+ 'desc' => apply_filters( PT_CV_PREFIX_ . 'settings_sort_text', '' ),
498
+ ),
499
+ ),
500
+ 'dependence' => array( $prefix2 . 'meta-fields', 'yes' ),
501
+ ),
502
+ // Taxonomies settings
503
+ apply_filters( PT_CV_PREFIX_ . 'settings_taxonomies_display', array(), 'meta-fields-' ),
504
+ );
505
+
506
+ $result = apply_filters( PT_CV_PREFIX_ . 'field_settings', $result, $prefix2 );
507
+
508
+ return $result;
509
+ }
510
+
511
+ /**
512
+ * Fields display
513
+ *
514
+ * @return array
515
+ */
516
+ static function field_display_settings() {
517
+
518
+ $field_display_settings = array(
519
+ array(
520
+ 'label' => array(
521
+ 'text' => '',
522
+ ),
523
+ 'extra_setting' => array(
524
+ 'params' => array(
525
+ 'width' => 12,
526
+ 'wrap-class' => PT_CV_PREFIX . 'field-display',
527
+ ),
528
+ ),
529
+ 'params' => array(
530
+ array(
531
+ 'type' => 'group',
532
+ 'params' => PT_CV_Settings::field_display(),
533
+ 'desc' => apply_filters( PT_CV_PREFIX_ . 'settings_sort_text', '' ),
534
+ ),
535
+ ),
536
+ ),
537
+ );
538
+
539
+ $result = apply_filters( PT_CV_PREFIX_ . 'field_display_settings', $field_display_settings );
540
+
541
+ return $result;
542
+ }
543
+
544
+ /**
545
+ * Options to check/uncheck to display fields
546
+ *
547
+ * @return array
548
+ */
549
+ static function field_display() {
550
+
551
+ $prefix = 'show-field-';
552
+
553
+ $result = array(
554
+ // Thumbnail position
555
+ array(
556
+ 'label' => array(
557
+ 'text' => __( 'Thumbnail position', 'content-views-query-and-display-post-page' ),
558
+ ),
559
+ 'extra_setting' => array(
560
+ 'params' => array(
561
+ 'group-class' => PT_CV_PREFIX . 'thumb-position',
562
+ 'wrap-class' => PT_CV_PREFIX . 'w200',
563
+ ),
564
+ ),
565
+ 'params' => array(
566
+ array(
567
+ 'type' => 'select',
568
+ 'name' => 'field-' . 'thumbnail-position',
569
+ 'options' => PT_CV_Values::thumbnail_position(),
570
+ 'std' => PT_CV_Functions::array_get_first_key( PT_CV_Values::thumbnail_position() ),
571
+ ),
572
+ ),
573
+ 'dependence' => array( 'layout-format', '2-col' ),
574
+ ),
575
+ // Show Thumbnail
576
+ array(
577
+ 'label' => array(
578
+ 'text' => '',
579
+ ),
580
+ 'extra_setting' => array(
581
+ 'params' => array(
582
+ 'width' => 12,
583
+ ),
584
+ ),
585
+ 'params' => array(
586
+ array(
587
+ 'type' => 'checkbox',
588
+ 'name' => $prefix . 'thumbnail',
589
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Thumbnail', 'content-views-query-and-display-post-page' ) ),
590
+ 'std' => 'yes',
591
+ ),
592
+ ),
593
+ ),
594
+ // Show Title
595
+ array(
596
+ 'label' => array(
597
+ 'text' => '',
598
+ ),
599
+ 'extra_setting' => array(
600
+ 'params' => array(
601
+ 'width' => 12,
602
+ ),
603
+ ),
604
+ 'params' => array(
605
+ array(
606
+ 'type' => 'checkbox',
607
+ 'name' => $prefix . 'title',
608
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Title', 'content-views-query-and-display-post-page' ) ),
609
+ 'std' => 'yes',
610
+ ),
611
+ ),
612
+ ),
613
+ // Show Content
614
+ array(
615
+ 'label' => array(
616
+ 'text' => '',
617
+ ),
618
+ 'extra_setting' => array(
619
+ 'params' => array(
620
+ 'width' => 12,
621
+ ),
622
+ ),
623
+ 'params' => array(
624
+ array(
625
+ 'type' => 'checkbox',
626
+ 'name' => $prefix . 'content',
627
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Content', 'content-views-query-and-display-post-page' ) ),
628
+ 'std' => 'yes',
629
+ ),
630
+ ),
631
+ ),
632
+ // Show Meta fields
633
+ array(
634
+ 'label' => array(
635
+ 'text' => '',
636
+ ),
637
+ 'extra_setting' => array(
638
+ 'params' => array(
639
+ 'width' => 12,
640
+ ),
641
+ ),
642
+ 'params' => array(
643
+ array(
644
+ 'type' => 'checkbox',
645
+ 'name' => $prefix . 'meta-fields',
646
+ 'options' => PT_CV_Values::yes_no( 'yes', sprintf( '%s (%s, %s, %s, %s)', __( 'Show Meta Fields', 'content-views-query-and-display-post-page' ), __( 'Taxonomy', 'content-views-query-and-display-post-page' ), __( 'Author' ), __( 'Date' ), __( 'Comment' ) ) ),
647
+ 'std' => '',
648
+ ),
649
+ ),
650
+ ),
651
+ );
652
+
653
+ // Add/remove params
654
+ $result = apply_filters( PT_CV_PREFIX_ . 'field_display', $result, $prefix );
655
+
656
+ // Sort array of params by saved order
657
+ $result = apply_filters( PT_CV_PREFIX_ . 'settings_sort', $result, PT_CV_PREFIX . $prefix );
658
+
659
+ return $result;
660
+ }
661
+
662
+ /**
663
+ * Setting options for Field = Thumbnail
664
+ */
665
+ static function field_thumbnail_settings( $prefix ) {
666
+
667
+ $result = array(
668
+ // Size
669
+ array(
670
+ 'label' => array(
671
+ 'text' => __( 'Size' ),
672
+ ),
673
+ 'params' => array(
674
+ array(
675
+ 'type' => 'select',
676
+ 'name' => $prefix . 'thumbnail-size',
677
+ 'options' => PT_CV_Values::field_thumbnail_sizes(),
678
+ 'std' => 'medium',
679
+ ),
680
+ ),
681
+ ),
682
+ // Disable WP 4.4 responsive image
683
+ !PT_CV_Functions::wp_version_compare( '4.4' ) ? '' :
684
+ 'disable-wp44-resimg' => array(
685
+ 'label' => array(
686
+ 'text' => '',
687
+ ),
688
+ 'params' => array(
689
+ array(
690
+ 'type' => 'checkbox',
691
+ 'name' => $prefix . 'thumbnail-nowprpi',
692
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Disable responsive image of WordPress', 'content-views-query-and-display-post-page' ) ),
693
+ 'std' => '',
694
+ 'desc' => __( 'If thumbnail looks blurry, check this option, and select a bigger size option above', 'content-views-query-and-display-post-page' ),
695
+ ),
696
+ ),
697
+ ),
698
+ // Upgrade to Pro: Show image/video in content as thumbnail
699
+ !get_option( 'pt_cv_version_pro' ) ? PT_CV_Settings::get_cvpro( sprintf( __( 'In this lite version, thumbnail is only shown if the post has %s.<br>In the Pro version, you can show the first image in post as thumbnail, without having to set a featured image', 'content-views-query-and-display-post-page' ), sprintf( '<a target="_blank" href="https://codex.wordpress.org/Post_Thumbnails">%s</a>', __( 'Featured Image' ) ) ), 12, null, true ) : '',
700
+ );
701
+
702
+ $result = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_settings', $result, $prefix );
703
+
704
+ return $result;
705
+ }
706
+
707
+ /**
708
+ * Show settings of other fields
709
+ */
710
+ static function field_meta_fields( $prefix ) {
711
+
712
+ $result = array(
713
+ // Date
714
+ array(
715
+ 'label' => array(
716
+ 'text' => '',
717
+ ),
718
+ 'extra_setting' => array(
719
+ 'params' => array(
720
+ 'width' => 12,
721
+ ),
722
+ ),
723
+ 'params' => array(
724
+ array(
725
+ 'type' => 'checkbox',
726
+ 'name' => $prefix . 'date',
727
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Date', 'content-views-query-and-display-post-page' ) ),
728
+ 'std' => 'yes',
729
+ ),
730
+ ),
731
+ ),
732
+ // Author
733
+ array(
734
+ 'label' => array(
735
+ 'text' => '',
736
+ ),
737
+ 'extra_setting' => array(
738
+ 'params' => array(
739
+ 'width' => 12,
740
+ ),
741
+ ),
742
+ 'params' => array(
743
+ array(
744
+ 'type' => 'checkbox',
745
+ 'name' => $prefix . 'author',
746
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Author', 'content-views-query-and-display-post-page' ) ),
747
+ 'std' => '',
748
+ ),
749
+ ),
750
+ ),
751
+ // Taxonomy
752
+ array(
753
+ 'label' => array(
754
+ 'text' => '',
755
+ ),
756
+ 'extra_setting' => array(
757
+ 'params' => array(
758
+ 'width' => 12,
759
+ ),
760
+ ),
761
+ 'params' => array(
762
+ array(
763
+ 'type' => 'checkbox',
764
+ 'name' => $prefix . 'taxonomy',
765
+ 'options' => PT_CV_Values::yes_no( 'yes', sprintf( __( 'Show Taxonomies (%s, %s...)', 'content-views-query-and-display-post-page' ), __( 'Categories' ), __( 'Tags' ) ) ),
766
+ 'std' => 'yes',
767
+ ),
768
+ ),
769
+ ),
770
+ // Comment
771
+ array(
772
+ 'label' => array(
773
+ 'text' => '',
774
+ ),
775
+ 'extra_setting' => array(
776
+ 'params' => array(
777
+ 'width' => 12,
778
+ ),
779
+ ),
780
+ 'params' => array(
781
+ array(
782
+ 'type' => 'checkbox',
783
+ 'name' => $prefix . 'comment',
784
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Show Comment Count', 'content-views-query-and-display-post-page' ) ),
785
+ 'std' => '',
786
+ ),
787
+ ),
788
+ ),
789
+ );
790
+
791
+ // Sort array of params by saved order
792
+ $result = apply_filters( PT_CV_PREFIX_ . 'settings_sort', $result, PT_CV_PREFIX . $prefix );
793
+
794
+ return $result;
795
+ }
796
+
797
+ /**
798
+ * Settings of View Type = Grid
799
+ *
800
+ * @return array
801
+ */
802
+ static function view_type_settings_grid() {
803
+
804
+ $prefix = 'grid-';
805
+
806
+ $result = array(
807
+ // Number of columns
808
+ array(
809
+ 'label' => array(
810
+ 'text' => __( 'Items per row', 'content-views-query-and-display-post-page' ),
811
+ ),
812
+ 'params' => array(
813
+ array(
814
+ 'type' => 'number',
815
+ 'name' => $prefix . 'number-columns',
816
+ 'std' => '2',
817
+ 'append_text' => '1 &rarr; 12',
818
+ ),
819
+ ),
820
+ 'dependence' => array( 'view-type', 'grid' ),
821
+ ),
822
+ );
823
+
824
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_grid', $result );
825
+
826
+ return $result;
827
+ }
828
+
829
+ /**
830
+ * Settings of View Type = Collapsible
831
+ *
832
+ * @return array
833
+ */
834
+ static function view_type_settings_collapsible() {
835
+ $prefix = 'collapsible-';
836
+ $result = array(
837
+ array(
838
+ 'label' => array(
839
+ 'text' => '',
840
+ ),
841
+ 'extra_setting' => array(
842
+ 'params' => array(
843
+ 'width' => 12,
844
+ ),
845
+ ),
846
+ 'params' => array(
847
+ array(
848
+ 'type' => 'checkbox',
849
+ 'name' => $prefix . 'open-first-item',
850
+ 'options' => PT_CV_Values::yes_no( 'yes', __( 'Open the first item by default', 'content-views-query-and-display-post-page' ) ),
851
+ 'std' => 'yes',
852
+ ),
853
+ ),
854
+ ),
855
+ );
856
+
857
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_collapsible_184', $result );
858
+
859
+ return $result;
860
+ }
861
+
862
+ /**
863
+ * Settings of View Type = Scrollable
864
+ *
865
+ * @return array
866
+ */
867
+ static function view_type_settings_scrollable() {
868
+
869
+ $prefix = 'scrollable-';
870
+
871
+ $result = array(
872
+ PT_CV_Settings::setting_no_option(),
873
+ );
874
+
875
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings_scrollable', $result );
876
+
877
+ return $result;
878
+ }
879
+
880
+ /**
881
+ * Setting with no option
882
+ *
883
+ * @return array
884
+ */
885
+ static function setting_no_option( $only_text = false ) {
886
+ $msg = !get_option( 'pt_cv_version_pro' ) ? '' : __( 'There is no option', 'content-views-query-and-display-post-page' );
887
+ $class = PT_CV_PREFIX . 'text cv-noop-profe';
888
+ $text = "<div class='$class' style='color:#999'>$msg</div>";
889
+
890
+ return $only_text ? $text : array(
891
+ 'label' => array(
892
+ 'text' => '',
893
+ ),
894
+ 'extra_setting' => array(
895
+ 'params' => array(
896
+ 'width' => 12,
897
+ ),
898
+ ),
899
+ 'params' => array(
900
+ array(
901
+ 'type' => 'html',
902
+ 'content' => $text,
903
+ ),
904
+ ),
905
+ );
906
+ }
907
+
908
+ /**
909
+ * Show Get CVPro
910
+ *
911
+ * @param string $text
912
+ * @param int $width
913
+ * @param string $style
914
+ * @param bool $notice
915
+ * @return string
916
+ */
917
+ static function get_cvpro( $text, $width = 10, $style = '', $notice = false ) {
918
+ $url = sprintf( ' &raquo; <a href="%s" target="_blank">%s</a>', esc_url( 'https://www.contentviewspro.com/pricing/?utm_source=client&utm_medium=view_fields&utm_campaign=gopro' ), __( 'get Pro version', 'content-views-query-and-display-post-page' ) );
919
+
920
+ return array(
921
+ 'label' => array(
922
+ 'text' => '',
923
+ ),
924
+ 'extra_setting' => array(
925
+ 'params' => array(
926
+ 'width' => $width,
927
+ ),
928
+ ),
929
+ 'params' => array(
930
+ array(
931
+ 'type' => 'html',
932
+ 'content' => $notice ?
933
+ sprintf( '<div class="alert alert-warning cvgopro"><strong>%s:</strong> %s</div>', __( 'Notice', 'content-views-query-and-display-post-page' ), $text . $url . '.' ) :
934
+ sprintf( '<p class="text-muted cvgopro" style="%s">&rarr; %s</p>', $style, $text . $url ),
935
+ ),
936
+ ),
937
+ );
938
+ }
939
+
940
+ /**
941
+ * Adjust title heading tag
942
+ *
943
+ * @since 1.9.7
944
+ * @param string $prefix
945
+ * @return array
946
+ */
947
+ static function title_heading_tag( $prefix ) {
948
+ $tags = apply_filters( PT_CV_PREFIX_ . 'filter_title_tag', array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'div' ) );
949
+
950
+ return array(
951
+ 'label' => array(
952
+ 'text' => __( 'HTML tag', 'content-views-query-and-display-post-page' ),
953
+ ),
954
+ 'extra_setting' => array(
955
+ 'params' => array(
956
+ 'wrap-class' => PT_CV_PREFIX . 'w200',
957
+ ),
958
+ ),
959
+ 'params' => array(
960
+ array(
961
+ 'type' => 'select',
962
+ 'options' => array_combine( $tags, $tags ),
963
+ 'name' => $prefix . 'title-tag',
964
+ 'std' => apply_filters( PT_CV_PREFIX_ . 'field_title_tag', 'h4' ),
965
+ ),
966
+ ),
967
+ );
968
+ }
969
+
970
+ }
971
+
972
  }
includes/values.php CHANGED
@@ -1,447 +1,448 @@
1
- <?php
2
- /**
3
- * Define values for input, select...
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- if ( !class_exists( 'PT_CV_Values' ) ) {
16
-
17
- /**
18
- * @name PT_CV_Values
19
- * @todo Define values for input, select...
20
- */
21
- class PT_CV_Values {
22
-
23
- /**
24
- * Get Post Types
25
- *
26
- * @param array $args Array of query parameters
27
- * @param string $excludes_ Array of slug of post types want to exclude from result
28
- *
29
- * @return array
30
- */
31
- static function post_types( $args = array(), $excludes_ = array() ) {
32
- $excludes = array_merge( array( 'attachment' ), $excludes_ );
33
- $result = array();
34
- $args = array_merge( array( 'public' => true, '_builtin' => true ), $args );
35
- $args = apply_filters( PT_CV_PREFIX_ . 'post_types', $args );
36
- $post_types = get_post_types( $args, 'objects' );
37
-
38
- foreach ( $post_types as $post_type ) {
39
- if ( in_array( $post_type->name, $excludes ) ) {
40
- continue;
41
- }
42
- $result[ $post_type->name ] = $post_type->labels->singular_name;
43
- }
44
-
45
- $result = apply_filters( PT_CV_PREFIX_ . 'post_types_list', $result );
46
-
47
- return $result;
48
- }
49
-
50
- /**
51
- * Get list of post types and related taxonomies
52
- *
53
- * @return array
54
- */
55
- static function post_types_vs_taxonomies() {
56
- // Get post types
57
- $args = apply_filters( PT_CV_PREFIX_ . 'post_types', array( 'public' => true, 'show_ui' => true, '_builtin' => true ) );
58
- $post_types = get_post_types( $args );
59
-
60
- // Get taxonomies of post types
61
- $result = array();
62
-
63
- foreach ( $post_types as $post_type ) {
64
- $taxonomy_names = get_object_taxonomies( $post_type );
65
- $result[ $post_type ] = $taxonomy_names;
66
- }
67
-
68
- return apply_filters( PT_CV_PREFIX_ . 'post_types_taxonomies', $result );
69
- }
70
-
71
- /**
72
- * Get list of taxonomies
73
- *
74
- * @param array $args Array of query parameters
75
- *
76
- * @return array
77
- */
78
- static function taxonomy_list( $args = array() ) {
79
- $result = array();
80
- $args = array_merge( array( 'public' => true, 'show_ui' => true, '_builtin' => true ), $args );
81
- $args = apply_filters( PT_CV_PREFIX_ . 'taxonomy_query_args', $args );
82
- $taxonomies = get_taxonomies( $args, 'objects' );
83
-
84
- foreach ( $taxonomies as $taxonomy ) {
85
- $result[ $taxonomy->name ] = $taxonomy->labels->singular_name;
86
- }
87
-
88
- return apply_filters( PT_CV_PREFIX_ . 'tax_list', $result );
89
- }
90
-
91
- /**
92
- * The logical relationship between taxonomies
93
- *
94
- * @return array
95
- */
96
- static function taxonomy_relation() {
97
- return array(
98
- 'AND' => __( 'AND', 'content-views-query-and-display-post-page' ),
99
- 'OR' => __( 'OR', 'content-views-query-and-display-post-page' ),
100
- );
101
- }
102
-
103
- /**
104
- * Operator to join. Possible values are 'IN'(default), 'NOT IN', 'AND'.
105
- * @return type
106
- */
107
- static function taxonomy_operators() {
108
- return array(
109
- 'IN' => __( 'IN - show posts which match ANY selected terms', 'content-views-query-and-display-post-page' ),
110
- 'NOT IN' => __( 'NOT IN - show posts which DO NOT match ANY selected terms', 'content-views-query-and-display-post-page' ),
111
- 'AND' => __( 'AND - show posts which match ALL selected terms', 'content-views-query-and-display-post-page' ),
112
- );
113
- }
114
-
115
- /**
116
- * Get taxonomy information
117
- *
118
- * @param string $taxonomy The name of the taxonomy
119
- * @param string $info Field of metadata want to retrieve
120
- *
121
- * @return string | array
122
- */
123
- static function taxonomy_info( $taxonomy, $info ) {
124
- $data = get_taxonomy( $taxonomy );
125
-
126
- if ( isset( $data->$info ) ) {
127
- $result = $data->$info;
128
- } else {
129
- if ( isset( $data->labels->$info ) ) {
130
- $result = $data->labels->$info;
131
- }
132
- }
133
-
134
- return isset( $result ) ? $result : NULL;
135
- }
136
-
137
- /**
138
- * Get terms of one/many taxonomies
139
- *
140
- * @param string $taxonomy The name of the taxonomy
141
- * @param string $terms_of_taxonomies Array of terms of taxonomies
142
- * @param array $args Array of query parameters
143
- */
144
- static function term_of_taxonomy( $taxonomy, &$terms_of_taxonomies, $args = array(), $data = 'name' ) {
145
- $args = array_merge( array( 'hide_empty' => false ), $args );
146
- $terms = get_terms( array( $taxonomy ), $args );
147
-
148
- $term_slug_name = array();
149
- foreach ( $terms as $term ) {
150
- $term_slug_name[ $term->slug ] = ($data === 'name') ? $term->name : $term;
151
- }
152
-
153
- // Sort values of param by saved order
154
- $term_slug_name = apply_filters( PT_CV_PREFIX_ . 'settings_sort_single', $term_slug_name, $taxonomy . '-' . 'terms' );
155
-
156
- $terms_of_taxonomies[ $taxonomy ] = array_filter( $term_slug_name ); /* prevent term with empty name */
157
- }
158
-
159
- /**
160
- * Yes no options
161
- *
162
- * @return array
163
- */
164
- static function yes_no( $key = '', $value = '' ) {
165
- $result = array(
166
- 'yes' => __( 'Yes', 'content-views-query-and-display-post-page' ),
167
- 'no' => __( 'No', 'content-views-query-and-display-post-page' ),
168
- );
169
- if ( !empty( $key ) ) {
170
- return array( $key => empty( $value ) ? $result[ $key ] : $value );
171
- }
172
-
173
- return $result;
174
- }
175
-
176
- /**
177
- * Paging types
178
- *
179
- * @return array
180
- */
181
- static function pagination_types() {
182
- $result = array(
183
- 'ajax' => __( 'Ajax', 'content-views-query-and-display-post-page' ),
184
- 'normal' => __( 'Normal', 'content-views-query-and-display-post-page' ),
185
- );
186
-
187
- $result = apply_filters( PT_CV_PREFIX_ . 'pagination_types', $result );
188
-
189
- return $result;
190
- }
191
-
192
- /**
193
- * Paging styles
194
- *
195
- * @return array
196
- */
197
- static function pagination_styles() {
198
- $result = array(
199
- 'regular' => __( 'Numbered pagination', 'content-views-query-and-display-post-page' ),
200
- );
201
-
202
- $result = apply_filters( PT_CV_PREFIX_ . 'pagination_styles', $result );
203
-
204
- return $result;
205
- }
206
-
207
- /**
208
- * Order options
209
- *
210
- * @return array
211
- */
212
- static function orders() {
213
- return array(
214
- 'asc' => __( 'Ascending' ),
215
- 'desc' => __( 'Descending' ),
216
- );
217
- }
218
-
219
- /**
220
- * List post status
221
- */
222
- static function post_statuses() {
223
- $result = array();
224
- $statuses = get_post_stati( null, 'objects' );
225
- foreach ( $statuses as $status => $object ) {
226
- $result[ $status ] = ucfirst( $object->label );
227
- }
228
-
229
- return $result;
230
- }
231
-
232
- /**
233
- * Advanced filters options
234
- *
235
- * @return array
236
- */
237
- static function advanced_settings() {
238
- return apply_filters(
239
- PT_CV_PREFIX_ . 'advanced_settings', array(
240
- 'taxonomy' => __( 'Taxonomy', 'content-views-query-and-display-post-page' ) . sprintf( ' (%s, %s...)', __( 'Categories' ), __( 'Tags' ) ),
241
- 'status' => __( 'Status' ),
242
- 'order' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
243
- 'search' => __( 'Keyword' ),
244
- 'author' => __( 'Author' ),
245
- )
246
- );
247
- }
248
-
249
- /**
250
- * Show WP author dropdown list
251
- *
252
- * @return array
253
- */
254
- static function user_list() {
255
- global $cv_admin_users_list;
256
-
257
- if ( !empty( $cv_admin_users_list ) ) {
258
- $result = $cv_admin_users_list;
259
- } else {
260
- $result = array();
261
- $show = 'display_name';
262
-
263
- $args = array(
264
- 'fields' => array( 'ID', $show, 'user_login' ),
265
- 'orderby' => 'display_name',
266
- 'order' => 'ASC',
267
- );
268
-
269
- $users = get_users( apply_filters( PT_CV_PREFIX_ . 'user_list', $args ) );
270
- foreach ( (array) $users as $user ) {
271
- $user->ID = (int) $user->ID;
272
- $display = !empty( $user->$show ) ? $user->$show : '(' . $user->user_login . ')';
273
-
274
- $result[ $user->ID ] = esc_html( $display );
275
- }
276
-
277
- $cv_admin_users_list = $result;
278
- }
279
-
280
- return $result;
281
- }
282
-
283
- /**
284
- * Get available filters for Order by Content item
285
- */
286
- static function post_regular_orderby() {
287
- $regular_orderby = array(
288
- '' => sprintf( '- %s -', __( 'Select' ) ),
289
- 'ID' => __( 'ID', 'content-views-query-and-display-post-page' ),
290
- 'title' => __( 'Title' ),
291
- 'date' => __( 'Published date', 'content-views-query-and-display-post-page' ),
292
- 'modified' => __( 'Modified date', 'content-views-query-and-display-post-page' ),
293
- );
294
-
295
- $result = apply_filters( PT_CV_PREFIX_ . 'regular_orderby', $regular_orderby );
296
-
297
- return $result;
298
- }
299
-
300
- /**
301
- * View type options
302
- *
303
- * @return array
304
- */
305
- static function view_type() {
306
-
307
- $view_type = array(
308
- 'grid' => __( 'Grid', 'content-views-query-and-display-post-page' ),
309
- 'collapsible' => __( 'Collapsible List', 'content-views-query-and-display-post-page' ),
310
- 'scrollable' => __( 'Scrollable List', 'content-views-query-and-display-post-page' ),
311
- );
312
-
313
- $result = apply_filters( PT_CV_PREFIX_ . 'view_type', $view_type );
314
-
315
- return $result;
316
- }
317
-
318
- /**
319
- * Settings of All View Types
320
- *
321
- * @return array
322
- */
323
- static function view_type_settings() {
324
-
325
- $view_type_settings = array();
326
-
327
- // Settings of Grid type
328
- $view_type_settings[ 'grid' ] = PT_CV_Settings::view_type_settings_grid();
329
-
330
- // Settings of Collapsible type
331
- $view_type_settings[ 'collapsible' ] = PT_CV_Settings::view_type_settings_collapsible();
332
-
333
- // Settings of Scrollable type
334
- $view_type_settings[ 'scrollable' ] = PT_CV_Settings::view_type_settings_scrollable();
335
-
336
- $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings', $view_type_settings );
337
-
338
- return $result;
339
- }
340
-
341
- /**
342
- * Layout format options
343
- *
344
- * @return array
345
- */
346
- static function layout_format() {
347
-
348
- $result = array(
349
- '1-col' => __( 'Show thumbnail & text vertically', 'content-views-query-and-display-post-page' ),
350
- '2-col' => __( 'Show thumbnail on the left/right of text', 'content-views-query-and-display-post-page' ),
351
- );
352
-
353
- $result = apply_filters( PT_CV_PREFIX_ . 'layout_format', $result );
354
-
355
- return $result;
356
- }
357
-
358
- /**
359
- * Open in options
360
- */
361
- static function open_in() {
362
-
363
- $open_in = array(
364
- '_self' => __( 'Current tab', 'content-views-query-and-display-post-page' ),
365
- '_blank' => __( 'New tab', 'content-views-query-and-display-post-page' ),
366
- );
367
-
368
- $result = apply_filters( PT_CV_PREFIX_ . 'open_in', $open_in );
369
-
370
- return $result;
371
- }
372
-
373
- /**
374
- * Get all thumbnail sizes
375
- */
376
- static function field_thumbnail_sizes( $_size_name = '' ) {
377
- // All available thumbnail sizes
378
- global $_wp_additional_image_sizes;
379
-
380
- $result = $sizes_to_sort = $dimensions_to_sort = array();
381
-
382
- foreach ( get_intermediate_image_sizes() as $size_name ) {
383
- if ( in_array( $size_name, array( 'thumbnail', 'medium', 'large' ) ) ) {
384
- $this_size = array();
385
- $this_size[] = get_option( $size_name . '_size_w' );
386
- $this_size[] = get_option( $size_name . '_size_h' );
387
-
388
- // Add official sizes to result
389
- $result[ $size_name ] = ucfirst( $size_name ) . ' (' . implode( ' &times; ', $this_size ) . ')';
390
- } else {
391
- if ( isset( $_wp_additional_image_sizes ) && isset( $_wp_additional_image_sizes[ $size_name ] ) ) {
392
-
393
- $this_size = array();
394
- $this_size[ 'width' ] = $_wp_additional_image_sizes[ $size_name ][ 'width' ];
395
- $this_size[ 'height' ] = $_wp_additional_image_sizes[ $size_name ][ 'height' ];
396
-
397
- // Calculate sizes value for sorting
398
- $sizes_value = intval( $this_size[ 'width' ] ) * intval( $this_size[ 'height' ] ) + rand( 1, 10 );
399
-
400
- $dimensions_to_sort[ $sizes_value ] = $size_name;
401
- } else {
402
- $this_size = array( 0, 0 );
403
- }
404
-
405
- $sizes_to_sort[ $size_name ] = ucfirst( preg_replace( '/[\-_]/', ' ', $size_name ) ) . ' (' . implode( ' &times; ', $this_size ) . ')';
406
- }
407
-
408
- if ( !empty( $_size_name ) && $_size_name == $size_name ) {
409
- return $this_size;
410
- }
411
- }
412
- // Add full sizes
413
- $result[ 'full' ] = __( 'Full Size' );
414
-
415
- // Sort custom sizes by index (width * height)
416
- krsort( $dimensions_to_sort );
417
-
418
- // Get array element in ASC sorted order
419
- foreach ( array_reverse( $dimensions_to_sort ) as $size_name ) {
420
- $result[ $size_name ] = $sizes_to_sort[ $size_name ];
421
- }
422
-
423
- $result = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_sizes', $result );
424
-
425
- return $result;
426
- }
427
-
428
- /**
429
- * Thumbnail Position
430
- *
431
- * @return array
432
- */
433
- static function thumbnail_position() {
434
-
435
- $thumbnail_position = array(
436
- 'left' => __( 'Left' ),
437
- 'right' => __( 'Right' ),
438
- );
439
-
440
- $result = apply_filters( PT_CV_PREFIX_ . 'thumbnail_position', $thumbnail_position );
441
-
442
- return $result;
443
- }
444
-
445
- }
446
-
 
447
  }
1
+ <?php
2
+ /**
3
+ * Define values for input, select...
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ if ( !class_exists( 'PT_CV_Values' ) ) {
16
+
17
+ /**
18
+ * @name PT_CV_Values
19
+ * @todo Define values for input, select...
20
+ */
21
+ class PT_CV_Values {
22
+
23
+ /**
24
+ * Get Post Types
25
+ *
26
+ * @param array $args Array of query parameters
27
+ * @param string $excludes_ Array of slug of post types want to exclude from result
28
+ *
29
+ * @return array
30
+ */
31
+ static function post_types( $args = array(), $excludes_ = array() ) {
32
+ $excludes = array_merge( array( 'attachment' ), $excludes_ );
33
+ $result = array();
34
+ $args = array_merge( array( 'public' => true, '_builtin' => true ), $args );
35
+ $args = apply_filters( PT_CV_PREFIX_ . 'post_types', $args );
36
+ $post_types = get_post_types( $args, 'objects' );
37
+
38
+ foreach ( $post_types as $post_type ) {
39
+ if ( in_array( $post_type->name, $excludes ) ) {
40
+ continue;
41
+ }
42
+ $result[ $post_type->name ] = $post_type->labels->singular_name;
43
+ }
44
+
45
+ $result = apply_filters( PT_CV_PREFIX_ . 'post_types_list', $result );
46
+
47
+ return $result;
48
+ }
49
+
50
+ /**
51
+ * Get list of post types and related taxonomies
52
+ *
53
+ * @return array
54
+ */
55
+ static function post_types_vs_taxonomies() {
56
+ // Get post types
57
+ $args = apply_filters( PT_CV_PREFIX_ . 'post_types', array( 'public' => true, 'show_ui' => true, '_builtin' => true ) );
58
+ $post_types = get_post_types( $args );
59
+
60
+ // Get taxonomies of post types
61
+ $result = array();
62
+
63
+ foreach ( $post_types as $post_type ) {
64
+ $taxonomy_names = get_object_taxonomies( $post_type );
65
+ $result[ $post_type ] = $taxonomy_names;
66
+ }
67
+
68
+ return apply_filters( PT_CV_PREFIX_ . 'post_types_taxonomies', $result );
69
+ }
70
+
71
+ /**
72
+ * Get list of taxonomies
73
+ *
74
+ * @param array $args Array of query parameters
75
+ *
76
+ * @return array
77
+ */
78
+ static function taxonomy_list( $args = array() ) {
79
+ $result = array();
80
+ $args = array_merge( array( 'public' => true, 'show_ui' => true, '_builtin' => true ), $args );
81
+ $args = apply_filters( PT_CV_PREFIX_ . 'taxonomy_query_args', $args );
82
+ $taxonomies = get_taxonomies( $args, 'objects' );
83
+
84
+ foreach ( $taxonomies as $taxonomy ) {
85
+ $result[ $taxonomy->name ] = !empty( $taxonomy->label ) ? $taxonomy->label : $taxonomy->labels->singular_name;
86
+ }
87
+
88
+ return apply_filters( PT_CV_PREFIX_ . 'tax_list', $result );
89
+ }
90
+
91
+ /**
92
+ * The logical relationship between taxonomies
93
+ *
94
+ * @return array
95
+ */
96
+ static function taxonomy_relation() {
97
+ return array(
98
+ 'AND' => __( 'AND', 'content-views-query-and-display-post-page' ),
99
+ 'OR' => __( 'OR', 'content-views-query-and-display-post-page' ),
100
+ );
101
+ }
102
+
103
+ /**
104
+ * Operator to join. Possible values are 'IN'(default), 'NOT IN', 'AND'.
105
+ * @return type
106
+ */
107
+ static function taxonomy_operators() {
108
+ return array(
109
+ 'IN' => __( 'IN - show posts which match ANY selected terms', 'content-views-query-and-display-post-page' ),
110
+ 'NOT IN' => __( 'NOT IN - show posts which DO NOT match ANY selected terms', 'content-views-query-and-display-post-page' ),
111
+ 'AND' => __( 'AND - show posts which match ALL selected terms', 'content-views-query-and-display-post-page' ),
112
+ );
113
+ }
114
+
115
+ /**
116
+ * Get taxonomy information
117
+ *
118
+ * @param string $taxonomy The name of the taxonomy
119
+ * @param string $info Field of metadata want to retrieve
120
+ *
121
+ * @return string | array
122
+ */
123
+ static function taxonomy_info( $taxonomy, $info ) {
124
+ $data = get_taxonomy( $taxonomy );
125
+
126
+ if ( isset( $data->$info ) ) {
127
+ $result = $data->$info;
128
+ } else {
129
+ if ( isset( $data->labels->$info ) ) {
130
+ $result = $data->labels->$info;
131
+ }
132
+ }
133
+
134
+ return isset( $result ) ? $result : NULL;
135
+ }
136
+
137
+ /**
138
+ * Get terms of one/many taxonomies
139
+ *
140
+ * @param string $taxonomy The name of the taxonomy
141
+ * @param string $terms_of_taxonomies Array of terms of taxonomies
142
+ * @param array $args Array of query parameters
143
+ */
144
+ static function term_of_taxonomy( $taxonomy, &$terms_of_taxonomies, $args = array(), $data = 'name' ) {
145
+ $args = array_merge( array( 'hide_empty' => false ), $args );
146
+ $terms = get_terms( array( $taxonomy ), $args );
147
+
148
+ $term_slug_name = array();
149
+ foreach ( $terms as $term ) {
150
+ $term_slug_name[ $term->slug ] = ($data === 'name') ? $term->name : $term;
151
+ }
152
+
153
+ // Sort values of param by saved order
154
+ $term_slug_name = apply_filters( PT_CV_PREFIX_ . 'settings_sort_single', $term_slug_name, $taxonomy . '-' . 'terms' );
155
+
156
+ $terms_of_taxonomies[ $taxonomy ] = array_filter( $term_slug_name ); /* prevent term with empty name */
157
+ }
158
+
159
+ /**
160
+ * Yes no options
161
+ *
162
+ * @return array
163
+ */
164
+ static function yes_no( $key = '', $value = '' ) {
165
+ $result = array(
166
+ 'yes' => __( 'Yes', 'content-views-query-and-display-post-page' ),
167
+ 'no' => __( 'No', 'content-views-query-and-display-post-page' ),
168
+ );
169
+ if ( !empty( $key ) ) {
170
+ return array( $key => empty( $value ) ? $result[ $key ] : $value );
171
+ }
172
+
173
+ return $result;
174
+ }
175
+
176
+ /**
177
+ * Paging types
178
+ *
179
+ * @return array
180
+ */
181
+ static function pagination_types() {
182
+ $result = array(
183
+ 'ajax' => __( 'Ajax', 'content-views-query-and-display-post-page' ),
184
+ 'normal' => __( 'Normal', 'content-views-query-and-display-post-page' ),
185
+ );
186
+
187
+ $result = apply_filters( PT_CV_PREFIX_ . 'pagination_types', $result );
188
+
189
+ return $result;
190
+ }
191
+
192
+ /**
193
+ * Paging styles
194
+ *
195
+ * @return array
196
+ */
197
+ static function pagination_styles() {
198
+ $result = array(
199
+ 'regular' => __( 'Numbered pagination', 'content-views-query-and-display-post-page' ),
200
+ );
201
+
202
+ $result = apply_filters( PT_CV_PREFIX_ . 'pagination_styles', $result );
203
+
204
+ return $result;
205
+ }
206
+
207
+ /**
208
+ * Order options
209
+ *
210
+ * @return array
211
+ */
212
+ static function orders() {
213
+ return array(
214
+ 'asc' => __( 'Ascending' ),
215
+ 'desc' => __( 'Descending' ),
216
+ );
217
+ }
218
+
219
+ /**
220
+ * List post status
221
+ */
222
+ static function post_statuses() {
223
+ $result = array();
224
+ $statuses = get_post_stati( null, 'objects' );
225
+ foreach ( $statuses as $status => $object ) {
226
+ $result[ $status ] = ucfirst( $object->label );
227
+ }
228
+
229
+ return $result;
230
+ }
231
+
232
+ /**
233
+ * Advanced filters options
234
+ *
235
+ * @return array
236
+ */
237
+ static function advanced_settings() {
238
+ return apply_filters(
239
+ PT_CV_PREFIX_ . 'advanced_settings', array(
240
+ 'taxonomy' => __( 'Taxonomy', 'content-views-query-and-display-post-page' ) . sprintf( ' (%s, %s...)', __( 'Categories' ), __( 'Tags' ) ),
241
+ 'status' => __( 'Status' ),
242
+ 'order' => __( 'Sort by', 'content-views-query-and-display-post-page' ),
243
+ 'search' => __( 'Keyword' ),
244
+ 'author' => __( 'Author' ),
245
+ )
246
+ );
247
+ }
248
+
249
+ /**
250
+ * Show WP author dropdown list
251
+ *
252
+ * @return array
253
+ */
254
+ static function user_list() {
255
+ global $cv_admin_users_list;
256
+
257
+ if ( !empty( $cv_admin_users_list ) ) {
258
+ $result = $cv_admin_users_list;
259
+ } else {
260
+ $result = array();
261
+ $show = 'display_name';
262
+
263
+ $args = array(
264
+ 'fields' => array( 'ID', $show, 'user_login' ),
265
+ 'orderby' => 'display_name',
266
+ 'order' => 'ASC',
267
+ 'number' => 1000,
268
+ );
269
+
270
+ $users = get_users( apply_filters( PT_CV_PREFIX_ . 'user_list', $args ) );
271
+ foreach ( (array) $users as $user ) {
272
+ $user->ID = (int) $user->ID;
273
+ $display = !empty( $user->$show ) ? $user->$show : '(' . $user->user_login . ')';
274
+
275
+ $result[ $user->ID ] = esc_html( $display );
276
+ }
277
+
278
+ $cv_admin_users_list = $result;
279
+ }
280
+
281
+ return $result;
282
+ }
283
+
284
+ /**
285
+ * Get available filters for Order by Content item
286
+ */
287
+ static function post_regular_orderby() {
288
+ $regular_orderby = array(
289
+ '' => sprintf( '- %s -', __( 'Select' ) ),
290
+ 'ID' => __( 'ID', 'content-views-query-and-display-post-page' ),
291
+ 'title' => __( 'Title' ),
292
+ 'date' => __( 'Published date', 'content-views-query-and-display-post-page' ),
293
+ 'modified' => __( 'Modified date', 'content-views-query-and-display-post-page' ),
294
+ );
295
+
296
+ $result = apply_filters( PT_CV_PREFIX_ . 'regular_orderby', $regular_orderby );
297
+
298
+ return $result;
299
+ }
300
+
301
+ /**
302
+ * View type options
303
+ *
304
+ * @return array
305
+ */
306
+ static function view_type() {
307
+
308
+ $view_type = array(
309
+ 'grid' => __( 'Grid', 'content-views-query-and-display-post-page' ),
310
+ 'collapsible' => __( 'Collapsible List', 'content-views-query-and-display-post-page' ),
311
+ 'scrollable' => __( 'Scrollable List', 'content-views-query-and-display-post-page' ),
312
+ );
313
+
314
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_type', $view_type );
315
+
316
+ return $result;
317
+ }
318
+
319
+ /**
320
+ * Settings of All View Types
321
+ *
322
+ * @return array
323
+ */
324
+ static function view_type_settings() {
325
+
326
+ $view_type_settings = array();
327
+
328
+ // Settings of Grid type
329
+ $view_type_settings[ 'grid' ] = PT_CV_Settings::view_type_settings_grid();
330
+
331
+ // Settings of Collapsible type
332
+ $view_type_settings[ 'collapsible' ] = PT_CV_Settings::view_type_settings_collapsible();
333
+
334
+ // Settings of Scrollable type
335
+ $view_type_settings[ 'scrollable' ] = PT_CV_Settings::view_type_settings_scrollable();
336
+
337
+ $result = apply_filters( PT_CV_PREFIX_ . 'view_type_settings', $view_type_settings );
338
+
339
+ return $result;
340
+ }
341
+
342
+ /**
343
+ * Layout format options
344
+ *
345
+ * @return array
346
+ */
347
+ static function layout_format() {
348
+
349
+ $result = array(
350
+ '1-col' => __( 'Show thumbnail & text vertically', 'content-views-query-and-display-post-page' ),
351
+ '2-col' => __( 'Show thumbnail on the left/right of text', 'content-views-query-and-display-post-page' ),
352
+ );
353
+
354
+ $result = apply_filters( PT_CV_PREFIX_ . 'layout_format', $result );
355
+
356
+ return $result;
357
+ }
358
+
359
+ /**
360
+ * Open in options
361
+ */
362
+ static function open_in() {
363
+
364
+ $open_in = array(
365
+ '_self' => __( 'Current tab', 'content-views-query-and-display-post-page' ),
366
+ '_blank' => __( 'New tab', 'content-views-query-and-display-post-page' ),
367
+ );
368
+
369
+ $result = apply_filters( PT_CV_PREFIX_ . 'open_in', $open_in );
370
+
371
+ return $result;
372
+ }
373
+
374
+ /**
375
+ * Get all thumbnail sizes
376
+ */
377
+ static function field_thumbnail_sizes( $_size_name = '' ) {
378
+ // All available thumbnail sizes
379
+ global $_wp_additional_image_sizes;
380
+
381
+ $result = $sizes_to_sort = $dimensions_to_sort = array();
382
+
383
+ foreach ( get_intermediate_image_sizes() as $size_name ) {
384
+ if ( in_array( $size_name, array( 'thumbnail', 'medium', 'large' ) ) ) {
385
+ $this_size = array();
386
+ $this_size[] = get_option( $size_name . '_size_w' );
387
+ $this_size[] = get_option( $size_name . '_size_h' );
388
+
389
+ // Add official sizes to result
390
+ $result[ $size_name ] = ucfirst( $size_name ) . ' (' . implode( ' &times; ', $this_size ) . ')';
391
+ } else {
392
+ if ( isset( $_wp_additional_image_sizes ) && isset( $_wp_additional_image_sizes[ $size_name ] ) ) {
393
+
394
+ $this_size = array();
395
+ $this_size[ 'width' ] = $_wp_additional_image_sizes[ $size_name ][ 'width' ];
396
+ $this_size[ 'height' ] = $_wp_additional_image_sizes[ $size_name ][ 'height' ];
397
+
398
+ // Calculate sizes value for sorting
399
+ $sizes_value = intval( $this_size[ 'width' ] ) * intval( $this_size[ 'height' ] ) + rand( 1, 10 );
400
+
401
+ $dimensions_to_sort[ $sizes_value ] = $size_name;
402
+ } else {
403
+ $this_size = array( 0, 0 );
404
+ }
405
+
406
+ $sizes_to_sort[ $size_name ] = ucfirst( preg_replace( '/[\-_]/', ' ', $size_name ) ) . ' (' . implode( ' &times; ', $this_size ) . ')';
407
+ }
408
+
409
+ if ( !empty( $_size_name ) && $_size_name == $size_name ) {
410
+ return $this_size;
411
+ }
412
+ }
413
+ // Add full sizes
414
+ $result[ 'full' ] = __( 'Full Size' );
415
+
416
+ // Sort custom sizes by index (width * height)
417
+ krsort( $dimensions_to_sort );
418
+
419
+ // Get array element in ASC sorted order
420
+ foreach ( array_reverse( $dimensions_to_sort ) as $size_name ) {
421
+ $result[ $size_name ] = $sizes_to_sort[ $size_name ];
422
+ }
423
+
424
+ $result = apply_filters( PT_CV_PREFIX_ . 'field_thumbnail_sizes', $result );
425
+
426
+ return $result;
427
+ }
428
+
429
+ /**
430
+ * Thumbnail Position
431
+ *
432
+ * @return array
433
+ */
434
+ static function thumbnail_position() {
435
+
436
+ $thumbnail_position = array(
437
+ 'left' => __( 'Left' ),
438
+ 'right' => __( 'Right' ),
439
+ );
440
+
441
+ $result = apply_filters( PT_CV_PREFIX_ . 'thumbnail_position', $thumbnail_position );
442
+
443
+ return $result;
444
+ }
445
+
446
+ }
447
+
448
  }
public/assets/css/cv.css CHANGED
@@ -1,5 +1,5 @@
1
- /*!
2
- * Bootstrap v3.3.5 (http://getbootstrap.com)
3
- * Copyright 2011-2015 Twitter, Inc.
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.pt-cv-wrapper article,.pt-cv-wrapper aside,.pt-cv-wrapper details,.pt-cv-wrapper figcaption,.pt-cv-wrapper footer,.pt-cv-wrapper header,.pt-cv-wrapper hgroup,.pt-cv-wrapper main,.pt-cv-wrapper menu,.pt-cv-wrapper nav,.pt-cv-wrapper section,.pt-cv-wrapper summary{display:block}.pt-cv-wrapper audio,.pt-cv-wrapper canvas,.pt-cv-wrapper progress,.pt-cv-wrapper video{display:inline-block;vertical-align:baseline}.pt-cv-wrapper audio:not([controls]){display:none;height:0}.pt-cv-wrapper [hidden],.pt-cv-wrapper template{display:none}.pt-cv-wrapper a{background-color:transparent}.pt-cv-wrapper a:active,.pt-cv-wrapper a:hover{outline:0}.pt-cv-wrapper abbr[title]{border-bottom:1px dotted}.pt-cv-wrapper b,.pt-cv-wrapper strong{font-weight:700}.pt-cv-wrapper dfn{font-style:italic}.pt-cv-wrapper h1{margin:.67em 0}.pt-cv-wrapper mark{background:#ff0;color:#000}.pt-cv-wrapper small{font-size:80%}.pt-cv-wrapper sub,.pt-cv-wrapper sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.pt-cv-wrapper sup{top:-.5em}.pt-cv-wrapper sub{bottom:-.25em}.pt-cv-wrapper img{border:0}.pt-cv-wrapper svg:not(:root){overflow:hidden}.pt-cv-wrapper hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}.pt-cv-wrapper pre{overflow:auto}.pt-cv-wrapper code,.pt-cv-wrapper kbd,.pt-cv-wrapper pre,.pt-cv-wrapper samp{font-family:monospace,monospace;font-size:1em}.pt-cv-wrapper button,.pt-cv-wrapper input,.pt-cv-wrapper optgroup,.pt-cv-wrapper select,.pt-cv-wrapper textarea{color:inherit;font:inherit;margin:0}.pt-cv-wrapper button{overflow:visible}.pt-cv-wrapper button,.pt-cv-wrapper select{text-transform:none}.pt-cv-wrapper button,.pt-cv-wrapper html input[type=button],.pt-cv-wrapper input[type=reset],.pt-cv-wrapper input[type=submit]{-webkit-appearance:button;cursor:pointer}.pt-cv-wrapper button[disabled],.pt-cv-wrapper html input[disabled]{cursor:default}.pt-cv-wrapper button::-moz-focus-inner,.pt-cv-wrapper input::-moz-focus-inner{border:0;padding:0}.pt-cv-wrapper input{line-height:normal}.pt-cv-wrapper input[type=checkbox],.pt-cv-wrapper input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.pt-cv-wrapper input[type=number]::-webkit-inner-spin-button,.pt-cv-wrapper input[type=number]::-webkit-outer-spin-button{height:auto}.pt-cv-wrapper input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.pt-cv-wrapper input[type=search]::-webkit-search-cancel-button,.pt-cv-wrapper input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.pt-cv-wrapper fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}.pt-cv-wrapper legend{border:0;padding:0}.pt-cv-wrapper textarea{overflow:auto}.pt-cv-wrapper optgroup{font-weight:700}.pt-cv-wrapper table{border-collapse:collapse;border-spacing:0}.pt-cv-wrapper td,.pt-cv-wrapper th{padding:0}@media print{.pt-cv-wrapper *,.pt-cv-wrapper :after,.pt-cv-wrapper :before{background:0 0!important;color:#000!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}.pt-cv-wrapper a,.pt-cv-wrapper a:visited{text-decoration:underline}.pt-cv-wrapper a[href]:after{content:" (" attr(href) ")"}.pt-cv-wrapper abbr[title]:after{content:" (" attr(title) ")"}.pt-cv-wrapper a[href^="javascript:"]:after,.pt-cv-wrapper a[href^="#"]:after{content:""}.pt-cv-wrapper blockquote,.pt-cv-wrapper pre{border:1px solid #999;page-break-inside:avoid}.pt-cv-wrapper thead{display:table-header-group}.pt-cv-wrapper img,.pt-cv-wrapper tr{page-break-inside:avoid}.pt-cv-wrapper img{max-width:100%!important}.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper p{orphans:3;widows:3}.pt-cv-wrapper h2,.pt-cv-wrapper h3{page-break-after:avoid}.pt-cv-wrapper .navbar{display:none}.pt-cv-wrapper .btn>.caret,.pt-cv-wrapper .dropup>.btn>.caret{border-top-color:#000!important}.pt-cv-wrapper .label{border:1px solid #000}.pt-cv-wrapper .table{border-collapse:collapse!important}.pt-cv-wrapper .table td,.pt-cv-wrapper .table th{background-color:#fff!important}.pt-cv-wrapper .table-bordered td,.pt-cv-wrapper .table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.pt-cv-wrapper .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pt-cv-wrapper .glyphicon-asterisk:before{content:"\2a"}.pt-cv-wrapper .glyphicon-plus:before{content:"\2b"}.pt-cv-wrapper .glyphicon-eur:before,.pt-cv-wrapper .glyphicon-euro:before{content:"\20ac"}.pt-cv-wrapper .glyphicon-minus:before{content:"\2212"}.pt-cv-wrapper .glyphicon-cloud:before{content:"\2601"}.pt-cv-wrapper .glyphicon-envelope:before{content:"\2709"}.pt-cv-wrapper .glyphicon-pencil:before{content:"\270f"}.pt-cv-wrapper .glyphicon-glass:before{content:"\e001"}.pt-cv-wrapper .glyphicon-music:before{content:"\e002"}.pt-cv-wrapper .glyphicon-search:before{content:"\e003"}.pt-cv-wrapper .glyphicon-heart:before{content:"\e005"}.pt-cv-wrapper .glyphicon-star:before{content:"\e006"}.pt-cv-wrapper .glyphicon-star-empty:before{content:"\e007"}.pt-cv-wrapper .glyphicon-user:before{content:"\e008"}.pt-cv-wrapper .glyphicon-film:before{content:"\e009"}.pt-cv-wrapper .glyphicon-th-large:before{content:"\e010"}.pt-cv-wrapper .glyphicon-th:before{content:"\e011"}.pt-cv-wrapper .glyphicon-th-list:before{content:"\e012"}.pt-cv-wrapper .glyphicon-ok:before{content:"\e013"}.pt-cv-wrapper .glyphicon-remove:before{content:"\e014"}.pt-cv-wrapper .glyphicon-zoom-in:before{content:"\e015"}.pt-cv-wrapper .glyphicon-zoom-out:before{content:"\e016"}.pt-cv-wrapper .glyphicon-off:before{content:"\e017"}.pt-cv-wrapper .glyphicon-signal:before{content:"\e018"}.pt-cv-wrapper .glyphicon-cog:before{content:"\e019"}.pt-cv-wrapper .glyphicon-trash:before{content:"\e020"}.pt-cv-wrapper .glyphicon-home:before{content:"\e021"}.pt-cv-wrapper .glyphicon-file:before{content:"\e022"}.pt-cv-wrapper .glyphicon-time:before{content:"\e023"}.pt-cv-wrapper .glyphicon-road:before{content:"\e024"}.pt-cv-wrapper .glyphicon-download-alt:before{content:"\e025"}.pt-cv-wrapper .glyphicon-download:before{content:"\e026"}.pt-cv-wrapper .glyphicon-upload:before{content:"\e027"}.pt-cv-wrapper .glyphicon-inbox:before{content:"\e028"}.pt-cv-wrapper .glyphicon-play-circle:before{content:"\e029"}.pt-cv-wrapper .glyphicon-repeat:before{content:"\e030"}.pt-cv-wrapper .glyphicon-refresh:before{content:"\e031"}.pt-cv-wrapper .glyphicon-list-alt:before{content:"\e032"}.pt-cv-wrapper .glyphicon-lock:before{content:"\e033"}.pt-cv-wrapper .glyphicon-flag:before{content:"\e034"}.pt-cv-wrapper .glyphicon-headphones:before{content:"\e035"}.pt-cv-wrapper .glyphicon-volume-off:before{content:"\e036"}.pt-cv-wrapper .glyphicon-volume-down:before{content:"\e037"}.pt-cv-wrapper .glyphicon-volume-up:before{content:"\e038"}.pt-cv-wrapper .glyphicon-qrcode:before{content:"\e039"}.pt-cv-wrapper .glyphicon-barcode:before{content:"\e040"}.pt-cv-wrapper .glyphicon-tag:before{content:"\e041"}.pt-cv-wrapper .glyphicon-tags:before{content:"\e042"}.pt-cv-wrapper .glyphicon-book:before{content:"\e043"}.pt-cv-wrapper .glyphicon-bookmark:before{content:"\e044"}.pt-cv-wrapper .glyphicon-print:before{content:"\e045"}.pt-cv-wrapper .glyphicon-camera:before{content:"\e046"}.pt-cv-wrapper .glyphicon-font:before{content:"\e047"}.pt-cv-wrapper .glyphicon-bold:before{content:"\e048"}.pt-cv-wrapper .glyphicon-italic:before{content:"\e049"}.pt-cv-wrapper .glyphicon-text-height:before{content:"\e050"}.pt-cv-wrapper .glyphicon-text-width:before{content:"\e051"}.pt-cv-wrapper .glyphicon-align-left:before{content:"\e052"}.pt-cv-wrapper .glyphicon-align-center:before{content:"\e053"}.pt-cv-wrapper .glyphicon-align-right:before{content:"\e054"}.pt-cv-wrapper .glyphicon-align-justify:before{content:"\e055"}.pt-cv-wrapper .glyphicon-list:before{content:"\e056"}.pt-cv-wrapper .glyphicon-indent-left:before{content:"\e057"}.pt-cv-wrapper .glyphicon-indent-right:before{content:"\e058"}.pt-cv-wrapper .glyphicon-facetime-video:before{content:"\e059"}.pt-cv-wrapper .glyphicon-picture:before{content:"\e060"}.pt-cv-wrapper .glyphicon-map-marker:before{content:"\e062"}.pt-cv-wrapper .glyphicon-adjust:before{content:"\e063"}.pt-cv-wrapper .glyphicon-tint:before{content:"\e064"}.pt-cv-wrapper .glyphicon-edit:before{content:"\e065"}.pt-cv-wrapper .glyphicon-share:before{content:"\e066"}.pt-cv-wrapper .glyphicon-check:before{content:"\e067"}.pt-cv-wrapper .glyphicon-move:before{content:"\e068"}.pt-cv-wrapper .glyphicon-step-backward:before{content:"\e069"}.pt-cv-wrapper .glyphicon-fast-backward:before{content:"\e070"}.pt-cv-wrapper .glyphicon-backward:before{content:"\e071"}.pt-cv-wrapper .glyphicon-play:before{content:"\e072"}.pt-cv-wrapper .glyphicon-pause:before{content:"\e073"}.pt-cv-wrapper .glyphicon-stop:before{content:"\e074"}.pt-cv-wrapper .glyphicon-forward:before{content:"\e075"}.pt-cv-wrapper .glyphicon-fast-forward:before{content:"\e076"}.pt-cv-wrapper .glyphicon-step-forward:before{content:"\e077"}.pt-cv-wrapper .glyphicon-eject:before{content:"\e078"}.pt-cv-wrapper .glyphicon-chevron-left:before{content:"\e079"}.pt-cv-wrapper .glyphicon-chevron-right:before{content:"\e080"}.pt-cv-wrapper .glyphicon-plus-sign:before{content:"\e081"}.pt-cv-wrapper .glyphicon-minus-sign:before{content:"\e082"}.pt-cv-wrapper .glyphicon-remove-sign:before{content:"\e083"}.pt-cv-wrapper .glyphicon-ok-sign:before{content:"\e084"}.pt-cv-wrapper .glyphicon-question-sign:before{content:"\e085"}.pt-cv-wrapper .glyphicon-info-sign:before{content:"\e086"}.pt-cv-wrapper .glyphicon-screenshot:before{content:"\e087"}.pt-cv-wrapper .glyphicon-remove-circle:before{content:"\e088"}.pt-cv-wrapper .glyphicon-ok-circle:before{content:"\e089"}.pt-cv-wrapper .glyphicon-ban-circle:before{content:"\e090"}.pt-cv-wrapper .glyphicon-arrow-left:before{content:"\e091"}.pt-cv-wrapper .glyphicon-arrow-right:before{content:"\e092"}.pt-cv-wrapper .glyphicon-arrow-up:before{content:"\e093"}.pt-cv-wrapper .glyphicon-arrow-down:before{content:"\e094"}.pt-cv-wrapper .glyphicon-share-alt:before{content:"\e095"}.pt-cv-wrapper .glyphicon-resize-full:before{content:"\e096"}.pt-cv-wrapper .glyphicon-resize-small:before{content:"\e097"}.pt-cv-wrapper .glyphicon-exclamation-sign:before{content:"\e101"}.pt-cv-wrapper .glyphicon-gift:before{content:"\e102"}.pt-cv-wrapper .glyphicon-leaf:before{content:"\e103"}.pt-cv-wrapper .glyphicon-fire:before{content:"\e104"}.pt-cv-wrapper .glyphicon-eye-open:before{content:"\e105"}.pt-cv-wrapper .glyphicon-eye-close:before{content:"\e106"}.pt-cv-wrapper .glyphicon-warning-sign:before{content:"\e107"}.pt-cv-wrapper .glyphicon-plane:before{content:"\e108"}.pt-cv-wrapper .glyphicon-calendar:before{content:"\e109"}.pt-cv-wrapper .glyphicon-random:before{content:"\e110"}.pt-cv-wrapper .glyphicon-comment:before{content:"\e111"}.pt-cv-wrapper .glyphicon-magnet:before{content:"\e112"}.pt-cv-wrapper .glyphicon-chevron-up:before{content:"\e113"}.pt-cv-wrapper .glyphicon-chevron-down:before{content:"\e114"}.pt-cv-wrapper .glyphicon-retweet:before{content:"\e115"}.pt-cv-wrapper .glyphicon-shopping-cart:before{content:"\e116"}.pt-cv-wrapper .glyphicon-folder-close:before{content:"\e117"}.pt-cv-wrapper .glyphicon-folder-open:before{content:"\e118"}.pt-cv-wrapper .glyphicon-resize-vertical:before{content:"\e119"}.pt-cv-wrapper .glyphicon-resize-horizontal:before{content:"\e120"}.pt-cv-wrapper .glyphicon-hdd:before{content:"\e121"}.pt-cv-wrapper .glyphicon-bullhorn:before{content:"\e122"}.pt-cv-wrapper .glyphicon-bell:before{content:"\e123"}.pt-cv-wrapper .glyphicon-certificate:before{content:"\e124"}.pt-cv-wrapper .glyphicon-thumbs-up:before{content:"\e125"}.pt-cv-wrapper .glyphicon-thumbs-down:before{content:"\e126"}.pt-cv-wrapper .glyphicon-hand-right:before{content:"\e127"}.pt-cv-wrapper .glyphicon-hand-left:before{content:"\e128"}.pt-cv-wrapper .glyphicon-hand-up:before{content:"\e129"}.pt-cv-wrapper .glyphicon-hand-down:before{content:"\e130"}.pt-cv-wrapper .glyphicon-circle-arrow-right:before{content:"\e131"}.pt-cv-wrapper .glyphicon-circle-arrow-left:before{content:"\e132"}.pt-cv-wrapper .glyphicon-circle-arrow-up:before{content:"\e133"}.pt-cv-wrapper .glyphicon-circle-arrow-down:before{content:"\e134"}.pt-cv-wrapper .glyphicon-globe:before{content:"\e135"}.pt-cv-wrapper .glyphicon-wrench:before{content:"\e136"}.pt-cv-wrapper .glyphicon-tasks:before{content:"\e137"}.pt-cv-wrapper .glyphicon-filter:before{content:"\e138"}.pt-cv-wrapper .glyphicon-briefcase:before{content:"\e139"}.pt-cv-wrapper .glyphicon-fullscreen:before{content:"\e140"}.pt-cv-wrapper .glyphicon-dashboard:before{content:"\e141"}.pt-cv-wrapper .glyphicon-paperclip:before{content:"\e142"}.pt-cv-wrapper .glyphicon-heart-empty:before{content:"\e143"}.pt-cv-wrapper .glyphicon-link:before{content:"\e144"}.pt-cv-wrapper .glyphicon-phone:before{content:"\e145"}.pt-cv-wrapper .glyphicon-pushpin:before{content:"\e146"}.pt-cv-wrapper .glyphicon-usd:before{content:"\e148"}.pt-cv-wrapper .glyphicon-gbp:before{content:"\e149"}.pt-cv-wrapper .glyphicon-sort:before{content:"\e150"}.pt-cv-wrapper .glyphicon-sort-by-alphabet:before{content:"\e151"}.pt-cv-wrapper .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.pt-cv-wrapper .glyphicon-sort-by-order:before{content:"\e153"}.pt-cv-wrapper .glyphicon-sort-by-order-alt:before{content:"\e154"}.pt-cv-wrapper .glyphicon-sort-by-attributes:before{content:"\e155"}.pt-cv-wrapper .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.pt-cv-wrapper .glyphicon-unchecked:before{content:"\e157"}.pt-cv-wrapper .glyphicon-expand:before{content:"\e158"}.pt-cv-wrapper .glyphicon-collapse-down:before{content:"\e159"}.pt-cv-wrapper .glyphicon-collapse-up:before{content:"\e160"}.pt-cv-wrapper .glyphicon-log-in:before{content:"\e161"}.pt-cv-wrapper .glyphicon-flash:before{content:"\e162"}.pt-cv-wrapper .glyphicon-log-out:before{content:"\e163"}.pt-cv-wrapper .glyphicon-new-window:before{content:"\e164"}.pt-cv-wrapper .glyphicon-record:before{content:"\e165"}.pt-cv-wrapper .glyphicon-save:before{content:"\e166"}.pt-cv-wrapper .glyphicon-open:before{content:"\e167"}.pt-cv-wrapper .glyphicon-saved:before{content:"\e168"}.pt-cv-wrapper .glyphicon-import:before{content:"\e169"}.pt-cv-wrapper .glyphicon-export:before{content:"\e170"}.pt-cv-wrapper .glyphicon-send:before{content:"\e171"}.pt-cv-wrapper .glyphicon-floppy-disk:before{content:"\e172"}.pt-cv-wrapper .glyphicon-floppy-saved:before{content:"\e173"}.pt-cv-wrapper .glyphicon-floppy-remove:before{content:"\e174"}.pt-cv-wrapper .glyphicon-floppy-save:before{content:"\e175"}.pt-cv-wrapper .glyphicon-floppy-open:before{content:"\e176"}.pt-cv-wrapper .glyphicon-credit-card:before{content:"\e177"}.pt-cv-wrapper .glyphicon-transfer:before{content:"\e178"}.pt-cv-wrapper .glyphicon-cutlery:before{content:"\e179"}.pt-cv-wrapper .glyphicon-header:before{content:"\e180"}.pt-cv-wrapper .glyphicon-compressed:before{content:"\e181"}.pt-cv-wrapper .glyphicon-earphone:before{content:"\e182"}.pt-cv-wrapper .glyphicon-phone-alt:before{content:"\e183"}.pt-cv-wrapper .glyphicon-tower:before{content:"\e184"}.pt-cv-wrapper .glyphicon-stats:before{content:"\e185"}.pt-cv-wrapper .glyphicon-sd-video:before{content:"\e186"}.pt-cv-wrapper .glyphicon-hd-video:before{content:"\e187"}.pt-cv-wrapper .glyphicon-subtitles:before{content:"\e188"}.pt-cv-wrapper .glyphicon-sound-stereo:before{content:"\e189"}.pt-cv-wrapper .glyphicon-sound-dolby:before{content:"\e190"}.pt-cv-wrapper .glyphicon-sound-5-1:before{content:"\e191"}.pt-cv-wrapper .glyphicon-sound-6-1:before{content:"\e192"}.pt-cv-wrapper .glyphicon-sound-7-1:before{content:"\e193"}.pt-cv-wrapper .glyphicon-copyright-mark:before{content:"\e194"}.pt-cv-wrapper .glyphicon-registration-mark:before{content:"\e195"}.pt-cv-wrapper .glyphicon-cloud-download:before{content:"\e197"}.pt-cv-wrapper .glyphicon-cloud-upload:before{content:"\e198"}.pt-cv-wrapper .glyphicon-tree-conifer:before{content:"\e199"}.pt-cv-wrapper .glyphicon-tree-deciduous:before{content:"\e200"}.pt-cv-wrapper .glyphicon-cd:before{content:"\e201"}.pt-cv-wrapper .glyphicon-save-file:before{content:"\e202"}.pt-cv-wrapper .glyphicon-open-file:before{content:"\e203"}.pt-cv-wrapper .glyphicon-level-up:before{content:"\e204"}.pt-cv-wrapper .glyphicon-copy:before{content:"\e205"}.pt-cv-wrapper .glyphicon-paste:before{content:"\e206"}.pt-cv-wrapper .glyphicon-alert:before{content:"\e209"}.pt-cv-wrapper .glyphicon-equalizer:before{content:"\e210"}.pt-cv-wrapper .glyphicon-king:before{content:"\e211"}.pt-cv-wrapper .glyphicon-queen:before{content:"\e212"}.pt-cv-wrapper .glyphicon-pawn:before{content:"\e213"}.pt-cv-wrapper .glyphicon-bishop:before{content:"\e214"}.pt-cv-wrapper .glyphicon-knight:before{content:"\e215"}.pt-cv-wrapper .glyphicon-baby-formula:before{content:"\e216"}.pt-cv-wrapper .glyphicon-tent:before{content:"\26fa"}.pt-cv-wrapper .glyphicon-blackboard:before{content:"\e218"}.pt-cv-wrapper .glyphicon-bed:before{content:"\e219"}.pt-cv-wrapper .glyphicon-apple:before{content:"\f8ff"}.pt-cv-wrapper .glyphicon-erase:before{content:"\e221"}.pt-cv-wrapper .glyphicon-hourglass:before{content:"\231b"}.pt-cv-wrapper .glyphicon-lamp:before{content:"\e223"}.pt-cv-wrapper .glyphicon-duplicate:before{content:"\e224"}.pt-cv-wrapper .glyphicon-piggy-bank:before{content:"\e225"}.pt-cv-wrapper .glyphicon-scissors:before{content:"\e226"}.pt-cv-wrapper .glyphicon-bitcoin:before,.pt-cv-wrapper .glyphicon-btc:before,.pt-cv-wrapper .glyphicon-xbt:before{content:"\e227"}.pt-cv-wrapper .glyphicon-jpy:before,.pt-cv-wrapper .glyphicon-yen:before{content:"\00a5"}.pt-cv-wrapper .glyphicon-rub:before,.pt-cv-wrapper .glyphicon-ruble:before{content:"\20bd"}.pt-cv-wrapper .glyphicon-scale:before{content:"\e230"}.pt-cv-wrapper .glyphicon-ice-lolly:before{content:"\e231"}.pt-cv-wrapper .glyphicon-ice-lolly-tasted:before{content:"\e232"}.pt-cv-wrapper .glyphicon-education:before{content:"\e233"}.pt-cv-wrapper .glyphicon-option-horizontal:before{content:"\e234"}.pt-cv-wrapper .glyphicon-option-vertical:before{content:"\e235"}.pt-cv-wrapper .glyphicon-menu-hamburger:before{content:"\e236"}.pt-cv-wrapper .glyphicon-modal-window:before{content:"\e237"}.pt-cv-wrapper .glyphicon-oil:before{content:"\e238"}.pt-cv-wrapper .glyphicon-grain:before{content:"\e239"}.pt-cv-wrapper .glyphicon-sunglasses:before{content:"\e240"}.pt-cv-wrapper .glyphicon-text-size:before{content:"\e241"}.pt-cv-wrapper .glyphicon-text-color:before{content:"\e242"}.pt-cv-wrapper .glyphicon-text-background:before{content:"\e243"}.pt-cv-wrapper .glyphicon-object-align-top:before{content:"\e244"}.pt-cv-wrapper .glyphicon-object-align-bottom:before{content:"\e245"}.pt-cv-wrapper .glyphicon-object-align-horizontal:before{content:"\e246"}.pt-cv-wrapper .glyphicon-object-align-left:before{content:"\e247"}.pt-cv-wrapper .glyphicon-object-align-vertical:before{content:"\e248"}.pt-cv-wrapper .glyphicon-object-align-right:before{content:"\e249"}.pt-cv-wrapper .glyphicon-triangle-right:before{content:"\e250"}.pt-cv-wrapper .glyphicon-triangle-left:before{content:"\e251"}.pt-cv-wrapper .glyphicon-triangle-bottom:before{content:"\e252"}.pt-cv-wrapper .glyphicon-triangle-top:before{content:"\e253"}.pt-cv-wrapper .glyphicon-console:before{content:"\e254"}.pt-cv-wrapper .glyphicon-superscript:before{content:"\e255"}.pt-cv-wrapper .glyphicon-subscript:before{content:"\e256"}.pt-cv-wrapper .glyphicon-menu-left:before{content:"\e257"}.pt-cv-wrapper .glyphicon-menu-right:before{content:"\e258"}.pt-cv-wrapper .glyphicon-menu-down:before{content:"\e259"}.pt-cv-wrapper .glyphicon-menu-up:before{content:"\e260"}.pt-cv-wrapper img{vertical-align:middle}.pt-cv-wrapper .carousel-inner>.item>a>img,.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .img-responsive,.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .thumbnail>img{display:block;max-width:100%;height:auto}.pt-cv-wrapper .img-rounded{border-radius:6px}.pt-cv-wrapper .img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.pt-cv-wrapper .img-circle{border-radius:50%}.pt-cv-wrapper hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.pt-cv-wrapper .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.pt-cv-wrapper .sr-only-focusable:active,.pt-cv-wrapper .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pt-cv-wrapper [role=button]{cursor:pointer}.pt-cv-wrapper .container,.pt-cv-wrapper .container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media(min-width:768px){.pt-cv-wrapper .container{width:750px}}@media(min-width:992px){.pt-cv-wrapper .container{width:970px}}@media(min-width:1200px){.pt-cv-wrapper .container{width:1170px}}.pt-cv-wrapper .row{margin-left:-15px;margin-right:-15px}.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9{float:left}.pt-cv-wrapper .col-xs-12{width:100%}.pt-cv-wrapper .col-xs-11{width:91.66666667%}.pt-cv-wrapper .col-xs-10{width:83.33333333%}.pt-cv-wrapper .col-xs-9{width:75%}.pt-cv-wrapper .col-xs-8{width:66.66666667%}.pt-cv-wrapper .col-xs-7{width:58.33333333%}.pt-cv-wrapper .col-xs-6{width:50%}.pt-cv-wrapper .col-xs-5{width:41.66666667%}.pt-cv-wrapper .col-xs-4{width:33.33333333%}.pt-cv-wrapper .col-xs-3{width:25%}.pt-cv-wrapper .col-xs-2{width:16.66666667%}.pt-cv-wrapper .col-xs-1{width:8.33333333%}.pt-cv-wrapper .col-xs-pull-12{right:100%}.pt-cv-wrapper .col-xs-pull-11{right:91.66666667%}.pt-cv-wrapper .col-xs-pull-10{right:83.33333333%}.pt-cv-wrapper .col-xs-pull-9{right:75%}.pt-cv-wrapper .col-xs-pull-8{right:66.66666667%}.pt-cv-wrapper .col-xs-pull-7{right:58.33333333%}.pt-cv-wrapper .col-xs-pull-6{right:50%}.pt-cv-wrapper .col-xs-pull-5{right:41.66666667%}.pt-cv-wrapper .col-xs-pull-4{right:33.33333333%}.pt-cv-wrapper .col-xs-pull-3{right:25%}.pt-cv-wrapper .col-xs-pull-2{right:16.66666667%}.pt-cv-wrapper .col-xs-pull-1{right:8.33333333%}.pt-cv-wrapper .col-xs-pull-0{right:auto}.pt-cv-wrapper .col-xs-push-12{left:100%}.pt-cv-wrapper .col-xs-push-11{left:91.66666667%}.pt-cv-wrapper .col-xs-push-10{left:83.33333333%}.pt-cv-wrapper .col-xs-push-9{left:75%}.pt-cv-wrapper .col-xs-push-8{left:66.66666667%}.pt-cv-wrapper .col-xs-push-7{left:58.33333333%}.pt-cv-wrapper .col-xs-push-6{left:50%}.pt-cv-wrapper .col-xs-push-5{left:41.66666667%}.pt-cv-wrapper .col-xs-push-4{left:33.33333333%}.pt-cv-wrapper .col-xs-push-3{left:25%}.pt-cv-wrapper .col-xs-push-2{left:16.66666667%}.pt-cv-wrapper .col-xs-push-1{left:8.33333333%}.pt-cv-wrapper .col-xs-push-0{left:auto}.pt-cv-wrapper .col-xs-offset-12{margin-left:100%}.pt-cv-wrapper .col-xs-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-xs-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-xs-offset-9{margin-left:75%}.pt-cv-wrapper .col-xs-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-xs-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-xs-offset-6{margin-left:50%}.pt-cv-wrapper .col-xs-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-xs-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-xs-offset-3{margin-left:25%}.pt-cv-wrapper .col-xs-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-xs-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-xs-offset-0{margin-left:0}@media(min-width:768px){.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9{float:left}.pt-cv-wrapper .col-sm-12{width:100%}.pt-cv-wrapper .col-sm-11{width:91.66666667%}.pt-cv-wrapper .col-sm-10{width:83.33333333%}.pt-cv-wrapper .col-sm-9{width:75%}.pt-cv-wrapper .col-sm-8{width:66.66666667%}.pt-cv-wrapper .col-sm-7{width:58.33333333%}.pt-cv-wrapper .col-sm-6{width:50%}.pt-cv-wrapper .col-sm-5{width:41.66666667%}.pt-cv-wrapper .col-sm-4{width:33.33333333%}.pt-cv-wrapper .col-sm-3{width:25%}.pt-cv-wrapper .col-sm-2{width:16.66666667%}.pt-cv-wrapper .col-sm-1{width:8.33333333%}.pt-cv-wrapper .col-sm-pull-12{right:100%}.pt-cv-wrapper .col-sm-pull-11{right:91.66666667%}.pt-cv-wrapper .col-sm-pull-10{right:83.33333333%}.pt-cv-wrapper .col-sm-pull-9{right:75%}.pt-cv-wrapper .col-sm-pull-8{right:66.66666667%}.pt-cv-wrapper .col-sm-pull-7{right:58.33333333%}.pt-cv-wrapper .col-sm-pull-6{right:50%}.pt-cv-wrapper .col-sm-pull-5{right:41.66666667%}.pt-cv-wrapper .col-sm-pull-4{right:33.33333333%}.pt-cv-wrapper .col-sm-pull-3{right:25%}.pt-cv-wrapper .col-sm-pull-2{right:16.66666667%}.pt-cv-wrapper .col-sm-pull-1{right:8.33333333%}.pt-cv-wrapper .col-sm-pull-0{right:auto}.pt-cv-wrapper .col-sm-push-12{left:100%}.pt-cv-wrapper .col-sm-push-11{left:91.66666667%}.pt-cv-wrapper .col-sm-push-10{left:83.33333333%}.pt-cv-wrapper .col-sm-push-9{left:75%}.pt-cv-wrapper .col-sm-push-8{left:66.66666667%}.pt-cv-wrapper .col-sm-push-7{left:58.33333333%}.pt-cv-wrapper .col-sm-push-6{left:50%}.pt-cv-wrapper .col-sm-push-5{left:41.66666667%}.pt-cv-wrapper .col-sm-push-4{left:33.33333333%}.pt-cv-wrapper .col-sm-push-3{left:25%}.pt-cv-wrapper .col-sm-push-2{left:16.66666667%}.pt-cv-wrapper .col-sm-push-1{left:8.33333333%}.pt-cv-wrapper .col-sm-push-0{left:auto}.pt-cv-wrapper .col-sm-offset-12{margin-left:100%}.pt-cv-wrapper .col-sm-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-sm-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-sm-offset-9{margin-left:75%}.pt-cv-wrapper .col-sm-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-sm-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-sm-offset-6{margin-left:50%}.pt-cv-wrapper .col-sm-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-sm-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-sm-offset-3{margin-left:25%}.pt-cv-wrapper .col-sm-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-sm-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-sm-offset-0{margin-left:0}}@media(min-width:992px){.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9{float:left}.pt-cv-wrapper .col-md-12{width:100%}.pt-cv-wrapper .col-md-11{width:91.66666667%}.pt-cv-wrapper .col-md-10{width:83.33333333%}.pt-cv-wrapper .col-md-9{width:75%}.pt-cv-wrapper .col-md-8{width:66.66666667%}.pt-cv-wrapper .col-md-7{width:58.33333333%}.pt-cv-wrapper .col-md-6{width:50%}.pt-cv-wrapper .col-md-5{width:41.66666667%}.pt-cv-wrapper .col-md-4{width:33.33333333%}.pt-cv-wrapper .col-md-3{width:25%}.pt-cv-wrapper .col-md-2{width:16.66666667%}.pt-cv-wrapper .col-md-1{width:8.33333333%}.pt-cv-wrapper .col-md-pull-12{right:100%}.pt-cv-wrapper .col-md-pull-11{right:91.66666667%}.pt-cv-wrapper .col-md-pull-10{right:83.33333333%}.pt-cv-wrapper .col-md-pull-9{right:75%}.pt-cv-wrapper .col-md-pull-8{right:66.66666667%}.pt-cv-wrapper .col-md-pull-7{right:58.33333333%}.pt-cv-wrapper .col-md-pull-6{right:50%}.pt-cv-wrapper .col-md-pull-5{right:41.66666667%}.pt-cv-wrapper .col-md-pull-4{right:33.33333333%}.pt-cv-wrapper .col-md-pull-3{right:25%}.pt-cv-wrapper .col-md-pull-2{right:16.66666667%}.pt-cv-wrapper .col-md-pull-1{right:8.33333333%}.pt-cv-wrapper .col-md-pull-0{right:auto}.pt-cv-wrapper .col-md-push-12{left:100%}.pt-cv-wrapper .col-md-push-11{left:91.66666667%}.pt-cv-wrapper .col-md-push-10{left:83.33333333%}.pt-cv-wrapper .col-md-push-9{left:75%}.pt-cv-wrapper .col-md-push-8{left:66.66666667%}.pt-cv-wrapper .col-md-push-7{left:58.33333333%}.pt-cv-wrapper .col-md-push-6{left:50%}.pt-cv-wrapper .col-md-push-5{left:41.66666667%}.pt-cv-wrapper .col-md-push-4{left:33.33333333%}.pt-cv-wrapper .col-md-push-3{left:25%}.pt-cv-wrapper .col-md-push-2{left:16.66666667%}.pt-cv-wrapper .col-md-push-1{left:8.33333333%}.pt-cv-wrapper .col-md-push-0{left:auto}.pt-cv-wrapper .col-md-offset-12{margin-left:100%}.pt-cv-wrapper .col-md-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-md-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-md-offset-9{margin-left:75%}.pt-cv-wrapper .col-md-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-md-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-md-offset-6{margin-left:50%}.pt-cv-wrapper .col-md-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-md-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-md-offset-3{margin-left:25%}.pt-cv-wrapper .col-md-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-md-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-md-offset-0{margin-left:0}}@media(min-width:1200px){.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9{float:left}.pt-cv-wrapper .col-lg-12{width:100%}.pt-cv-wrapper .col-lg-11{width:91.66666667%}.pt-cv-wrapper .col-lg-10{width:83.33333333%}.pt-cv-wrapper .col-lg-9{width:75%}.pt-cv-wrapper .col-lg-8{width:66.66666667%}.pt-cv-wrapper .col-lg-7{width:58.33333333%}.pt-cv-wrapper .col-lg-6{width:50%}.pt-cv-wrapper .col-lg-5{width:41.66666667%}.pt-cv-wrapper .col-lg-4{width:33.33333333%}.pt-cv-wrapper .col-lg-3{width:25%}.pt-cv-wrapper .col-lg-2{width:16.66666667%}.pt-cv-wrapper .col-lg-1{width:8.33333333%}.pt-cv-wrapper .col-lg-pull-12{right:100%}.pt-cv-wrapper .col-lg-pull-11{right:91.66666667%}.pt-cv-wrapper .col-lg-pull-10{right:83.33333333%}.pt-cv-wrapper .col-lg-pull-9{right:75%}.pt-cv-wrapper .col-lg-pull-8{right:66.66666667%}.pt-cv-wrapper .col-lg-pull-7{right:58.33333333%}.pt-cv-wrapper .col-lg-pull-6{right:50%}.pt-cv-wrapper .col-lg-pull-5{right:41.66666667%}.pt-cv-wrapper .col-lg-pull-4{right:33.33333333%}.pt-cv-wrapper .col-lg-pull-3{right:25%}.pt-cv-wrapper .col-lg-pull-2{right:16.66666667%}.pt-cv-wrapper .col-lg-pull-1{right:8.33333333%}.pt-cv-wrapper .col-lg-pull-0{right:auto}.pt-cv-wrapper .col-lg-push-12{left:100%}.pt-cv-wrapper .col-lg-push-11{left:91.66666667%}.pt-cv-wrapper .col-lg-push-10{left:83.33333333%}.pt-cv-wrapper .col-lg-push-9{left:75%}.pt-cv-wrapper .col-lg-push-8{left:66.66666667%}.pt-cv-wrapper .col-lg-push-7{left:58.33333333%}.pt-cv-wrapper .col-lg-push-6{left:50%}.pt-cv-wrapper .col-lg-push-5{left:41.66666667%}.pt-cv-wrapper .col-lg-push-4{left:33.33333333%}.pt-cv-wrapper .col-lg-push-3{left:25%}.pt-cv-wrapper .col-lg-push-2{left:16.66666667%}.pt-cv-wrapper .col-lg-push-1{left:8.33333333%}.pt-cv-wrapper .col-lg-push-0{left:auto}.pt-cv-wrapper .col-lg-offset-12{margin-left:100%}.pt-cv-wrapper .col-lg-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-lg-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-lg-offset-9{margin-left:75%}.pt-cv-wrapper .col-lg-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-lg-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-lg-offset-6{margin-left:50%}.pt-cv-wrapper .col-lg-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-lg-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-lg-offset-3{margin-left:25%}.pt-cv-wrapper .col-lg-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-lg-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-lg-offset-0{margin-left:0}}.pt-cv-wrapper .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pt-cv-wrapper .btn.active.focus,.pt-cv-wrapper .btn.active:focus,.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:active.focus,.pt-cv-wrapper .btn:active:focus,.pt-cv-wrapper .btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn:hover{color:#333;text-decoration:none}.pt-cv-wrapper .btn.active,.pt-cv-wrapper .btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.pt-cv-wrapper .btn.disabled,.pt-cv-wrapper .btn[disabled],.pt-cv-wrapper fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper a.btn.disabled,.pt-cv-wrapper fieldset[disabled] a.btn{pointer-events:none}.pt-cv-wrapper .btn-default{color:#333;background-color:#fff;border-color:#ccc}.pt-cv-wrapper .btn-default.focus,.pt-cv-wrapper .btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.pt-cv-wrapper .btn-default.active.focus,.pt-cv-wrapper .btn-default.active:focus,.pt-cv-wrapper .btn-default.active:hover,.pt-cv-wrapper .btn-default:active.focus,.pt-cv-wrapper .btn-default:active:focus,.pt-cv-wrapper .btn-default:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{background-image:none}.pt-cv-wrapper .btn-default.disabled,.pt-cv-wrapper .btn-default.disabled.active,.pt-cv-wrapper .btn-default.disabled.focus,.pt-cv-wrapper .btn-default.disabled:active,.pt-cv-wrapper .btn-default.disabled:focus,.pt-cv-wrapper .btn-default.disabled:hover,.pt-cv-wrapper .btn-default[disabled],.pt-cv-wrapper .btn-default[disabled].active,.pt-cv-wrapper .btn-default[disabled].focus,.pt-cv-wrapper .btn-default[disabled]:active,.pt-cv-wrapper .btn-default[disabled]:focus,.pt-cv-wrapper .btn-default[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-default,.pt-cv-wrapper fieldset[disabled] .btn-default.active,.pt-cv-wrapper fieldset[disabled] .btn-default.focus,.pt-cv-wrapper fieldset[disabled] .btn-default:active,.pt-cv-wrapper fieldset[disabled] .btn-default:focus,.pt-cv-wrapper fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.pt-cv-wrapper .btn-default .badge{color:#fff;background-color:#333}.pt-cv-wrapper .btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.pt-cv-wrapper .btn-primary.focus,.pt-cv-wrapper .btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.pt-cv-wrapper .btn-primary.active.focus,.pt-cv-wrapper .btn-primary.active:focus,.pt-cv-wrapper .btn-primary.active:hover,.pt-cv-wrapper .btn-primary:active.focus,.pt-cv-wrapper .btn-primary:active:focus,.pt-cv-wrapper .btn-primary:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{background-image:none}.pt-cv-wrapper .btn-primary.disabled,.pt-cv-wrapper .btn-primary.disabled.active,.pt-cv-wrapper .btn-primary.disabled.focus,.pt-cv-wrapper .btn-primary.disabled:active,.pt-cv-wrapper .btn-primary.disabled:focus,.pt-cv-wrapper .btn-primary.disabled:hover,.pt-cv-wrapper .btn-primary[disabled],.pt-cv-wrapper .btn-primary[disabled].active,.pt-cv-wrapper .btn-primary[disabled].focus,.pt-cv-wrapper .btn-primary[disabled]:active,.pt-cv-wrapper .btn-primary[disabled]:focus,.pt-cv-wrapper .btn-primary[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-primary,.pt-cv-wrapper fieldset[disabled] .btn-primary.active,.pt-cv-wrapper fieldset[disabled] .btn-primary.focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:active,.pt-cv-wrapper fieldset[disabled] .btn-primary:focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.pt-cv-wrapper .btn-primary .badge{color:#337ab7;background-color:#fff}.pt-cv-wrapper .btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.pt-cv-wrapper .btn-success.focus,.pt-cv-wrapper .btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.pt-cv-wrapper .btn-success.active.focus,.pt-cv-wrapper .btn-success.active:focus,.pt-cv-wrapper .btn-success.active:hover,.pt-cv-wrapper .btn-success:active.focus,.pt-cv-wrapper .btn-success:active:focus,.pt-cv-wrapper .btn-success:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{background-image:none}.pt-cv-wrapper .btn-success.disabled,.pt-cv-wrapper .btn-success.disabled.active,.pt-cv-wrapper .btn-success.disabled.focus,.pt-cv-wrapper .btn-success.disabled:active,.pt-cv-wrapper .btn-success.disabled:focus,.pt-cv-wrapper .btn-success.disabled:hover,.pt-cv-wrapper .btn-success[disabled],.pt-cv-wrapper .btn-success[disabled].active,.pt-cv-wrapper .btn-success[disabled].focus,.pt-cv-wrapper .btn-success[disabled]:active,.pt-cv-wrapper .btn-success[disabled]:focus,.pt-cv-wrapper .btn-success[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-success,.pt-cv-wrapper fieldset[disabled] .btn-success.active,.pt-cv-wrapper fieldset[disabled] .btn-success.focus,.pt-cv-wrapper fieldset[disabled] .btn-success:active,.pt-cv-wrapper fieldset[disabled] .btn-success:focus,.pt-cv-wrapper fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.pt-cv-wrapper .btn-success .badge{color:#5cb85c;background-color:#fff}.pt-cv-wrapper .btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.pt-cv-wrapper .btn-info.focus,.pt-cv-wrapper .btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.pt-cv-wrapper .btn-info.active.focus,.pt-cv-wrapper .btn-info.active:focus,.pt-cv-wrapper .btn-info.active:hover,.pt-cv-wrapper .btn-info:active.focus,.pt-cv-wrapper .btn-info:active:focus,.pt-cv-wrapper .btn-info:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{background-image:none}.pt-cv-wrapper .btn-info.disabled,.pt-cv-wrapper .btn-info.disabled.active,.pt-cv-wrapper .btn-info.disabled.focus,.pt-cv-wrapper .btn-info.disabled:active,.pt-cv-wrapper .btn-info.disabled:focus,.pt-cv-wrapper .btn-info.disabled:hover,.pt-cv-wrapper .btn-info[disabled],.pt-cv-wrapper .btn-info[disabled].active,.pt-cv-wrapper .btn-info[disabled].focus,.pt-cv-wrapper .btn-info[disabled]:active,.pt-cv-wrapper .btn-info[disabled]:focus,.pt-cv-wrapper .btn-info[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-info,.pt-cv-wrapper fieldset[disabled] .btn-info.active,.pt-cv-wrapper fieldset[disabled] .btn-info.focus,.pt-cv-wrapper fieldset[disabled] .btn-info:active,.pt-cv-wrapper fieldset[disabled] .btn-info:focus,.pt-cv-wrapper fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.pt-cv-wrapper .btn-info .badge{color:#5bc0de;background-color:#fff}.pt-cv-wrapper .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.pt-cv-wrapper .btn-warning.focus,.pt-cv-wrapper .btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.pt-cv-wrapper .btn-warning.active.focus,.pt-cv-wrapper .btn-warning.active:focus,.pt-cv-wrapper .btn-warning.active:hover,.pt-cv-wrapper .btn-warning:active.focus,.pt-cv-wrapper .btn-warning:active:focus,.pt-cv-wrapper .btn-warning:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{background-image:none}.pt-cv-wrapper .btn-warning.disabled,.pt-cv-wrapper .btn-warning.disabled.active,.pt-cv-wrapper .btn-warning.disabled.focus,.pt-cv-wrapper .btn-warning.disabled:active,.pt-cv-wrapper .btn-warning.disabled:focus,.pt-cv-wrapper .btn-warning.disabled:hover,.pt-cv-wrapper .btn-warning[disabled],.pt-cv-wrapper .btn-warning[disabled].active,.pt-cv-wrapper .btn-warning[disabled].focus,.pt-cv-wrapper .btn-warning[disabled]:active,.pt-cv-wrapper .btn-warning[disabled]:focus,.pt-cv-wrapper .btn-warning[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-warning,.pt-cv-wrapper fieldset[disabled] .btn-warning.active,.pt-cv-wrapper fieldset[disabled] .btn-warning.focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:active,.pt-cv-wrapper fieldset[disabled] .btn-warning:focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.pt-cv-wrapper .btn-warning .badge{color:#f0ad4e;background-color:#fff}.pt-cv-wrapper .btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.pt-cv-wrapper .btn-danger.focus,.pt-cv-wrapper .btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.pt-cv-wrapper .btn-danger.active.focus,.pt-cv-wrapper .btn-danger.active:focus,.pt-cv-wrapper .btn-danger.active:hover,.pt-cv-wrapper .btn-danger:active.focus,.pt-cv-wrapper .btn-danger:active:focus,.pt-cv-wrapper .btn-danger:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{background-image:none}.pt-cv-wrapper .btn-danger.disabled,.pt-cv-wrapper .btn-danger.disabled.active,.pt-cv-wrapper .btn-danger.disabled.focus,.pt-cv-wrapper .btn-danger.disabled:active,.pt-cv-wrapper .btn-danger.disabled:focus,.pt-cv-wrapper .btn-danger.disabled:hover,.pt-cv-wrapper .btn-danger[disabled],.pt-cv-wrapper .btn-danger[disabled].active,.pt-cv-wrapper .btn-danger[disabled].focus,.pt-cv-wrapper .btn-danger[disabled]:active,.pt-cv-wrapper .btn-danger[disabled]:focus,.pt-cv-wrapper .btn-danger[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-danger,.pt-cv-wrapper fieldset[disabled] .btn-danger.active,.pt-cv-wrapper fieldset[disabled] .btn-danger.focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:active,.pt-cv-wrapper fieldset[disabled] .btn-danger:focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.pt-cv-wrapper .btn-danger .badge{color:#d9534f;background-color:#fff}.pt-cv-wrapper .btn-link{color:#337ab7;font-weight:400;border-radius:0}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link.active,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link[disabled],.pt-cv-wrapper fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:hover{border-color:transparent}.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.pt-cv-wrapper .btn-link[disabled]:focus,.pt-cv-wrapper .btn-link[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-link:focus,.pt-cv-wrapper fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.pt-cv-wrapper .btn-group-lg>.btn,.pt-cv-wrapper .btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.pt-cv-wrapper .btn-group-sm>.btn,.pt-cv-wrapper .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.pt-cv-wrapper .btn-group-xs>.btn,.pt-cv-wrapper .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.pt-cv-wrapper .btn-block{display:block;width:100%}.pt-cv-wrapper .btn-block+.btn-block{margin-top:5px}.pt-cv-wrapper input[type=button].btn-block,.pt-cv-wrapper input[type=reset].btn-block,.pt-cv-wrapper input[type=submit].btn-block{width:100%}.pt-cv-wrapper .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.pt-cv-wrapper .fade.in{opacity:1}.pt-cv-wrapper .collapse{display:none}.pt-cv-wrapper .collapse.in{display:block}.pt-cv-wrapper tr.collapse.in{display:table-row}.pt-cv-wrapper tbody.collapse.in{display:table-row-group}.pt-cv-wrapper .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.pt-cv-wrapper .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.pt-cv-wrapper .dropdown,.pt-cv-wrapper .dropup{position:relative}.pt-cv-wrapper .dropdown-toggle:focus{outline:0}.pt-cv-wrapper .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);-webkit-background-clip:padding-box;background-clip:padding-box}.pt-cv-wrapper .dropdown-menu.pull-right{right:0;left:auto}.pt-cv-wrapper .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.pt-cv-wrapper .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.pt-cv-wrapper .dropdown-menu>li>a:focus,.pt-cv-wrapper .dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.pt-cv-wrapper .dropdown-menu>.active>a,.pt-cv-wrapper .dropdown-menu>.active>a:focus,.pt-cv-wrapper .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.pt-cv-wrapper .dropdown-menu>.disabled>a,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover{color:#777}.pt-cv-wrapper .dropdown-menu>.disabled>a:focus,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.pt-cv-wrapper .open>.dropdown-menu{display:block}.pt-cv-wrapper .open>a{outline:0}.pt-cv-wrapper .dropdown-menu-right{left:auto;right:0}.pt-cv-wrapper .dropdown-menu-left{left:0;right:auto}.pt-cv-wrapper .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.pt-cv-wrapper .dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pt-cv-wrapper .pull-right>.dropdown-menu{right:0;left:auto}.pt-cv-wrapper .dropup .caret,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.pt-cv-wrapper .dropup .dropdown-menu,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media(min-width:768px){.pt-cv-wrapper .navbar-right .dropdown-menu{left:auto;right:0}.pt-cv-wrapper .navbar-right .dropdown-menu-left{left:0;right:auto}}.pt-cv-wrapper .btn-group,.pt-cv-wrapper .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group>.btn{position:relative;float:left}.pt-cv-wrapper .btn-group-vertical>.btn.active,.pt-cv-wrapper .btn-group-vertical>.btn:active,.pt-cv-wrapper .btn-group-vertical>.btn:focus,.pt-cv-wrapper .btn-group-vertical>.btn:hover,.pt-cv-wrapper .btn-group>.btn.active,.pt-cv-wrapper .btn-group>.btn:active,.pt-cv-wrapper .btn-group>.btn:focus,.pt-cv-wrapper .btn-group>.btn:hover{z-index:2}.pt-cv-wrapper .btn-group .btn+.btn,.pt-cv-wrapper .btn-group .btn+.btn-group,.pt-cv-wrapper .btn-group .btn-group+.btn,.pt-cv-wrapper .btn-group .btn-group+.btn-group{margin-left:-1px}.pt-cv-wrapper .btn-toolbar{margin-left:-5px}.pt-cv-wrapper .btn-toolbar .btn,.pt-cv-wrapper .btn-toolbar .btn-group,.pt-cv-wrapper .btn-toolbar .input-group{float:left}.pt-cv-wrapper .btn-toolbar>.btn,.pt-cv-wrapper .btn-toolbar>.btn-group,.pt-cv-wrapper .btn-toolbar>.input-group{margin-left:5px}.pt-cv-wrapper .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.pt-cv-wrapper .btn-group>.btn:first-child{margin-left:0}.pt-cv-wrapper .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.pt-cv-wrapper .btn-group>.btn:last-child:not(:first-child),.pt-cv-wrapper .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group>.btn-group{float:left}.pt-cv-wrapper .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.pt-cv-wrapper .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group .dropdown-toggle:active,.pt-cv-wrapper .btn-group.open .dropdown-toggle{outline:0}.pt-cv-wrapper .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.pt-cv-wrapper .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.pt-cv-wrapper .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.pt-cv-wrapper .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper .btn .caret{margin-left:0}.pt-cv-wrapper .btn-lg .caret{border-width:5px 5px 0}.pt-cv-wrapper .dropup .btn-lg .caret{border-width:0 5px 5px}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{float:none}.pt-cv-wrapper .btn-group-vertical>.btn+.btn,.pt-cv-wrapper .btn-group-vertical>.btn+.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.pt-cv-wrapper .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.pt-cv-wrapper .btn-group-justified>.btn,.pt-cv-wrapper .btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.pt-cv-wrapper .btn-group-justified>.btn-group .btn{width:100%}.pt-cv-wrapper .btn-group-justified>.btn-group .dropdown-menu{left:auto}.pt-cv-wrapper [data-toggle=buttons]>.btn input[type=checkbox],.pt-cv-wrapper [data-toggle=buttons]>.btn input[type=radio],.pt-cv-wrapper [data-toggle=buttons]>.btn-group>.btn input[type=checkbox],.pt-cv-wrapper [data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.pt-cv-wrapper .nav{margin-bottom:0;padding-left:0;list-style:none}.pt-cv-wrapper .nav>li{position:relative;display:block}.pt-cv-wrapper .nav>li>a{position:relative;display:block;padding:10px 15px}.pt-cv-wrapper .nav>li>a:focus,.pt-cv-wrapper .nav>li>a:hover{text-decoration:none;background-color:#eee}.pt-cv-wrapper .nav>li.disabled>a{color:#777}.pt-cv-wrapper .nav>li.disabled>a:focus,.pt-cv-wrapper .nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.pt-cv-wrapper .nav .open>a,.pt-cv-wrapper .nav .open>a:focus,.pt-cv-wrapper .nav .open>a:hover{background-color:#eee;border-color:#337ab7}.pt-cv-wrapper .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.pt-cv-wrapper .nav>li>a>img{max-width:none}.pt-cv-wrapper .nav-tabs{border-bottom:1px solid #ddd}.pt-cv-wrapper .nav-tabs>li{float:left;margin-bottom:-1px}.pt-cv-wrapper .nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.pt-cv-wrapper .nav-tabs>li.active>a,.pt-cv-wrapper .nav-tabs>li.active>a:focus,.pt-cv-wrapper .nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.pt-cv-wrapper .nav-tabs.nav-justified{width:100%;border-bottom:0}.pt-cv-wrapper .nav-tabs.nav-justified>li{float:none}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.pt-cv-wrapper .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li{display:table-cell;width:1%}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-bottom:0}}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.pt-cv-wrapper .nav-pills>li{float:left}.pt-cv-wrapper .nav-pills>li>a{border-radius:4px}.pt-cv-wrapper .nav-pills>li+li{margin-left:2px}.pt-cv-wrapper .nav-pills>li.active>a,.pt-cv-wrapper .nav-pills>li.active>a:focus,.pt-cv-wrapper .nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.pt-cv-wrapper .nav-stacked>li{float:none}.pt-cv-wrapper .nav-stacked>li+li{margin-top:2px;margin-left:0}.pt-cv-wrapper .nav-justified{width:100%}.pt-cv-wrapper .nav-justified>li{float:none}.pt-cv-wrapper .nav-justified>li>a{text-align:center;margin-bottom:5px}.pt-cv-wrapper .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.pt-cv-wrapper .nav-justified>li{display:table-cell;width:1%}.pt-cv-wrapper .nav-justified>li>a{margin-bottom:0}}.pt-cv-wrapper .nav-tabs-justified{border-bottom:0}.pt-cv-wrapper .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.pt-cv-wrapper .nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.pt-cv-wrapper .tab-content>.tab-pane{display:none}.pt-cv-wrapper .tab-content>.active{display:block}.pt-cv-wrapper .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pt-cv-wrapper .pagination>li{display:inline}.pt-cv-wrapper .pagination>li>a,.pt-cv-wrapper .pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pt-cv-wrapper .pagination>li:first-child>a,.pt-cv-wrapper .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pt-cv-wrapper .pagination>li:last-child>a,.pt-cv-wrapper .pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pt-cv-wrapper .pagination>li>a:focus,.pt-cv-wrapper .pagination>li>a:hover,.pt-cv-wrapper .pagination>li>span:focus,.pt-cv-wrapper .pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pt-cv-wrapper .pagination>.active>a,.pt-cv-wrapper .pagination>.active>a:focus,.pt-cv-wrapper .pagination>.active>a:hover,.pt-cv-wrapper .pagination>.active>span,.pt-cv-wrapper .pagination>.active>span:focus,.pt-cv-wrapper .pagination>.active>span:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pt-cv-wrapper .pagination>.disabled>a,.pt-cv-wrapper .pagination>.disabled>a:focus,.pt-cv-wrapper .pagination>.disabled>a:hover,.pt-cv-wrapper .pagination>.disabled>span,.pt-cv-wrapper .pagination>.disabled>span:focus,.pt-cv-wrapper .pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pt-cv-wrapper .pagination-lg>li>a,.pt-cv-wrapper .pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pt-cv-wrapper .pagination-lg>li:first-child>a,.pt-cv-wrapper .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pt-cv-wrapper .pagination-lg>li:last-child>a,.pt-cv-wrapper .pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pt-cv-wrapper .pagination-sm>li>a,.pt-cv-wrapper .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pt-cv-wrapper .pagination-sm>li:first-child>a,.pt-cv-wrapper .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pt-cv-wrapper .pagination-sm>li:last-child>a,.pt-cv-wrapper .pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pt-cv-wrapper .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .thumbnail>img{margin-left:auto;margin-right:auto}.pt-cv-wrapper a.thumbnail.active,.pt-cv-wrapper a.thumbnail:focus,.pt-cv-wrapper a.thumbnail:hover{border-color:#337ab7}.pt-cv-wrapper .thumbnail .caption{padding:9px;color:#333}.pt-cv-wrapper .pt-cv-carousel{position:relative}.pt-cv-wrapper .carousel-inner{position:relative;overflow:hidden;width:100%}.pt-cv-wrapper .carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.pt-cv-wrapper .carousel-inner>.item>a>img,.pt-cv-wrapper .carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.pt-cv-wrapper .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.pt-cv-wrapper .carousel-inner>.item.active.right,.pt-cv-wrapper .carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.pt-cv-wrapper .carousel-inner>.item.active.left,.pt-cv-wrapper .carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.pt-cv-wrapper .carousel-inner>.item.active,.pt-cv-wrapper .carousel-inner>.item.next.left,.pt-cv-wrapper .carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.pt-cv-wrapper .carousel-inner>.active,.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{display:block}.pt-cv-wrapper .carousel-inner>.active{left:0}.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{position:absolute;top:0;width:100%}.pt-cv-wrapper .carousel-inner>.next{left:100%}.pt-cv-wrapper .carousel-inner>.prev{left:-100%}.pt-cv-wrapper .carousel-inner>.next.left,.pt-cv-wrapper .carousel-inner>.prev.right{left:0}.pt-cv-wrapper .carousel-inner>.active.left{left:-100%}.pt-cv-wrapper .carousel-inner>.active.right{left:100%}.pt-cv-wrapper .carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.pt-cv-wrapper .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.pt-cv-wrapper .carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.pt-cv-wrapper .carousel-control:focus,.pt-cv-wrapper .carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{left:50%;margin-left:-10px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{right:50%;margin-right:-10px}.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.pt-cv-wrapper .carousel-control .icon-prev:before{content:'\2039'}.pt-cv-wrapper .carousel-control .icon-next:before{content:'\203a'}.pt-cv-wrapper .pt-cv-carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.pt-cv-wrapper .pt-cv-carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.pt-cv-wrapper .pt-cv-carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.pt-cv-wrapper .pt-cv-carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.pt-cv-wrapper .pt-cv-carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{margin-left:-15px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{margin-right:-15px}.pt-cv-wrapper .pt-cv-carousel-caption{left:20%;right:20%;padding-bottom:30px}.pt-cv-wrapper .pt-cv-carousel-indicators{bottom:20px}}.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:before,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-toolbar:before,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .clearfix:before,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .container-fluid:before,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container:before,.pt-cv-wrapper .nav:after,.pt-cv-wrapper .nav:before,.pt-cv-wrapper .row:after,.pt-cv-wrapper .row:before{content:" ";display:table}.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .container:after,.pt-cv-wrapper .nav:after,.pt-cv-wrapper .row:after{clear:both}.pt-cv-wrapper .center-block{display:block;margin-left:auto;margin-right:auto}.pt-cv-wrapper .pull-right{float:right!important}.pt-cv-wrapper .pull-left{float:left!important}.pt-cv-wrapper .hide{display:none!important}.pt-cv-wrapper .show{display:block!important}.pt-cv-wrapper .invisible{visibility:hidden}.pt-cv-wrapper .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.pt-cv-wrapper .hidden{display:none!important}.pt-cv-wrapper .affix{position:fixed}.pt-cv-wrapper .text-left{text-align:left}.pt-cv-wrapper .text-right{text-align:right}.pt-cv-wrapper .text-center{text-align:center}.pt-cv-wrapper .text-justify{text-align:justify}.pt-cv-wrapper .text-nowrap{white-space:nowrap}.pt-cv-wrapper .text-lowercase{text-transform:lowercase}.pt-cv-wrapper .text-uppercase{text-transform:uppercase}.pt-cv-wrapper .text-capitalize{text-transform:capitalize}.pt-cv-wrapper .text-muted{color:#777}.pt-cv-wrapper .text-primary{color:#428bca}.pt-cv-wrapper .h1,.pt-cv-wrapper .h2,.pt-cv-wrapper .h3,.pt-cv-wrapper .h4,.pt-cv-wrapper .h5,.pt-cv-wrapper .h6,.pt-cv-wrapper h1,.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper h4,.pt-cv-wrapper h5,.pt-cv-wrapper h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.pt-cv-view *,.pt-cv-view :after,.pt-cv-view :before{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.pt-cv-view{position:relative;clear:both}.pt-cv-view:after{clear:both;content:'';display:block}.pt-cv-page{position:relative}.pt-cv-gls-group{clear:left}.pt-cv-view strong,.pt-cv-view strong *{font-weight:600!important}.pt-cv-colsys{margin-left:-15px;margin-right:-15px}@media (min-width:992px){.pt-cv-colsys [data-cvc="11"] .col-md-1:nth-child(11n+1),.pt-cv-colsys [data-cvc="12"] .col-md-1:nth-child(12n+1),.pt-cv-colsys [data-cvc="2"] .col-md-6:nth-child(2n+1),.pt-cv-colsys [data-cvc="3"] .col-md-4:nth-child(3n+1),.pt-cv-colsys [data-cvc="4"] .col-md-3:nth-child(4n+1),.pt-cv-colsys [data-cvc="5"] .col-md-2:nth-child(5n+1),.pt-cv-colsys [data-cvc="6"] .col-md-2:nth-child(6n+1),.pt-cv-colsys [data-cvc="7"] .col-md-1:nth-child(7n+1),.pt-cv-colsys [data-cvc="8"] .col-md-1:nth-child(8n+1),.pt-cv-colsys [data-cvc="9"] .col-md-1:nth-child(9n+1),.pt-cv-colsys [data-cvc="10"] .col-md-1:nth-child(10n+1){clear:left!important}}@media (min-width:768px) and (max-width:991px){.pt-cv-colsys .col-sm-2:nth-child(5n+1),.pt-cv-colsys .col-sm-2:nth-child(6n+1),.pt-cv-colsys .col-sm-3:nth-child(4n+1),.pt-cv-colsys .col-sm-4:nth-child(3n+1),.pt-cv-colsys .col-sm-6:nth-child(2n+1){clear:left!important}}@media (max-width:767px){.pt-cv-colsys .col-xs-2:nth-child(5n+1),.pt-cv-colsys .col-xs-2:nth-child(6n+1),.pt-cv-colsys .col-xs-3:nth-child(4n+1),.pt-cv-colsys .col-xs-4:nth-child(3n+1),.pt-cv-colsys .col-xs-6:nth-child(2n+1){clear:left!important}}@media (min-width:992px){.pt-cv-colsys [data-cvc="5"] .pt-cv-content-item{width:20%}.pt-cv-colsys [data-cvc="7"] .pt-cv-content-item{width:14.28571428%}.pt-cv-colsys [data-cvc="8"] .pt-cv-content-item{width:12.5%}.pt-cv-colsys [data-cvc="9"] .pt-cv-content-item{width:11.11111111%}.pt-cv-colsys [data-cvc="10"] .pt-cv-content-item{width:10%}.pt-cv-colsys [data-cvc="11"] .pt-cv-content-item{width:9.09090909%}}.pt-cv-colsys .pt-cv-content-item{flex:none;max-width:initial}.pt-cv-view a,.pt-cv-wrapper .btn{text-decoration:none!important;outline:0!important;font-style:normal}.pt-cv-view a{pointer-events:auto}.pt-cv-readmore{color:#fff;margin:10px 0;max-width:100%}.pt-cv-content-item{padding-bottom:15px;position:relative;overflow:hidden}.pt-cv-ifield>*,.pt-cv-view .pt-cv-content-item>*{margin-bottom:10px}.pt-cv-collapsible .pt-cv-content-item>*{margin-bottom:0!important}.pt-cv-title{margin-top:0!important}h4.pt-cv-title{font-size:18px}.pt-cv-view .pt-cv-title{margin-bottom:10px}.pt-cv-title a{font-weight:600}.pt-cv-thumbnail{height:auto;max-width:100%!important;margin-top:0!important;margin-bottom:10px!important;min-width:inherit!important}.pt-cv-thumbnail.pull-left{margin-right:15px!important}.pt-cv-thumbnail.pull-right{margin-left:15px}.pt-cv-no-image{min-width:80px;min-height:80px}.pt-cv-content,.pt-cv-content *{font-weight:400}.pt-cv-meta-fields{font-size:13px;margin-top:0}.pt-cv-meta-fields a{color:#41b7d8}.pt-cv-pagination-wrapper{margin:20px 0}.pt-cv-view+.pagination{float:left;margin:0 auto!important}.pt-cv-view+.pagination>li{background:0 0!important}.pt-cv-view+.pagination>li>a{cursor:pointer}.pt-cv-spinner{width:15px!important;height:15px!important;margin-top:-25px;display:inline-block;opacity:0;filter:alpha(opacity=0);color:#0470ec;-webkit-transition:opacity .25s,width .25s;-moz-transition:opacity .25s,width .25s;-o-transition:opacity .25s,width .25s;transition:opacity .25s,width .25s}.pt-cv-spinner.active{opacity:1;filter:alpha(opacity=100)}.pt-cv-clear-pagination{margin-bottom:50px}.pt-cv-pagination-wrapper{clear:both;position:relative}.pt-cv-pagination-wrapper .pt-cv-pagination.pagination{-webkit-box-shadow:none!important;box-shadow:none!important;border:0;padding:0;margin:initial;min-height:initial;width:auto;display:inline-block}.pt-cv-pagination li{display:inline!important;background-image:none!important}.pt-cv-pagination li:after,.pt-cv-pagination li:before{content:none!important}.pt-cv-pagination a{cursor:pointer}.pt-cv-pagination li.active a{border-color:rgba(66,139,202,.2)!important}.pt-cv-pagination li a[href="#"]{pointer-events:none}.pt-cv-collapsible .panel{display:block}.pt-cv-collapsible .panel-heading{padding:0}.pt-cv-collapsible .panel-heading a{display:block;padding:10px 15px}.pt-cv-collapsible .panel-body{padding:10px}.pt-cv-view .collapse{display:none;visibility:hidden}.pt-cv-view .collapse.in{display:block;visibility:visible;overflow:auto}.pt-cv-collapsible .panel-heading br{display:none}.pt-cv-scrollable{margin-left:0;margin-right:0}.pt-cv-scrollable .pt-cv-carousel-caption{text-align:left;bottom:15px;padding:10px}.pt-cv-scrollable .pt-cv-carousel-caption *{text-shadow:none}.pt-cv-scrollable .pt-cv-title{padding-bottom:0}.pt-cv-scrollable .pt-cv-carousel-caption{margin-bottom:10px!important}.pt-cv-scrollable .pt-cv-thumbnail{width:100%}.pt-cv-carousel-caption:empty{display:none}.pt-cv-scrollable .pt-cv-carousel .item{height:auto;margin:auto;min-height:0;max-height:none;line-height:normal}.pt-cv-scrollable .pt-cv-cap-w-img{background:rgba(0,0,0,.6);text-shadow:0 1px 1px #000;left:15px;right:15px}.pt-cv-cap-w-img *{color:#fff}.pt-cv-cap-w-img .pt-cv-title a{color:#fff!important}.pt-cv-scrollable .pt-cv-cap-wo-img{position:relative!important;bottom:0!important;left:0;right:0}.pt-cv-cap-wo-img *{color:#000}.pt-cv-cap-wo-img .pt-cv-readmore{color:#fff}.pt-cv-view .carousel-control{background-image:none!important;height:30px;width:40px;bottom:0;top:auto;color:#00A100}.pt-cv-view .pt-cv-carousel-indicators{bottom:0;margin-bottom:4px}.pt-cv-view .pt-cv-carousel-indicators li{background:#cecece;border:1px solid #cecece;margin:0}.pt-cv-view .pt-cv-carousel-indicators li.active{background:#428bca;border:1px solid #428bca}.pt-cv-2-col .pt-cv-title{clear:none!important}@media (min-width:480px){.pt-cv-2-col .pt-cv-colwrap{display:table;word-break:break-word}}@media (max-width:479px){.pt-cv-2-col .pt-cv-colwrap{clear:both}}.pt-cv-view .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.pt-cv-view .panel-default{border-color:#ddd;padding-bottom:0}.pt-cv-view .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.pt-cv-pagination:after,.pt-cv-pagination:before{content:none!important}.pt-cv-wrapper [class*=pt-cv-] a{box-shadow:none}.pt-cv-view p:empty{display:none}.pt-cv-view .pt-cv-ifield{margin-bottom:0!important}@media (max-width:480px){.pt-cv-nolf .pt-cv-2-col .pt-cv-thumbnail{float:none!important;margin:0}}@media print{.pt-cv-view a[href]:after{content:none!important}.pt-cv-view .collapse{display:block!important;height:auto!important;visibility:visible!important}}
1
+ /*!
2
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.pt-cv-wrapper article,.pt-cv-wrapper aside,.pt-cv-wrapper details,.pt-cv-wrapper figcaption,.pt-cv-wrapper footer,.pt-cv-wrapper header,.pt-cv-wrapper hgroup,.pt-cv-wrapper main,.pt-cv-wrapper menu,.pt-cv-wrapper nav,.pt-cv-wrapper section,.pt-cv-wrapper summary{display:block}.pt-cv-wrapper audio,.pt-cv-wrapper canvas,.pt-cv-wrapper progress,.pt-cv-wrapper video{display:inline-block;vertical-align:baseline}.pt-cv-wrapper audio:not([controls]){display:none;height:0}.pt-cv-wrapper [hidden],.pt-cv-wrapper template{display:none}.pt-cv-wrapper a{background-color:transparent}.pt-cv-wrapper a:active,.pt-cv-wrapper a:hover{outline:0}.pt-cv-wrapper abbr[title]{border-bottom:1px dotted}.pt-cv-wrapper b,.pt-cv-wrapper strong{font-weight:700}.pt-cv-wrapper dfn{font-style:italic}.pt-cv-wrapper h1{margin:.67em 0}.pt-cv-wrapper mark{background:#ff0;color:#000}.pt-cv-wrapper small{font-size:80%}.pt-cv-wrapper sub,.pt-cv-wrapper sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.pt-cv-wrapper sup{top:-.5em}.pt-cv-wrapper sub{bottom:-.25em}.pt-cv-wrapper img{border:0}.pt-cv-wrapper svg:not(:root){overflow:hidden}.pt-cv-wrapper hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}.pt-cv-wrapper pre{overflow:auto}.pt-cv-wrapper code,.pt-cv-wrapper kbd,.pt-cv-wrapper pre,.pt-cv-wrapper samp{font-family:monospace,monospace;font-size:1em}.pt-cv-wrapper button,.pt-cv-wrapper input,.pt-cv-wrapper optgroup,.pt-cv-wrapper select,.pt-cv-wrapper textarea{color:inherit;font:inherit;margin:0}.pt-cv-wrapper button{overflow:visible}.pt-cv-wrapper button,.pt-cv-wrapper select{text-transform:none}.pt-cv-wrapper button,.pt-cv-wrapper html input[type=button],.pt-cv-wrapper input[type=reset],.pt-cv-wrapper input[type=submit]{-webkit-appearance:button;cursor:pointer}.pt-cv-wrapper button[disabled],.pt-cv-wrapper html input[disabled]{cursor:default}.pt-cv-wrapper button::-moz-focus-inner,.pt-cv-wrapper input::-moz-focus-inner{border:0;padding:0}.pt-cv-wrapper input{line-height:normal}.pt-cv-wrapper input[type=checkbox],.pt-cv-wrapper input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.pt-cv-wrapper input[type=number]::-webkit-inner-spin-button,.pt-cv-wrapper input[type=number]::-webkit-outer-spin-button{height:auto}.pt-cv-wrapper input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.pt-cv-wrapper input[type=search]::-webkit-search-cancel-button,.pt-cv-wrapper input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.pt-cv-wrapper fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}.pt-cv-wrapper legend{border:0;padding:0}.pt-cv-wrapper textarea{overflow:auto}.pt-cv-wrapper optgroup{font-weight:700}.pt-cv-wrapper table{border-collapse:collapse;border-spacing:0}.pt-cv-wrapper td,.pt-cv-wrapper th{padding:0}@media print{.pt-cv-wrapper *,.pt-cv-wrapper :after,.pt-cv-wrapper :before{background:0 0!important;color:#000!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}.pt-cv-wrapper a,.pt-cv-wrapper a:visited{text-decoration:underline}.pt-cv-wrapper a[href]:after{content:" (" attr(href) ")"}.pt-cv-wrapper abbr[title]:after{content:" (" attr(title) ")"}.pt-cv-wrapper a[href^="javascript:"]:after,.pt-cv-wrapper a[href^="#"]:after{content:""}.pt-cv-wrapper blockquote,.pt-cv-wrapper pre{border:1px solid #999;page-break-inside:avoid}.pt-cv-wrapper thead{display:table-header-group}.pt-cv-wrapper img,.pt-cv-wrapper tr{page-break-inside:avoid}.pt-cv-wrapper img{max-width:100%!important}.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper p{orphans:3;widows:3}.pt-cv-wrapper h2,.pt-cv-wrapper h3{page-break-after:avoid}.pt-cv-wrapper .navbar{display:none}.pt-cv-wrapper .btn>.caret,.pt-cv-wrapper .dropup>.btn>.caret{border-top-color:#000!important}.pt-cv-wrapper .label{border:1px solid #000}.pt-cv-wrapper .table{border-collapse:collapse!important}.pt-cv-wrapper .table td,.pt-cv-wrapper .table th{background-color:#fff!important}.pt-cv-wrapper .table-bordered td,.pt-cv-wrapper .table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.pt-cv-wrapper .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pt-cv-wrapper .glyphicon-asterisk:before{content:"\2a"}.pt-cv-wrapper .glyphicon-plus:before{content:"\2b"}.pt-cv-wrapper .glyphicon-eur:before,.pt-cv-wrapper .glyphicon-euro:before{content:"\20ac"}.pt-cv-wrapper .glyphicon-minus:before{content:"\2212"}.pt-cv-wrapper .glyphicon-cloud:before{content:"\2601"}.pt-cv-wrapper .glyphicon-envelope:before{content:"\2709"}.pt-cv-wrapper .glyphicon-pencil:before{content:"\270f"}.pt-cv-wrapper .glyphicon-glass:before{content:"\e001"}.pt-cv-wrapper .glyphicon-music:before{content:"\e002"}.pt-cv-wrapper .glyphicon-search:before{content:"\e003"}.pt-cv-wrapper .glyphicon-heart:before{content:"\e005"}.pt-cv-wrapper .glyphicon-star:before{content:"\e006"}.pt-cv-wrapper .glyphicon-star-empty:before{content:"\e007"}.pt-cv-wrapper .glyphicon-user:before{content:"\e008"}.pt-cv-wrapper .glyphicon-film:before{content:"\e009"}.pt-cv-wrapper .glyphicon-th-large:before{content:"\e010"}.pt-cv-wrapper .glyphicon-th:before{content:"\e011"}.pt-cv-wrapper .glyphicon-th-list:before{content:"\e012"}.pt-cv-wrapper .glyphicon-ok:before{content:"\e013"}.pt-cv-wrapper .glyphicon-remove:before{content:"\e014"}.pt-cv-wrapper .glyphicon-zoom-in:before{content:"\e015"}.pt-cv-wrapper .glyphicon-zoom-out:before{content:"\e016"}.pt-cv-wrapper .glyphicon-off:before{content:"\e017"}.pt-cv-wrapper .glyphicon-signal:before{content:"\e018"}.pt-cv-wrapper .glyphicon-cog:before{content:"\e019"}.pt-cv-wrapper .glyphicon-trash:before{content:"\e020"}.pt-cv-wrapper .glyphicon-home:before{content:"\e021"}.pt-cv-wrapper .glyphicon-file:before{content:"\e022"}.pt-cv-wrapper .glyphicon-time:before{content:"\e023"}.pt-cv-wrapper .glyphicon-road:before{content:"\e024"}.pt-cv-wrapper .glyphicon-download-alt:before{content:"\e025"}.pt-cv-wrapper .glyphicon-download:before{content:"\e026"}.pt-cv-wrapper .glyphicon-upload:before{content:"\e027"}.pt-cv-wrapper .glyphicon-inbox:before{content:"\e028"}.pt-cv-wrapper .glyphicon-play-circle:before{content:"\e029"}.pt-cv-wrapper .glyphicon-repeat:before{content:"\e030"}.pt-cv-wrapper .glyphicon-refresh:before{content:"\e031"}.pt-cv-wrapper .glyphicon-list-alt:before{content:"\e032"}.pt-cv-wrapper .glyphicon-lock:before{content:"\e033"}.pt-cv-wrapper .glyphicon-flag:before{content:"\e034"}.pt-cv-wrapper .glyphicon-headphones:before{content:"\e035"}.pt-cv-wrapper .glyphicon-volume-off:before{content:"\e036"}.pt-cv-wrapper .glyphicon-volume-down:before{content:"\e037"}.pt-cv-wrapper .glyphicon-volume-up:before{content:"\e038"}.pt-cv-wrapper .glyphicon-qrcode:before{content:"\e039"}.pt-cv-wrapper .glyphicon-barcode:before{content:"\e040"}.pt-cv-wrapper .glyphicon-tag:before{content:"\e041"}.pt-cv-wrapper .glyphicon-tags:before{content:"\e042"}.pt-cv-wrapper .glyphicon-book:before{content:"\e043"}.pt-cv-wrapper .glyphicon-bookmark:before{content:"\e044"}.pt-cv-wrapper .glyphicon-print:before{content:"\e045"}.pt-cv-wrapper .glyphicon-camera:before{content:"\e046"}.pt-cv-wrapper .glyphicon-font:before{content:"\e047"}.pt-cv-wrapper .glyphicon-bold:before{content:"\e048"}.pt-cv-wrapper .glyphicon-italic:before{content:"\e049"}.pt-cv-wrapper .glyphicon-text-height:before{content:"\e050"}.pt-cv-wrapper .glyphicon-text-width:before{content:"\e051"}.pt-cv-wrapper .glyphicon-align-left:before{content:"\e052"}.pt-cv-wrapper .glyphicon-align-center:before{content:"\e053"}.pt-cv-wrapper .glyphicon-align-right:before{content:"\e054"}.pt-cv-wrapper .glyphicon-align-justify:before{content:"\e055"}.pt-cv-wrapper .glyphicon-list:before{content:"\e056"}.pt-cv-wrapper .glyphicon-indent-left:before{content:"\e057"}.pt-cv-wrapper .glyphicon-indent-right:before{content:"\e058"}.pt-cv-wrapper .glyphicon-facetime-video:before{content:"\e059"}.pt-cv-wrapper .glyphicon-picture:before{content:"\e060"}.pt-cv-wrapper .glyphicon-map-marker:before{content:"\e062"}.pt-cv-wrapper .glyphicon-adjust:before{content:"\e063"}.pt-cv-wrapper .glyphicon-tint:before{content:"\e064"}.pt-cv-wrapper .glyphicon-edit:before{content:"\e065"}.pt-cv-wrapper .glyphicon-share:before{content:"\e066"}.pt-cv-wrapper .glyphicon-check:before{content:"\e067"}.pt-cv-wrapper .glyphicon-move:before{content:"\e068"}.pt-cv-wrapper .glyphicon-step-backward:before{content:"\e069"}.pt-cv-wrapper .glyphicon-fast-backward:before{content:"\e070"}.pt-cv-wrapper .glyphicon-backward:before{content:"\e071"}.pt-cv-wrapper .glyphicon-play:before{content:"\e072"}.pt-cv-wrapper .glyphicon-pause:before{content:"\e073"}.pt-cv-wrapper .glyphicon-stop:before{content:"\e074"}.pt-cv-wrapper .glyphicon-forward:before{content:"\e075"}.pt-cv-wrapper .glyphicon-fast-forward:before{content:"\e076"}.pt-cv-wrapper .glyphicon-step-forward:before{content:"\e077"}.pt-cv-wrapper .glyphicon-eject:before{content:"\e078"}.pt-cv-wrapper .glyphicon-chevron-left:before{content:"\e079"}.pt-cv-wrapper .glyphicon-chevron-right:before{content:"\e080"}.pt-cv-wrapper .glyphicon-plus-sign:before{content:"\e081"}.pt-cv-wrapper .glyphicon-minus-sign:before{content:"\e082"}.pt-cv-wrapper .glyphicon-remove-sign:before{content:"\e083"}.pt-cv-wrapper .glyphicon-ok-sign:before{content:"\e084"}.pt-cv-wrapper .glyphicon-question-sign:before{content:"\e085"}.pt-cv-wrapper .glyphicon-info-sign:before{content:"\e086"}.pt-cv-wrapper .glyphicon-screenshot:before{content:"\e087"}.pt-cv-wrapper .glyphicon-remove-circle:before{content:"\e088"}.pt-cv-wrapper .glyphicon-ok-circle:before{content:"\e089"}.pt-cv-wrapper .glyphicon-ban-circle:before{content:"\e090"}.pt-cv-wrapper .glyphicon-arrow-left:before{content:"\e091"}.pt-cv-wrapper .glyphicon-arrow-right:before{content:"\e092"}.pt-cv-wrapper .glyphicon-arrow-up:before{content:"\e093"}.pt-cv-wrapper .glyphicon-arrow-down:before{content:"\e094"}.pt-cv-wrapper .glyphicon-share-alt:before{content:"\e095"}.pt-cv-wrapper .glyphicon-resize-full:before{content:"\e096"}.pt-cv-wrapper .glyphicon-resize-small:before{content:"\e097"}.pt-cv-wrapper .glyphicon-exclamation-sign:before{content:"\e101"}.pt-cv-wrapper .glyphicon-gift:before{content:"\e102"}.pt-cv-wrapper .glyphicon-leaf:before{content:"\e103"}.pt-cv-wrapper .glyphicon-fire:before{content:"\e104"}.pt-cv-wrapper .glyphicon-eye-open:before{content:"\e105"}.pt-cv-wrapper .glyphicon-eye-close:before{content:"\e106"}.pt-cv-wrapper .glyphicon-warning-sign:before{content:"\e107"}.pt-cv-wrapper .glyphicon-plane:before{content:"\e108"}.pt-cv-wrapper .glyphicon-calendar:before{content:"\e109"}.pt-cv-wrapper .glyphicon-random:before{content:"\e110"}.pt-cv-wrapper .glyphicon-comment:before{content:"\e111"}.pt-cv-wrapper .glyphicon-magnet:before{content:"\e112"}.pt-cv-wrapper .glyphicon-chevron-up:before{content:"\e113"}.pt-cv-wrapper .glyphicon-chevron-down:before{content:"\e114"}.pt-cv-wrapper .glyphicon-retweet:before{content:"\e115"}.pt-cv-wrapper .glyphicon-shopping-cart:before{content:"\e116"}.pt-cv-wrapper .glyphicon-folder-close:before{content:"\e117"}.pt-cv-wrapper .glyphicon-folder-open:before{content:"\e118"}.pt-cv-wrapper .glyphicon-resize-vertical:before{content:"\e119"}.pt-cv-wrapper .glyphicon-resize-horizontal:before{content:"\e120"}.pt-cv-wrapper .glyphicon-hdd:before{content:"\e121"}.pt-cv-wrapper .glyphicon-bullhorn:before{content:"\e122"}.pt-cv-wrapper .glyphicon-bell:before{content:"\e123"}.pt-cv-wrapper .glyphicon-certificate:before{content:"\e124"}.pt-cv-wrapper .glyphicon-thumbs-up:before{content:"\e125"}.pt-cv-wrapper .glyphicon-thumbs-down:before{content:"\e126"}.pt-cv-wrapper .glyphicon-hand-right:before{content:"\e127"}.pt-cv-wrapper .glyphicon-hand-left:before{content:"\e128"}.pt-cv-wrapper .glyphicon-hand-up:before{content:"\e129"}.pt-cv-wrapper .glyphicon-hand-down:before{content:"\e130"}.pt-cv-wrapper .glyphicon-circle-arrow-right:before{content:"\e131"}.pt-cv-wrapper .glyphicon-circle-arrow-left:before{content:"\e132"}.pt-cv-wrapper .glyphicon-circle-arrow-up:before{content:"\e133"}.pt-cv-wrapper .glyphicon-circle-arrow-down:before{content:"\e134"}.pt-cv-wrapper .glyphicon-globe:before{content:"\e135"}.pt-cv-wrapper .glyphicon-wrench:before{content:"\e136"}.pt-cv-wrapper .glyphicon-tasks:before{content:"\e137"}.pt-cv-wrapper .glyphicon-filter:before{content:"\e138"}.pt-cv-wrapper .glyphicon-briefcase:before{content:"\e139"}.pt-cv-wrapper .glyphicon-fullscreen:before{content:"\e140"}.pt-cv-wrapper .glyphicon-dashboard:before{content:"\e141"}.pt-cv-wrapper .glyphicon-paperclip:before{content:"\e142"}.pt-cv-wrapper .glyphicon-heart-empty:before{content:"\e143"}.pt-cv-wrapper .glyphicon-link:before{content:"\e144"}.pt-cv-wrapper .glyphicon-phone:before{content:"\e145"}.pt-cv-wrapper .glyphicon-pushpin:before{content:"\e146"}.pt-cv-wrapper .glyphicon-usd:before{content:"\e148"}.pt-cv-wrapper .glyphicon-gbp:before{content:"\e149"}.pt-cv-wrapper .glyphicon-sort:before{content:"\e150"}.pt-cv-wrapper .glyphicon-sort-by-alphabet:before{content:"\e151"}.pt-cv-wrapper .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.pt-cv-wrapper .glyphicon-sort-by-order:before{content:"\e153"}.pt-cv-wrapper .glyphicon-sort-by-order-alt:before{content:"\e154"}.pt-cv-wrapper .glyphicon-sort-by-attributes:before{content:"\e155"}.pt-cv-wrapper .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.pt-cv-wrapper .glyphicon-unchecked:before{content:"\e157"}.pt-cv-wrapper .glyphicon-expand:before{content:"\e158"}.pt-cv-wrapper .glyphicon-collapse-down:before{content:"\e159"}.pt-cv-wrapper .glyphicon-collapse-up:before{content:"\e160"}.pt-cv-wrapper .glyphicon-log-in:before{content:"\e161"}.pt-cv-wrapper .glyphicon-flash:before{content:"\e162"}.pt-cv-wrapper .glyphicon-log-out:before{content:"\e163"}.pt-cv-wrapper .glyphicon-new-window:before{content:"\e164"}.pt-cv-wrapper .glyphicon-record:before{content:"\e165"}.pt-cv-wrapper .glyphicon-save:before{content:"\e166"}.pt-cv-wrapper .glyphicon-open:before{content:"\e167"}.pt-cv-wrapper .glyphicon-saved:before{content:"\e168"}.pt-cv-wrapper .glyphicon-import:before{content:"\e169"}.pt-cv-wrapper .glyphicon-export:before{content:"\e170"}.pt-cv-wrapper .glyphicon-send:before{content:"\e171"}.pt-cv-wrapper .glyphicon-floppy-disk:before{content:"\e172"}.pt-cv-wrapper .glyphicon-floppy-saved:before{content:"\e173"}.pt-cv-wrapper .glyphicon-floppy-remove:before{content:"\e174"}.pt-cv-wrapper .glyphicon-floppy-save:before{content:"\e175"}.pt-cv-wrapper .glyphicon-floppy-open:before{content:"\e176"}.pt-cv-wrapper .glyphicon-credit-card:before{content:"\e177"}.pt-cv-wrapper .glyphicon-transfer:before{content:"\e178"}.pt-cv-wrapper .glyphicon-cutlery:before{content:"\e179"}.pt-cv-wrapper .glyphicon-header:before{content:"\e180"}.pt-cv-wrapper .glyphicon-compressed:before{content:"\e181"}.pt-cv-wrapper .glyphicon-earphone:before{content:"\e182"}.pt-cv-wrapper .glyphicon-phone-alt:before{content:"\e183"}.pt-cv-wrapper .glyphicon-tower:before{content:"\e184"}.pt-cv-wrapper .glyphicon-stats:before{content:"\e185"}.pt-cv-wrapper .glyphicon-sd-video:before{content:"\e186"}.pt-cv-wrapper .glyphicon-hd-video:before{content:"\e187"}.pt-cv-wrapper .glyphicon-subtitles:before{content:"\e188"}.pt-cv-wrapper .glyphicon-sound-stereo:before{content:"\e189"}.pt-cv-wrapper .glyphicon-sound-dolby:before{content:"\e190"}.pt-cv-wrapper .glyphicon-sound-5-1:before{content:"\e191"}.pt-cv-wrapper .glyphicon-sound-6-1:before{content:"\e192"}.pt-cv-wrapper .glyphicon-sound-7-1:before{content:"\e193"}.pt-cv-wrapper .glyphicon-copyright-mark:before{content:"\e194"}.pt-cv-wrapper .glyphicon-registration-mark:before{content:"\e195"}.pt-cv-wrapper .glyphicon-cloud-download:before{content:"\e197"}.pt-cv-wrapper .glyphicon-cloud-upload:before{content:"\e198"}.pt-cv-wrapper .glyphicon-tree-conifer:before{content:"\e199"}.pt-cv-wrapper .glyphicon-tree-deciduous:before{content:"\e200"}.pt-cv-wrapper .glyphicon-cd:before{content:"\e201"}.pt-cv-wrapper .glyphicon-save-file:before{content:"\e202"}.pt-cv-wrapper .glyphicon-open-file:before{content:"\e203"}.pt-cv-wrapper .glyphicon-level-up:before{content:"\e204"}.pt-cv-wrapper .glyphicon-copy:before{content:"\e205"}.pt-cv-wrapper .glyphicon-paste:before{content:"\e206"}.pt-cv-wrapper .glyphicon-alert:before{content:"\e209"}.pt-cv-wrapper .glyphicon-equalizer:before{content:"\e210"}.pt-cv-wrapper .glyphicon-king:before{content:"\e211"}.pt-cv-wrapper .glyphicon-queen:before{content:"\e212"}.pt-cv-wrapper .glyphicon-pawn:before{content:"\e213"}.pt-cv-wrapper .glyphicon-bishop:before{content:"\e214"}.pt-cv-wrapper .glyphicon-knight:before{content:"\e215"}.pt-cv-wrapper .glyphicon-baby-formula:before{content:"\e216"}.pt-cv-wrapper .glyphicon-tent:before{content:"\26fa"}.pt-cv-wrapper .glyphicon-blackboard:before{content:"\e218"}.pt-cv-wrapper .glyphicon-bed:before{content:"\e219"}.pt-cv-wrapper .glyphicon-apple:before{content:"\f8ff"}.pt-cv-wrapper .glyphicon-erase:before{content:"\e221"}.pt-cv-wrapper .glyphicon-hourglass:before{content:"\231b"}.pt-cv-wrapper .glyphicon-lamp:before{content:"\e223"}.pt-cv-wrapper .glyphicon-duplicate:before{content:"\e224"}.pt-cv-wrapper .glyphicon-piggy-bank:before{content:"\e225"}.pt-cv-wrapper .glyphicon-scissors:before{content:"\e226"}.pt-cv-wrapper .glyphicon-bitcoin:before,.pt-cv-wrapper .glyphicon-btc:before,.pt-cv-wrapper .glyphicon-xbt:before{content:"\e227"}.pt-cv-wrapper .glyphicon-jpy:before,.pt-cv-wrapper .glyphicon-yen:before{content:"\00a5"}.pt-cv-wrapper .glyphicon-rub:before,.pt-cv-wrapper .glyphicon-ruble:before{content:"\20bd"}.pt-cv-wrapper .glyphicon-scale:before{content:"\e230"}.pt-cv-wrapper .glyphicon-ice-lolly:before{content:"\e231"}.pt-cv-wrapper .glyphicon-ice-lolly-tasted:before{content:"\e232"}.pt-cv-wrapper .glyphicon-education:before{content:"\e233"}.pt-cv-wrapper .glyphicon-option-horizontal:before{content:"\e234"}.pt-cv-wrapper .glyphicon-option-vertical:before{content:"\e235"}.pt-cv-wrapper .glyphicon-menu-hamburger:before{content:"\e236"}.pt-cv-wrapper .glyphicon-modal-window:before{content:"\e237"}.pt-cv-wrapper .glyphicon-oil:before{content:"\e238"}.pt-cv-wrapper .glyphicon-grain:before{content:"\e239"}.pt-cv-wrapper .glyphicon-sunglasses:before{content:"\e240"}.pt-cv-wrapper .glyphicon-text-size:before{content:"\e241"}.pt-cv-wrapper .glyphicon-text-color:before{content:"\e242"}.pt-cv-wrapper .glyphicon-text-background:before{content:"\e243"}.pt-cv-wrapper .glyphicon-object-align-top:before{content:"\e244"}.pt-cv-wrapper .glyphicon-object-align-bottom:before{content:"\e245"}.pt-cv-wrapper .glyphicon-object-align-horizontal:before{content:"\e246"}.pt-cv-wrapper .glyphicon-object-align-left:before{content:"\e247"}.pt-cv-wrapper .glyphicon-object-align-vertical:before{content:"\e248"}.pt-cv-wrapper .glyphicon-object-align-right:before{content:"\e249"}.pt-cv-wrapper .glyphicon-triangle-right:before{content:"\e250"}.pt-cv-wrapper .glyphicon-triangle-left:before{content:"\e251"}.pt-cv-wrapper .glyphicon-triangle-bottom:before{content:"\e252"}.pt-cv-wrapper .glyphicon-triangle-top:before{content:"\e253"}.pt-cv-wrapper .glyphicon-console:before{content:"\e254"}.pt-cv-wrapper .glyphicon-superscript:before{content:"\e255"}.pt-cv-wrapper .glyphicon-subscript:before{content:"\e256"}.pt-cv-wrapper .glyphicon-menu-left:before{content:"\e257"}.pt-cv-wrapper .glyphicon-menu-right:before{content:"\e258"}.pt-cv-wrapper .glyphicon-menu-down:before{content:"\e259"}.pt-cv-wrapper .glyphicon-menu-up:before{content:"\e260"}.pt-cv-wrapper img{vertical-align:middle}.pt-cv-wrapper .carousel-inner>.item>a>img,.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .img-responsive,.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .thumbnail>img{display:block;max-width:100%;height:auto}.pt-cv-wrapper .img-rounded{border-radius:6px}.pt-cv-wrapper .img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.pt-cv-wrapper .img-circle{border-radius:50%}.pt-cv-wrapper hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.pt-cv-wrapper .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.pt-cv-wrapper .sr-only-focusable:active,.pt-cv-wrapper .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.pt-cv-wrapper [role=button]{cursor:pointer}.pt-cv-wrapper .container,.pt-cv-wrapper .container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media(min-width:768px){.pt-cv-wrapper .container{width:750px}}@media(min-width:992px){.pt-cv-wrapper .container{width:970px}}@media(min-width:1200px){.pt-cv-wrapper .container{width:1170px}}.pt-cv-wrapper .row{margin-left:-15px;margin-right:-15px}.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9{float:left}.pt-cv-wrapper .col-xs-12{width:100%}.pt-cv-wrapper .col-xs-11{width:91.66666667%}.pt-cv-wrapper .col-xs-10{width:83.33333333%}.pt-cv-wrapper .col-xs-9{width:75%}.pt-cv-wrapper .col-xs-8{width:66.66666667%}.pt-cv-wrapper .col-xs-7{width:58.33333333%}.pt-cv-wrapper .col-xs-6{width:50%}.pt-cv-wrapper .col-xs-5{width:41.66666667%}.pt-cv-wrapper .col-xs-4{width:33.33333333%}.pt-cv-wrapper .col-xs-3{width:25%}.pt-cv-wrapper .col-xs-2{width:16.66666667%}.pt-cv-wrapper .col-xs-1{width:8.33333333%}.pt-cv-wrapper .col-xs-pull-12{right:100%}.pt-cv-wrapper .col-xs-pull-11{right:91.66666667%}.pt-cv-wrapper .col-xs-pull-10{right:83.33333333%}.pt-cv-wrapper .col-xs-pull-9{right:75%}.pt-cv-wrapper .col-xs-pull-8{right:66.66666667%}.pt-cv-wrapper .col-xs-pull-7{right:58.33333333%}.pt-cv-wrapper .col-xs-pull-6{right:50%}.pt-cv-wrapper .col-xs-pull-5{right:41.66666667%}.pt-cv-wrapper .col-xs-pull-4{right:33.33333333%}.pt-cv-wrapper .col-xs-pull-3{right:25%}.pt-cv-wrapper .col-xs-pull-2{right:16.66666667%}.pt-cv-wrapper .col-xs-pull-1{right:8.33333333%}.pt-cv-wrapper .col-xs-pull-0{right:auto}.pt-cv-wrapper .col-xs-push-12{left:100%}.pt-cv-wrapper .col-xs-push-11{left:91.66666667%}.pt-cv-wrapper .col-xs-push-10{left:83.33333333%}.pt-cv-wrapper .col-xs-push-9{left:75%}.pt-cv-wrapper .col-xs-push-8{left:66.66666667%}.pt-cv-wrapper .col-xs-push-7{left:58.33333333%}.pt-cv-wrapper .col-xs-push-6{left:50%}.pt-cv-wrapper .col-xs-push-5{left:41.66666667%}.pt-cv-wrapper .col-xs-push-4{left:33.33333333%}.pt-cv-wrapper .col-xs-push-3{left:25%}.pt-cv-wrapper .col-xs-push-2{left:16.66666667%}.pt-cv-wrapper .col-xs-push-1{left:8.33333333%}.pt-cv-wrapper .col-xs-push-0{left:auto}.pt-cv-wrapper .col-xs-offset-12{margin-left:100%}.pt-cv-wrapper .col-xs-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-xs-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-xs-offset-9{margin-left:75%}.pt-cv-wrapper .col-xs-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-xs-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-xs-offset-6{margin-left:50%}.pt-cv-wrapper .col-xs-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-xs-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-xs-offset-3{margin-left:25%}.pt-cv-wrapper .col-xs-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-xs-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-xs-offset-0{margin-left:0}@media(min-width:768px){.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9{float:left}.pt-cv-wrapper .col-sm-12{width:100%}.pt-cv-wrapper .col-sm-11{width:91.66666667%}.pt-cv-wrapper .col-sm-10{width:83.33333333%}.pt-cv-wrapper .col-sm-9{width:75%}.pt-cv-wrapper .col-sm-8{width:66.66666667%}.pt-cv-wrapper .col-sm-7{width:58.33333333%}.pt-cv-wrapper .col-sm-6{width:50%}.pt-cv-wrapper .col-sm-5{width:41.66666667%}.pt-cv-wrapper .col-sm-4{width:33.33333333%}.pt-cv-wrapper .col-sm-3{width:25%}.pt-cv-wrapper .col-sm-2{width:16.66666667%}.pt-cv-wrapper .col-sm-1{width:8.33333333%}.pt-cv-wrapper .col-sm-pull-12{right:100%}.pt-cv-wrapper .col-sm-pull-11{right:91.66666667%}.pt-cv-wrapper .col-sm-pull-10{right:83.33333333%}.pt-cv-wrapper .col-sm-pull-9{right:75%}.pt-cv-wrapper .col-sm-pull-8{right:66.66666667%}.pt-cv-wrapper .col-sm-pull-7{right:58.33333333%}.pt-cv-wrapper .col-sm-pull-6{right:50%}.pt-cv-wrapper .col-sm-pull-5{right:41.66666667%}.pt-cv-wrapper .col-sm-pull-4{right:33.33333333%}.pt-cv-wrapper .col-sm-pull-3{right:25%}.pt-cv-wrapper .col-sm-pull-2{right:16.66666667%}.pt-cv-wrapper .col-sm-pull-1{right:8.33333333%}.pt-cv-wrapper .col-sm-pull-0{right:auto}.pt-cv-wrapper .col-sm-push-12{left:100%}.pt-cv-wrapper .col-sm-push-11{left:91.66666667%}.pt-cv-wrapper .col-sm-push-10{left:83.33333333%}.pt-cv-wrapper .col-sm-push-9{left:75%}.pt-cv-wrapper .col-sm-push-8{left:66.66666667%}.pt-cv-wrapper .col-sm-push-7{left:58.33333333%}.pt-cv-wrapper .col-sm-push-6{left:50%}.pt-cv-wrapper .col-sm-push-5{left:41.66666667%}.pt-cv-wrapper .col-sm-push-4{left:33.33333333%}.pt-cv-wrapper .col-sm-push-3{left:25%}.pt-cv-wrapper .col-sm-push-2{left:16.66666667%}.pt-cv-wrapper .col-sm-push-1{left:8.33333333%}.pt-cv-wrapper .col-sm-push-0{left:auto}.pt-cv-wrapper .col-sm-offset-12{margin-left:100%}.pt-cv-wrapper .col-sm-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-sm-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-sm-offset-9{margin-left:75%}.pt-cv-wrapper .col-sm-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-sm-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-sm-offset-6{margin-left:50%}.pt-cv-wrapper .col-sm-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-sm-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-sm-offset-3{margin-left:25%}.pt-cv-wrapper .col-sm-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-sm-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-sm-offset-0{margin-left:0}}@media(min-width:992px){.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9{float:left}.pt-cv-wrapper .col-md-12{width:100%}.pt-cv-wrapper .col-md-11{width:91.66666667%}.pt-cv-wrapper .col-md-10{width:83.33333333%}.pt-cv-wrapper .col-md-9{width:75%}.pt-cv-wrapper .col-md-8{width:66.66666667%}.pt-cv-wrapper .col-md-7{width:58.33333333%}.pt-cv-wrapper .col-md-6{width:50%}.pt-cv-wrapper .col-md-5{width:41.66666667%}.pt-cv-wrapper .col-md-4{width:33.33333333%}.pt-cv-wrapper .col-md-3{width:25%}.pt-cv-wrapper .col-md-2{width:16.66666667%}.pt-cv-wrapper .col-md-1{width:8.33333333%}.pt-cv-wrapper .col-md-pull-12{right:100%}.pt-cv-wrapper .col-md-pull-11{right:91.66666667%}.pt-cv-wrapper .col-md-pull-10{right:83.33333333%}.pt-cv-wrapper .col-md-pull-9{right:75%}.pt-cv-wrapper .col-md-pull-8{right:66.66666667%}.pt-cv-wrapper .col-md-pull-7{right:58.33333333%}.pt-cv-wrapper .col-md-pull-6{right:50%}.pt-cv-wrapper .col-md-pull-5{right:41.66666667%}.pt-cv-wrapper .col-md-pull-4{right:33.33333333%}.pt-cv-wrapper .col-md-pull-3{right:25%}.pt-cv-wrapper .col-md-pull-2{right:16.66666667%}.pt-cv-wrapper .col-md-pull-1{right:8.33333333%}.pt-cv-wrapper .col-md-pull-0{right:auto}.pt-cv-wrapper .col-md-push-12{left:100%}.pt-cv-wrapper .col-md-push-11{left:91.66666667%}.pt-cv-wrapper .col-md-push-10{left:83.33333333%}.pt-cv-wrapper .col-md-push-9{left:75%}.pt-cv-wrapper .col-md-push-8{left:66.66666667%}.pt-cv-wrapper .col-md-push-7{left:58.33333333%}.pt-cv-wrapper .col-md-push-6{left:50%}.pt-cv-wrapper .col-md-push-5{left:41.66666667%}.pt-cv-wrapper .col-md-push-4{left:33.33333333%}.pt-cv-wrapper .col-md-push-3{left:25%}.pt-cv-wrapper .col-md-push-2{left:16.66666667%}.pt-cv-wrapper .col-md-push-1{left:8.33333333%}.pt-cv-wrapper .col-md-push-0{left:auto}.pt-cv-wrapper .col-md-offset-12{margin-left:100%}.pt-cv-wrapper .col-md-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-md-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-md-offset-9{margin-left:75%}.pt-cv-wrapper .col-md-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-md-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-md-offset-6{margin-left:50%}.pt-cv-wrapper .col-md-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-md-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-md-offset-3{margin-left:25%}.pt-cv-wrapper .col-md-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-md-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-md-offset-0{margin-left:0}}@media(min-width:1200px){.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9{float:left}.pt-cv-wrapper .col-lg-12{width:100%}.pt-cv-wrapper .col-lg-11{width:91.66666667%}.pt-cv-wrapper .col-lg-10{width:83.33333333%}.pt-cv-wrapper .col-lg-9{width:75%}.pt-cv-wrapper .col-lg-8{width:66.66666667%}.pt-cv-wrapper .col-lg-7{width:58.33333333%}.pt-cv-wrapper .col-lg-6{width:50%}.pt-cv-wrapper .col-lg-5{width:41.66666667%}.pt-cv-wrapper .col-lg-4{width:33.33333333%}.pt-cv-wrapper .col-lg-3{width:25%}.pt-cv-wrapper .col-lg-2{width:16.66666667%}.pt-cv-wrapper .col-lg-1{width:8.33333333%}.pt-cv-wrapper .col-lg-pull-12{right:100%}.pt-cv-wrapper .col-lg-pull-11{right:91.66666667%}.pt-cv-wrapper .col-lg-pull-10{right:83.33333333%}.pt-cv-wrapper .col-lg-pull-9{right:75%}.pt-cv-wrapper .col-lg-pull-8{right:66.66666667%}.pt-cv-wrapper .col-lg-pull-7{right:58.33333333%}.pt-cv-wrapper .col-lg-pull-6{right:50%}.pt-cv-wrapper .col-lg-pull-5{right:41.66666667%}.pt-cv-wrapper .col-lg-pull-4{right:33.33333333%}.pt-cv-wrapper .col-lg-pull-3{right:25%}.pt-cv-wrapper .col-lg-pull-2{right:16.66666667%}.pt-cv-wrapper .col-lg-pull-1{right:8.33333333%}.pt-cv-wrapper .col-lg-pull-0{right:auto}.pt-cv-wrapper .col-lg-push-12{left:100%}.pt-cv-wrapper .col-lg-push-11{left:91.66666667%}.pt-cv-wrapper .col-lg-push-10{left:83.33333333%}.pt-cv-wrapper .col-lg-push-9{left:75%}.pt-cv-wrapper .col-lg-push-8{left:66.66666667%}.pt-cv-wrapper .col-lg-push-7{left:58.33333333%}.pt-cv-wrapper .col-lg-push-6{left:50%}.pt-cv-wrapper .col-lg-push-5{left:41.66666667%}.pt-cv-wrapper .col-lg-push-4{left:33.33333333%}.pt-cv-wrapper .col-lg-push-3{left:25%}.pt-cv-wrapper .col-lg-push-2{left:16.66666667%}.pt-cv-wrapper .col-lg-push-1{left:8.33333333%}.pt-cv-wrapper .col-lg-push-0{left:auto}.pt-cv-wrapper .col-lg-offset-12{margin-left:100%}.pt-cv-wrapper .col-lg-offset-11{margin-left:91.66666667%}.pt-cv-wrapper .col-lg-offset-10{margin-left:83.33333333%}.pt-cv-wrapper .col-lg-offset-9{margin-left:75%}.pt-cv-wrapper .col-lg-offset-8{margin-left:66.66666667%}.pt-cv-wrapper .col-lg-offset-7{margin-left:58.33333333%}.pt-cv-wrapper .col-lg-offset-6{margin-left:50%}.pt-cv-wrapper .col-lg-offset-5{margin-left:41.66666667%}.pt-cv-wrapper .col-lg-offset-4{margin-left:33.33333333%}.pt-cv-wrapper .col-lg-offset-3{margin-left:25%}.pt-cv-wrapper .col-lg-offset-2{margin-left:16.66666667%}.pt-cv-wrapper .col-lg-offset-1{margin-left:8.33333333%}.pt-cv-wrapper .col-lg-offset-0{margin-left:0}}.pt-cv-wrapper .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pt-cv-wrapper .btn.active.focus,.pt-cv-wrapper .btn.active:focus,.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:active.focus,.pt-cv-wrapper .btn:active:focus,.pt-cv-wrapper .btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn:hover{color:#333;text-decoration:none}.pt-cv-wrapper .btn.active,.pt-cv-wrapper .btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.pt-cv-wrapper .btn.disabled,.pt-cv-wrapper .btn[disabled],.pt-cv-wrapper fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper a.btn.disabled,.pt-cv-wrapper fieldset[disabled] a.btn{pointer-events:none}.pt-cv-wrapper .btn-default{color:#333;background-color:#fff;border-color:#ccc}.pt-cv-wrapper .btn-default.focus,.pt-cv-wrapper .btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.pt-cv-wrapper .btn-default.active.focus,.pt-cv-wrapper .btn-default.active:focus,.pt-cv-wrapper .btn-default.active:hover,.pt-cv-wrapper .btn-default:active.focus,.pt-cv-wrapper .btn-default:active:focus,.pt-cv-wrapper .btn-default:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{background-image:none}.pt-cv-wrapper .btn-default.disabled,.pt-cv-wrapper .btn-default.disabled.active,.pt-cv-wrapper .btn-default.disabled.focus,.pt-cv-wrapper .btn-default.disabled:active,.pt-cv-wrapper .btn-default.disabled:focus,.pt-cv-wrapper .btn-default.disabled:hover,.pt-cv-wrapper .btn-default[disabled],.pt-cv-wrapper .btn-default[disabled].active,.pt-cv-wrapper .btn-default[disabled].focus,.pt-cv-wrapper .btn-default[disabled]:active,.pt-cv-wrapper .btn-default[disabled]:focus,.pt-cv-wrapper .btn-default[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-default,.pt-cv-wrapper fieldset[disabled] .btn-default.active,.pt-cv-wrapper fieldset[disabled] .btn-default.focus,.pt-cv-wrapper fieldset[disabled] .btn-default:active,.pt-cv-wrapper fieldset[disabled] .btn-default:focus,.pt-cv-wrapper fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.pt-cv-wrapper .btn-default .badge{color:#fff;background-color:#333}.pt-cv-wrapper .btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.pt-cv-wrapper .btn-primary.focus,.pt-cv-wrapper .btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.pt-cv-wrapper .btn-primary.active.focus,.pt-cv-wrapper .btn-primary.active:focus,.pt-cv-wrapper .btn-primary.active:hover,.pt-cv-wrapper .btn-primary:active.focus,.pt-cv-wrapper .btn-primary:active:focus,.pt-cv-wrapper .btn-primary:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{background-image:none}.pt-cv-wrapper .btn-primary.disabled,.pt-cv-wrapper .btn-primary.disabled.active,.pt-cv-wrapper .btn-primary.disabled.focus,.pt-cv-wrapper .btn-primary.disabled:active,.pt-cv-wrapper .btn-primary.disabled:focus,.pt-cv-wrapper .btn-primary.disabled:hover,.pt-cv-wrapper .btn-primary[disabled],.pt-cv-wrapper .btn-primary[disabled].active,.pt-cv-wrapper .btn-primary[disabled].focus,.pt-cv-wrapper .btn-primary[disabled]:active,.pt-cv-wrapper .btn-primary[disabled]:focus,.pt-cv-wrapper .btn-primary[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-primary,.pt-cv-wrapper fieldset[disabled] .btn-primary.active,.pt-cv-wrapper fieldset[disabled] .btn-primary.focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:active,.pt-cv-wrapper fieldset[disabled] .btn-primary:focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.pt-cv-wrapper .btn-primary .badge{color:#337ab7;background-color:#fff}.pt-cv-wrapper .btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.pt-cv-wrapper .btn-success.focus,.pt-cv-wrapper .btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.pt-cv-wrapper .btn-success.active.focus,.pt-cv-wrapper .btn-success.active:focus,.pt-cv-wrapper .btn-success.active:hover,.pt-cv-wrapper .btn-success:active.focus,.pt-cv-wrapper .btn-success:active:focus,.pt-cv-wrapper .btn-success:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{background-image:none}.pt-cv-wrapper .btn-success.disabled,.pt-cv-wrapper .btn-success.disabled.active,.pt-cv-wrapper .btn-success.disabled.focus,.pt-cv-wrapper .btn-success.disabled:active,.pt-cv-wrapper .btn-success.disabled:focus,.pt-cv-wrapper .btn-success.disabled:hover,.pt-cv-wrapper .btn-success[disabled],.pt-cv-wrapper .btn-success[disabled].active,.pt-cv-wrapper .btn-success[disabled].focus,.pt-cv-wrapper .btn-success[disabled]:active,.pt-cv-wrapper .btn-success[disabled]:focus,.pt-cv-wrapper .btn-success[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-success,.pt-cv-wrapper fieldset[disabled] .btn-success.active,.pt-cv-wrapper fieldset[disabled] .btn-success.focus,.pt-cv-wrapper fieldset[disabled] .btn-success:active,.pt-cv-wrapper fieldset[disabled] .btn-success:focus,.pt-cv-wrapper fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.pt-cv-wrapper .btn-success .badge{color:#5cb85c;background-color:#fff}.pt-cv-wrapper .btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.pt-cv-wrapper .btn-info.focus,.pt-cv-wrapper .btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.pt-cv-wrapper .btn-info.active.focus,.pt-cv-wrapper .btn-info.active:focus,.pt-cv-wrapper .btn-info.active:hover,.pt-cv-wrapper .btn-info:active.focus,.pt-cv-wrapper .btn-info:active:focus,.pt-cv-wrapper .btn-info:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{background-image:none}.pt-cv-wrapper .btn-info.disabled,.pt-cv-wrapper .btn-info.disabled.active,.pt-cv-wrapper .btn-info.disabled.focus,.pt-cv-wrapper .btn-info.disabled:active,.pt-cv-wrapper .btn-info.disabled:focus,.pt-cv-wrapper .btn-info.disabled:hover,.pt-cv-wrapper .btn-info[disabled],.pt-cv-wrapper .btn-info[disabled].active,.pt-cv-wrapper .btn-info[disabled].focus,.pt-cv-wrapper .btn-info[disabled]:active,.pt-cv-wrapper .btn-info[disabled]:focus,.pt-cv-wrapper .btn-info[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-info,.pt-cv-wrapper fieldset[disabled] .btn-info.active,.pt-cv-wrapper fieldset[disabled] .btn-info.focus,.pt-cv-wrapper fieldset[disabled] .btn-info:active,.pt-cv-wrapper fieldset[disabled] .btn-info:focus,.pt-cv-wrapper fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.pt-cv-wrapper .btn-info .badge{color:#5bc0de;background-color:#fff}.pt-cv-wrapper .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.pt-cv-wrapper .btn-warning.focus,.pt-cv-wrapper .btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.pt-cv-wrapper .btn-warning.active.focus,.pt-cv-wrapper .btn-warning.active:focus,.pt-cv-wrapper .btn-warning.active:hover,.pt-cv-wrapper .btn-warning:active.focus,.pt-cv-wrapper .btn-warning:active:focus,.pt-cv-wrapper .btn-warning:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{background-image:none}.pt-cv-wrapper .btn-warning.disabled,.pt-cv-wrapper .btn-warning.disabled.active,.pt-cv-wrapper .btn-warning.disabled.focus,.pt-cv-wrapper .btn-warning.disabled:active,.pt-cv-wrapper .btn-warning.disabled:focus,.pt-cv-wrapper .btn-warning.disabled:hover,.pt-cv-wrapper .btn-warning[disabled],.pt-cv-wrapper .btn-warning[disabled].active,.pt-cv-wrapper .btn-warning[disabled].focus,.pt-cv-wrapper .btn-warning[disabled]:active,.pt-cv-wrapper .btn-warning[disabled]:focus,.pt-cv-wrapper .btn-warning[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-warning,.pt-cv-wrapper fieldset[disabled] .btn-warning.active,.pt-cv-wrapper fieldset[disabled] .btn-warning.focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:active,.pt-cv-wrapper fieldset[disabled] .btn-warning:focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.pt-cv-wrapper .btn-warning .badge{color:#f0ad4e;background-color:#fff}.pt-cv-wrapper .btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.pt-cv-wrapper .btn-danger.focus,.pt-cv-wrapper .btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.pt-cv-wrapper .btn-danger.active.focus,.pt-cv-wrapper .btn-danger.active:focus,.pt-cv-wrapper .btn-danger.active:hover,.pt-cv-wrapper .btn-danger:active.focus,.pt-cv-wrapper .btn-danger:active:focus,.pt-cv-wrapper .btn-danger:active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{background-image:none}.pt-cv-wrapper .btn-danger.disabled,.pt-cv-wrapper .btn-danger.disabled.active,.pt-cv-wrapper .btn-danger.disabled.focus,.pt-cv-wrapper .btn-danger.disabled:active,.pt-cv-wrapper .btn-danger.disabled:focus,.pt-cv-wrapper .btn-danger.disabled:hover,.pt-cv-wrapper .btn-danger[disabled],.pt-cv-wrapper .btn-danger[disabled].active,.pt-cv-wrapper .btn-danger[disabled].focus,.pt-cv-wrapper .btn-danger[disabled]:active,.pt-cv-wrapper .btn-danger[disabled]:focus,.pt-cv-wrapper .btn-danger[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-danger,.pt-cv-wrapper fieldset[disabled] .btn-danger.active,.pt-cv-wrapper fieldset[disabled] .btn-danger.focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:active,.pt-cv-wrapper fieldset[disabled] .btn-danger:focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.pt-cv-wrapper .btn-danger .badge{color:#d9534f;background-color:#fff}.pt-cv-wrapper .btn-link{color:#337ab7;font-weight:400;border-radius:0}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link.active,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link[disabled],.pt-cv-wrapper fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:hover{border-color:transparent}.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.pt-cv-wrapper .btn-link[disabled]:focus,.pt-cv-wrapper .btn-link[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-link:focus,.pt-cv-wrapper fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.pt-cv-wrapper .btn-group-lg>.btn,.pt-cv-wrapper .btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.pt-cv-wrapper .btn-group-sm>.btn,.pt-cv-wrapper .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.pt-cv-wrapper .btn-group-xs>.btn,.pt-cv-wrapper .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.pt-cv-wrapper .btn-block{display:block;width:100%}.pt-cv-wrapper .btn-block+.btn-block{margin-top:5px}.pt-cv-wrapper input[type=button].btn-block,.pt-cv-wrapper input[type=reset].btn-block,.pt-cv-wrapper input[type=submit].btn-block{width:100%}.pt-cv-wrapper .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.pt-cv-wrapper .fade.in{opacity:1}.pt-cv-wrapper .collapse{display:none}.pt-cv-wrapper .collapse.in{display:block}.pt-cv-wrapper tr.collapse.in{display:table-row}.pt-cv-wrapper tbody.collapse.in{display:table-row-group}.pt-cv-wrapper .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.pt-cv-wrapper .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.pt-cv-wrapper .dropdown,.pt-cv-wrapper .dropup{position:relative}.pt-cv-wrapper .dropdown-toggle:focus{outline:0}.pt-cv-wrapper .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);-webkit-background-clip:padding-box;background-clip:padding-box}.pt-cv-wrapper .dropdown-menu.pull-right{right:0;left:auto}.pt-cv-wrapper .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.pt-cv-wrapper .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.pt-cv-wrapper .dropdown-menu>li>a:focus,.pt-cv-wrapper .dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.pt-cv-wrapper .dropdown-menu>.active>a,.pt-cv-wrapper .dropdown-menu>.active>a:focus,.pt-cv-wrapper .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.pt-cv-wrapper .dropdown-menu>.disabled>a,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover{color:#777}.pt-cv-wrapper .dropdown-menu>.disabled>a:focus,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.pt-cv-wrapper .open>.dropdown-menu{display:block}.pt-cv-wrapper .open>a{outline:0}.pt-cv-wrapper .dropdown-menu-right{left:auto;right:0}.pt-cv-wrapper .dropdown-menu-left{left:0;right:auto}.pt-cv-wrapper .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.pt-cv-wrapper .dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pt-cv-wrapper .pull-right>.dropdown-menu{right:0;left:auto}.pt-cv-wrapper .dropup .caret,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.pt-cv-wrapper .dropup .dropdown-menu,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media(min-width:768px){.pt-cv-wrapper .navbar-right .dropdown-menu{left:auto;right:0}.pt-cv-wrapper .navbar-right .dropdown-menu-left{left:0;right:auto}}.pt-cv-wrapper .btn-group,.pt-cv-wrapper .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group>.btn{position:relative;float:left}.pt-cv-wrapper .btn-group-vertical>.btn.active,.pt-cv-wrapper .btn-group-vertical>.btn:active,.pt-cv-wrapper .btn-group-vertical>.btn:focus,.pt-cv-wrapper .btn-group-vertical>.btn:hover,.pt-cv-wrapper .btn-group>.btn.active,.pt-cv-wrapper .btn-group>.btn:active,.pt-cv-wrapper .btn-group>.btn:focus,.pt-cv-wrapper .btn-group>.btn:hover{z-index:2}.pt-cv-wrapper .btn-group .btn+.btn,.pt-cv-wrapper .btn-group .btn+.btn-group,.pt-cv-wrapper .btn-group .btn-group+.btn,.pt-cv-wrapper .btn-group .btn-group+.btn-group{margin-left:-1px}.pt-cv-wrapper .btn-toolbar{margin-left:-5px}.pt-cv-wrapper .btn-toolbar .btn,.pt-cv-wrapper .btn-toolbar .btn-group,.pt-cv-wrapper .btn-toolbar .input-group{float:left}.pt-cv-wrapper .btn-toolbar>.btn,.pt-cv-wrapper .btn-toolbar>.btn-group,.pt-cv-wrapper .btn-toolbar>.input-group{margin-left:5px}.pt-cv-wrapper .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.pt-cv-wrapper .btn-group>.btn:first-child{margin-left:0}.pt-cv-wrapper .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.pt-cv-wrapper .btn-group>.btn:last-child:not(:first-child),.pt-cv-wrapper .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group>.btn-group{float:left}.pt-cv-wrapper .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.pt-cv-wrapper .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group .dropdown-toggle:active,.pt-cv-wrapper .btn-group.open .dropdown-toggle{outline:0}.pt-cv-wrapper .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.pt-cv-wrapper .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.pt-cv-wrapper .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.pt-cv-wrapper .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.pt-cv-wrapper .btn .caret{margin-left:0}.pt-cv-wrapper .btn-lg .caret{border-width:5px 5px 0}.pt-cv-wrapper .dropup .btn-lg .caret{border-width:0 5px 5px}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{float:none}.pt-cv-wrapper .btn-group-vertical>.btn+.btn,.pt-cv-wrapper .btn-group-vertical>.btn+.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.pt-cv-wrapper .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.pt-cv-wrapper .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.pt-cv-wrapper .btn-group-justified>.btn,.pt-cv-wrapper .btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.pt-cv-wrapper .btn-group-justified>.btn-group .btn{width:100%}.pt-cv-wrapper .btn-group-justified>.btn-group .dropdown-menu{left:auto}.pt-cv-wrapper [data-toggle=buttons]>.btn input[type=checkbox],.pt-cv-wrapper [data-toggle=buttons]>.btn input[type=radio],.pt-cv-wrapper [data-toggle=buttons]>.btn-group>.btn input[type=checkbox],.pt-cv-wrapper [data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.pt-cv-wrapper .nav{margin-bottom:0;padding-left:0;list-style:none}.pt-cv-wrapper .nav>li{position:relative;display:block}.pt-cv-wrapper .nav>li>a{position:relative;display:block;padding:10px 15px}.pt-cv-wrapper .nav>li>a:focus,.pt-cv-wrapper .nav>li>a:hover{text-decoration:none;background-color:#eee}.pt-cv-wrapper .nav>li.disabled>a{color:#777}.pt-cv-wrapper .nav>li.disabled>a:focus,.pt-cv-wrapper .nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.pt-cv-wrapper .nav .open>a,.pt-cv-wrapper .nav .open>a:focus,.pt-cv-wrapper .nav .open>a:hover{background-color:#eee;border-color:#337ab7}.pt-cv-wrapper .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.pt-cv-wrapper .nav>li>a>img{max-width:none}.pt-cv-wrapper .nav-tabs{border-bottom:1px solid #ddd}.pt-cv-wrapper .nav-tabs>li{float:left;margin-bottom:-1px}.pt-cv-wrapper .nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.pt-cv-wrapper .nav-tabs>li.active>a,.pt-cv-wrapper .nav-tabs>li.active>a:focus,.pt-cv-wrapper .nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.pt-cv-wrapper .nav-tabs.nav-justified{width:100%;border-bottom:0}.pt-cv-wrapper .nav-tabs.nav-justified>li{float:none}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.pt-cv-wrapper .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li{display:table-cell;width:1%}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-bottom:0}}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.pt-cv-wrapper .nav-pills>li{float:left}.pt-cv-wrapper .nav-pills>li>a{border-radius:4px}.pt-cv-wrapper .nav-pills>li+li{margin-left:2px}.pt-cv-wrapper .nav-pills>li.active>a,.pt-cv-wrapper .nav-pills>li.active>a:focus,.pt-cv-wrapper .nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.pt-cv-wrapper .nav-stacked>li{float:none}.pt-cv-wrapper .nav-stacked>li+li{margin-top:2px;margin-left:0}.pt-cv-wrapper .nav-justified{width:100%}.pt-cv-wrapper .nav-justified>li{float:none}.pt-cv-wrapper .nav-justified>li>a{text-align:center;margin-bottom:5px}.pt-cv-wrapper .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.pt-cv-wrapper .nav-justified>li{display:table-cell;width:1%}.pt-cv-wrapper .nav-justified>li>a{margin-bottom:0}}.pt-cv-wrapper .nav-tabs-justified{border-bottom:0}.pt-cv-wrapper .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.pt-cv-wrapper .nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.pt-cv-wrapper .tab-content>.tab-pane{display:none}.pt-cv-wrapper .tab-content>.active{display:block}.pt-cv-wrapper .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pt-cv-wrapper .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pt-cv-wrapper .pagination>li{display:inline}.pt-cv-wrapper .pagination>li>a,.pt-cv-wrapper .pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pt-cv-wrapper .pagination>li:first-child>a,.pt-cv-wrapper .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pt-cv-wrapper .pagination>li:last-child>a,.pt-cv-wrapper .pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pt-cv-wrapper .pagination>li>a:focus,.pt-cv-wrapper .pagination>li>a:hover,.pt-cv-wrapper .pagination>li>span:focus,.pt-cv-wrapper .pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pt-cv-wrapper .pagination>.active>a,.pt-cv-wrapper .pagination>.active>a:focus,.pt-cv-wrapper .pagination>.active>a:hover,.pt-cv-wrapper .pagination>.active>span,.pt-cv-wrapper .pagination>.active>span:focus,.pt-cv-wrapper .pagination>.active>span:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pt-cv-wrapper .pagination>.disabled>a,.pt-cv-wrapper .pagination>.disabled>a:focus,.pt-cv-wrapper .pagination>.disabled>a:hover,.pt-cv-wrapper .pagination>.disabled>span,.pt-cv-wrapper .pagination>.disabled>span:focus,.pt-cv-wrapper .pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pt-cv-wrapper .pagination-lg>li>a,.pt-cv-wrapper .pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pt-cv-wrapper .pagination-lg>li:first-child>a,.pt-cv-wrapper .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pt-cv-wrapper .pagination-lg>li:last-child>a,.pt-cv-wrapper .pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pt-cv-wrapper .pagination-sm>li>a,.pt-cv-wrapper .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pt-cv-wrapper .pagination-sm>li:first-child>a,.pt-cv-wrapper .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pt-cv-wrapper .pagination-sm>li:last-child>a,.pt-cv-wrapper .pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pt-cv-wrapper .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .thumbnail>img{margin-left:auto;margin-right:auto}.pt-cv-wrapper a.thumbnail.active,.pt-cv-wrapper a.thumbnail:focus,.pt-cv-wrapper a.thumbnail:hover{border-color:#337ab7}.pt-cv-wrapper .thumbnail .caption{padding:9px;color:#333}.pt-cv-wrapper .pt-cv-carousel{position:relative}.pt-cv-wrapper .carousel-inner{position:relative;overflow:hidden;width:100%}.pt-cv-wrapper .carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.pt-cv-wrapper .carousel-inner>.item>a>img,.pt-cv-wrapper .carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.pt-cv-wrapper .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.pt-cv-wrapper .carousel-inner>.item.active.right,.pt-cv-wrapper .carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.pt-cv-wrapper .carousel-inner>.item.active.left,.pt-cv-wrapper .carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.pt-cv-wrapper .carousel-inner>.item.active,.pt-cv-wrapper .carousel-inner>.item.next.left,.pt-cv-wrapper .carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.pt-cv-wrapper .carousel-inner>.active,.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{display:block}.pt-cv-wrapper .carousel-inner>.active{left:0}.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{position:absolute;top:0;width:100%}.pt-cv-wrapper .carousel-inner>.next{left:100%}.pt-cv-wrapper .carousel-inner>.prev{left:-100%}.pt-cv-wrapper .carousel-inner>.next.left,.pt-cv-wrapper .carousel-inner>.prev.right{left:0}.pt-cv-wrapper .carousel-inner>.active.left{left:-100%}.pt-cv-wrapper .carousel-inner>.active.right{left:100%}.pt-cv-wrapper .carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.pt-cv-wrapper .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.pt-cv-wrapper .carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.pt-cv-wrapper .carousel-control:focus,.pt-cv-wrapper .carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{left:50%;margin-left:-10px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{right:50%;margin-right:-10px}.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.pt-cv-wrapper .carousel-control .icon-prev:before{content:'\2039'}.pt-cv-wrapper .carousel-control .icon-next:before{content:'\203a'}.pt-cv-wrapper .pt-cv-carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.pt-cv-wrapper .pt-cv-carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.pt-cv-wrapper .pt-cv-carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.pt-cv-wrapper .pt-cv-carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.pt-cv-wrapper .pt-cv-carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{margin-left:-15px}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{margin-right:-15px}.pt-cv-wrapper .pt-cv-carousel-caption{left:20%;right:20%;padding-bottom:30px}.pt-cv-wrapper .pt-cv-carousel-indicators{bottom:20px}}.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:before,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-toolbar:before,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .clearfix:before,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .container-fluid:before,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container:before,.pt-cv-wrapper .nav:after,.pt-cv-wrapper .nav:before,.pt-cv-wrapper .row:after,.pt-cv-wrapper .row:before{content:" ";display:table}.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .container:after,.pt-cv-wrapper .nav:after,.pt-cv-wrapper .row:after{clear:both}.pt-cv-wrapper .center-block{display:block;margin-left:auto;margin-right:auto}.pt-cv-wrapper .pull-right{float:right!important}.pt-cv-wrapper .pull-left{float:left!important}.pt-cv-wrapper .hide{display:none!important}.pt-cv-wrapper .show{display:block!important}.pt-cv-wrapper .invisible{visibility:hidden}.pt-cv-wrapper .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.pt-cv-wrapper .hidden{display:none!important}.pt-cv-wrapper .affix{position:fixed}.pt-cv-wrapper .text-left{text-align:left}.pt-cv-wrapper .text-right{text-align:right}.pt-cv-wrapper .text-center{text-align:center}.pt-cv-wrapper .text-justify{text-align:justify}.pt-cv-wrapper .text-nowrap{white-space:nowrap}.pt-cv-wrapper .text-lowercase{text-transform:lowercase}.pt-cv-wrapper .text-uppercase{text-transform:uppercase}.pt-cv-wrapper .text-capitalize{text-transform:capitalize}.pt-cv-wrapper .text-muted{color:#777}.pt-cv-wrapper .text-primary{color:#428bca}.pt-cv-wrapper .h1,.pt-cv-wrapper .h2,.pt-cv-wrapper .h3,.pt-cv-wrapper .h4,.pt-cv-wrapper .h5,.pt-cv-wrapper .h6,.pt-cv-wrapper h1,.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper h4,.pt-cv-wrapper h5,.pt-cv-wrapper h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.pt-cv-view *,.pt-cv-view :after,.pt-cv-view :before{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.pt-cv-view{position:relative;clear:both}.pt-cv-view:after{clear:both;content:'';display:block}.pt-cv-page{position:relative}.pt-cv-gls-group{clear:left}.pt-cv-view strong,.pt-cv-view strong *{font-weight:600!important}.pt-cv-colsys{margin-left:-15px;margin-right:-15px}@media (min-width:992px){.pt-cv-colsys [data-cvc="11"] .col-md-1:nth-child(11n+1),.pt-cv-colsys [data-cvc="12"] .col-md-1:nth-child(12n+1),.pt-cv-colsys [data-cvc="2"] .col-md-6:nth-child(2n+1),.pt-cv-colsys [data-cvc="3"] .col-md-4:nth-child(3n+1),.pt-cv-colsys [data-cvc="4"] .col-md-3:nth-child(4n+1),.pt-cv-colsys [data-cvc="5"] .col-md-2:nth-child(5n+1),.pt-cv-colsys [data-cvc="6"] .col-md-2:nth-child(6n+1),.pt-cv-colsys [data-cvc="7"] .col-md-1:nth-child(7n+1),.pt-cv-colsys [data-cvc="8"] .col-md-1:nth-child(8n+1),.pt-cv-colsys [data-cvc="9"] .col-md-1:nth-child(9n+1),.pt-cv-colsys [data-cvc="10"] .col-md-1:nth-child(10n+1){clear:left!important}}@media (min-width:768px) and (max-width:991px){.pt-cv-colsys .col-sm-2:nth-child(5n+1),.pt-cv-colsys .col-sm-2:nth-child(6n+1),.pt-cv-colsys .col-sm-3:nth-child(4n+1),.pt-cv-colsys .col-sm-4:nth-child(3n+1),.pt-cv-colsys .col-sm-6:nth-child(2n+1){clear:left!important}}@media (max-width:767px){.pt-cv-colsys .col-xs-2:nth-child(5n+1),.pt-cv-colsys .col-xs-2:nth-child(6n+1),.pt-cv-colsys .col-xs-3:nth-child(4n+1),.pt-cv-colsys .col-xs-4:nth-child(3n+1),.pt-cv-colsys .col-xs-6:nth-child(2n+1){clear:left!important}}@media (min-width:992px){.pt-cv-colsys [data-cvc="5"] .pt-cv-content-item{width:20%}.pt-cv-colsys [data-cvc="7"] .pt-cv-content-item{width:14.28571428%}.pt-cv-colsys [data-cvc="8"] .pt-cv-content-item{width:12.5%}.pt-cv-colsys [data-cvc="9"] .pt-cv-content-item{width:11.11111111%}.pt-cv-colsys [data-cvc="10"] .pt-cv-content-item{width:10%}.pt-cv-colsys [data-cvc="11"] .pt-cv-content-item{width:9.09090909%}}.pt-cv-colsys .pt-cv-content-item{flex:none;max-width:initial}.pt-cv-view a,.pt-cv-wrapper .btn{text-decoration:none!important;outline:0!important;font-style:normal}.pt-cv-view a{pointer-events:auto}.pt-cv-readmore{color:#fff;margin:10px 0;max-width:100%}.pt-cv-content-item{padding-bottom:15px;position:relative;overflow:hidden}.pt-cv-ifield>*,.pt-cv-view .pt-cv-content-item>*{margin-bottom:10px}.pt-cv-collapsible .pt-cv-content-item>*{margin-bottom:0!important}.pt-cv-title{margin-top:0!important}h4.pt-cv-title{font-size:18px}.pt-cv-view .pt-cv-title{margin-bottom:10px}.pt-cv-title a{font-weight:600}.pt-cv-thumbnail{height:auto;max-width:100%!important;margin-top:0!important;margin-bottom:10px!important;min-width:inherit!important}.pt-cv-thumbnail.pull-left{margin-right:15px!important}.pt-cv-thumbnail.pull-right{margin-left:15px}.pt-cv-no-image{min-width:80px;min-height:80px}.pt-cv-content,.pt-cv-content *{font-weight:400}.pt-cv-meta-fields{font-size:13px;margin-top:0}.pt-cv-meta-fields a{color:#41b7d8}.pt-cv-pagination-wrapper{margin:20px 0}.pt-cv-view+.pagination{float:left;margin:0 auto!important}.pt-cv-view+.pagination>li{background:0 0!important}.pt-cv-view+.pagination>li>a{cursor:pointer}.pt-cv-spinner{width:15px!important;height:15px!important;margin-top:-25px;display:inline-block;opacity:0;filter:alpha(opacity=0);color:#0470ec;-webkit-transition:opacity .25s,width .25s;-moz-transition:opacity .25s,width .25s;-o-transition:opacity .25s,width .25s;transition:opacity .25s,width .25s}.pt-cv-spinner.active{opacity:1;filter:alpha(opacity=100)}.pt-cv-clear-pagination{margin-bottom:50px}.pt-cv-pagination-wrapper{clear:both;position:relative}.pt-cv-pagination-wrapper .pt-cv-pagination.pagination{-webkit-box-shadow:none!important;box-shadow:none!important;border:0;padding:0;margin:initial;min-height:initial;width:auto;display:inline-block}.pt-cv-pagination li{display:inline!important;background-image:none!important}.pt-cv-pagination li:after,.pt-cv-pagination li:before{content:none!important}.pt-cv-pagination a{cursor:pointer}.pt-cv-pagination li.active a{border-color:rgba(66,139,202,.2)!important}.pt-cv-pagination li a[href="#"]{pointer-events:none}.pt-cv-collapsible .panel{display:block}.pt-cv-collapsible .panel-heading{padding:0}.pt-cv-collapsible .panel-heading a{display:block;padding:10px 15px}.pt-cv-collapsible .panel-body{padding:10px}.pt-cv-view .collapse{display:none;visibility:hidden}.pt-cv-view .collapse.in{display:block;visibility:visible;overflow:auto}.pt-cv-collapsible .panel-heading br{display:none}.pt-cv-scrollable{margin-left:0;margin-right:0}.pt-cv-scrollable .pt-cv-carousel-caption{text-align:left;bottom:15px;padding:10px}.pt-cv-scrollable .pt-cv-carousel-caption *{text-shadow:none}.pt-cv-scrollable .pt-cv-title{padding-bottom:0}.pt-cv-scrollable .pt-cv-carousel-caption{margin-bottom:10px!important}.pt-cv-scrollable .pt-cv-thumbnail{width:100%}.pt-cv-carousel-caption:empty{display:none}.pt-cv-scrollable .pt-cv-carousel .item{height:auto;margin:auto;min-height:0;max-height:none;line-height:normal}.pt-cv-scrollable .pt-cv-cap-w-img{background:rgba(0,0,0,.6);text-shadow:0 1px 1px #000;left:15px;right:15px}.pt-cv-cap-w-img *{color:#fff}.pt-cv-cap-w-img .pt-cv-title a{color:#fff!important}.pt-cv-scrollable .pt-cv-cap-wo-img{position:relative!important;bottom:0!important;left:0;right:0}.pt-cv-cap-wo-img *{color:#000}.pt-cv-cap-wo-img .pt-cv-readmore{color:#fff}.pt-cv-view .carousel-control{background-image:none!important;height:30px;width:40px;bottom:0;top:auto;color:#00A100;cursor:pointer}.pt-cv-view .pt-cv-carousel-indicators{bottom:0;margin-bottom:4px}.pt-cv-view .pt-cv-carousel-indicators li{background:#cecece;border:1px solid #cecece;margin:0}.pt-cv-view .pt-cv-carousel-indicators li.active{background:#428bca;border:1px solid #428bca}.pt-cv-2-col .pt-cv-title{clear:none!important}@media (min-width:480px){.pt-cv-2-col .pt-cv-colwrap{display:table;word-break:break-word}}@media (max-width:479px){.pt-cv-2-col .pt-cv-colwrap{clear:both}}.pt-cv-view .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.pt-cv-view .panel-default{border-color:#ddd;padding-bottom:0}.pt-cv-view .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.pt-cv-pagination:after,.pt-cv-pagination:before{content:none!important}.pt-cv-wrapper [class*=pt-cv-] a{box-shadow:none}.pt-cv-view p:empty{display:none}.pt-cv-view .pt-cv-ifield{margin-bottom:0!important}@media (max-width:480px){.pt-cv-nolf .pt-cv-2-col .pt-cv-thumbnail{float:none!important;margin:0}}@media print{.pt-cv-view a[href]:after{content:none!important}.pt-cv-view .collapse{display:block!important;height:auto!important;visibility:visible!important}}
public/assets/css/cv.im.css CHANGED
@@ -1,5 +1,5 @@
1
- /*!
2
- * Bootstrap v3.3.5 (http://getbootstrap.com)
3
- * Copyright 2011-2015 Twitter, Inc.
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.pt-cv-wrapper article,.pt-cv-wrapper aside,.pt-cv-wrapper details,.pt-cv-wrapper figcaption,.pt-cv-wrapper footer,.pt-cv-wrapper header,.pt-cv-wrapper hgroup,.pt-cv-wrapper main,.pt-cv-wrapper menu,.pt-cv-wrapper nav,.pt-cv-wrapper section,.pt-cv-wrapper summary{display:block!important}.pt-cv-wrapper audio,.pt-cv-wrapper canvas,.pt-cv-wrapper progress,.pt-cv-wrapper video{display:inline-block!important;vertical-align:baseline!important}.pt-cv-wrapper audio:not([controls]){display:none!important;height:0!important}.pt-cv-wrapper [hidden],.pt-cv-wrapper template{display:none!important}.pt-cv-wrapper a{background-color:transparent!important}.pt-cv-wrapper a:active,.pt-cv-wrapper a:hover{outline:0!important}.pt-cv-wrapper abbr[title]{border-bottom:1px dotted!important}.pt-cv-wrapper b,.pt-cv-wrapper strong{font-weight:bold!important}.pt-cv-wrapper dfn{font-style:italic!important}.pt-cv-wrapper h1{margin:.67em 0!important}.pt-cv-wrapper mark{background:#ff0!important;color:#000!important}.pt-cv-wrapper small{font-size:80%!important}.pt-cv-wrapper sub,.pt-cv-wrapper sup{font-size:75%!important;line-height:0!important;position:relative!important;vertical-align:baseline!important}.pt-cv-wrapper sup{top:-0.5em!important}.pt-cv-wrapper sub{bottom:-0.25em!important}.pt-cv-wrapper img{border:0!important}.pt-cv-wrapper svg:not(:root){overflow:hidden!important}.pt-cv-wrapper hr{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important;height:0!important}.pt-cv-wrapper pre{overflow:auto!important}.pt-cv-wrapper code,.pt-cv-wrapper kbd,.pt-cv-wrapper pre,.pt-cv-wrapper samp{font-family:monospace,monospace!important;font-size:1em!important}.pt-cv-wrapper button,.pt-cv-wrapper input,.pt-cv-wrapper optgroup,.pt-cv-wrapper select,.pt-cv-wrapper textarea{color:inherit!important;font:inherit!important;margin:0!important}.pt-cv-wrapper button{overflow:visible!important}.pt-cv-wrapper button,.pt-cv-wrapper select{text-transform:none!important}.pt-cv-wrapper button,.pt-cv-wrapper html input[type="button"],.pt-cv-wrapper input[type="reset"],.pt-cv-wrapper input[type="submit"]{-webkit-appearance:button!important;cursor:pointer!important}.pt-cv-wrapper button[disabled],.pt-cv-wrapper html input[disabled]{cursor:default!important}.pt-cv-wrapper button::-moz-focus-inner,.pt-cv-wrapper input::-moz-focus-inner{border:0!important;padding:0!important}.pt-cv-wrapper input{line-height:normal!important}.pt-cv-wrapper input[type="checkbox"],.pt-cv-wrapper input[type="radio"]{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;padding:0!important}.pt-cv-wrapper input[type="number"]::-webkit-inner-spin-button,.pt-cv-wrapper input[type="number"]::-webkit-outer-spin-button{height:auto!important}.pt-cv-wrapper input[type="search"]{-webkit-appearance:textfield!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.pt-cv-wrapper input[type="search"]::-webkit-search-cancel-button,.pt-cv-wrapper input[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important}.pt-cv-wrapper fieldset{border:1px solid #c0c0c0!important;margin:0 2px!important;padding:.35em .625em .75em!important}.pt-cv-wrapper legend{border:0!important;padding:0!important}.pt-cv-wrapper textarea{overflow:auto!important}.pt-cv-wrapper optgroup{font-weight:bold!important}.pt-cv-wrapper table{border-collapse:collapse!important;border-spacing:0!important}.pt-cv-wrapper td,.pt-cv-wrapper th{padding:0!important}@media print{.pt-cv-wrapper *,.pt-cv-wrapper *:before,.pt-cv-wrapper *:after{background:transparent!important;color:#000!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}.pt-cv-wrapper a,.pt-cv-wrapper a:visited{text-decoration:underline!important}.pt-cv-wrapper a[href]:after{content:" (" attr(href) ")"!important}.pt-cv-wrapper abbr[title]:after{content:" (" attr(title) ")"!important}.pt-cv-wrapper a[href^="#"]:after,.pt-cv-wrapper a[href^="javascript:"]:after{content:""!important}.pt-cv-wrapper pre,.pt-cv-wrapper blockquote{border:1px solid #999!important;page-break-inside:avoid!important}.pt-cv-wrapper thead{display:table-header-group!important}.pt-cv-wrapper tr,.pt-cv-wrapper img{page-break-inside:avoid!important}.pt-cv-wrapper img{max-width:100%!important}.pt-cv-wrapper p,.pt-cv-wrapper h2,.pt-cv-wrapper h3{orphans:3!important;widows:3!important}.pt-cv-wrapper h2,.pt-cv-wrapper h3{page-break-after:avoid!important}.pt-cv-wrapper .navbar{display:none!important}.pt-cv-wrapper .btn>.caret,.pt-cv-wrapper .dropup>.btn>.caret{border-top-color:#000!important}.pt-cv-wrapper .label{border:1px solid #000!important}.pt-cv-wrapper .table{border-collapse:collapse!important}.pt-cv-wrapper .table td,.pt-cv-wrapper .table th{background-color:#fff!important}.pt-cv-wrapper .table-bordered th,.pt-cv-wrapper .table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.pt-cv-wrapper .glyphicon{position:relative!important;top:1px!important;display:inline-block!important;font-family:'Glyphicons Halflings'!important;font-style:normal!important;font-weight:normal!important;line-height:1!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.pt-cv-wrapper .glyphicon-asterisk:before{content:"\2a"!important}.pt-cv-wrapper .glyphicon-plus:before{content:"\2b"!important}.pt-cv-wrapper .glyphicon-euro:before,.pt-cv-wrapper .glyphicon-eur:before{content:"\20ac"!important}.pt-cv-wrapper .glyphicon-minus:before{content:"\2212"!important}.pt-cv-wrapper .glyphicon-cloud:before{content:"\2601"!important}.pt-cv-wrapper .glyphicon-envelope:before{content:"\2709"!important}.pt-cv-wrapper .glyphicon-pencil:before{content:"\270f"!important}.pt-cv-wrapper .glyphicon-glass:before{content:"\e001"!important}.pt-cv-wrapper .glyphicon-music:before{content:"\e002"!important}.pt-cv-wrapper .glyphicon-search:before{content:"\e003"!important}.pt-cv-wrapper .glyphicon-heart:before{content:"\e005"!important}.pt-cv-wrapper .glyphicon-star:before{content:"\e006"!important}.pt-cv-wrapper .glyphicon-star-empty:before{content:"\e007"!important}.pt-cv-wrapper .glyphicon-user:before{content:"\e008"!important}.pt-cv-wrapper .glyphicon-film:before{content:"\e009"!important}.pt-cv-wrapper .glyphicon-th-large:before{content:"\e010"!important}.pt-cv-wrapper .glyphicon-th:before{content:"\e011"!important}.pt-cv-wrapper .glyphicon-th-list:before{content:"\e012"!important}.pt-cv-wrapper .glyphicon-ok:before{content:"\e013"!important}.pt-cv-wrapper .glyphicon-remove:before{content:"\e014"!important}.pt-cv-wrapper .glyphicon-zoom-in:before{content:"\e015"!important}.pt-cv-wrapper .glyphicon-zoom-out:before{content:"\e016"!important}.pt-cv-wrapper .glyphicon-off:before{content:"\e017"!important}.pt-cv-wrapper .glyphicon-signal:before{content:"\e018"!important}.pt-cv-wrapper .glyphicon-cog:before{content:"\e019"!important}.pt-cv-wrapper .glyphicon-trash:before{content:"\e020"!important}.pt-cv-wrapper .glyphicon-home:before{content:"\e021"!important}.pt-cv-wrapper .glyphicon-file:before{content:"\e022"!important}.pt-cv-wrapper .glyphicon-time:before{content:"\e023"!important}.pt-cv-wrapper .glyphicon-road:before{content:"\e024"!important}.pt-cv-wrapper .glyphicon-download-alt:before{content:"\e025"!important}.pt-cv-wrapper .glyphicon-download:before{content:"\e026"!important}.pt-cv-wrapper .glyphicon-upload:before{content:"\e027"!important}.pt-cv-wrapper .glyphicon-inbox:before{content:"\e028"!important}.pt-cv-wrapper .glyphicon-play-circle:before{content:"\e029"!important}.pt-cv-wrapper .glyphicon-repeat:before{content:"\e030"!important}.pt-cv-wrapper .glyphicon-refresh:before{content:"\e031"!important}.pt-cv-wrapper .glyphicon-list-alt:before{content:"\e032"!important}.pt-cv-wrapper .glyphicon-lock:before{content:"\e033"!important}.pt-cv-wrapper .glyphicon-flag:before{content:"\e034"!important}.pt-cv-wrapper .glyphicon-headphones:before{content:"\e035"!important}.pt-cv-wrapper .glyphicon-volume-off:before{content:"\e036"!important}.pt-cv-wrapper .glyphicon-volume-down:before{content:"\e037"!important}.pt-cv-wrapper .glyphicon-volume-up:before{content:"\e038"!important}.pt-cv-wrapper .glyphicon-qrcode:before{content:"\e039"!important}.pt-cv-wrapper .glyphicon-barcode:before{content:"\e040"!important}.pt-cv-wrapper .glyphicon-tag:before{content:"\e041"!important}.pt-cv-wrapper .glyphicon-tags:before{content:"\e042"!important}.pt-cv-wrapper .glyphicon-book:before{content:"\e043"!important}.pt-cv-wrapper .glyphicon-bookmark:before{content:"\e044"!important}.pt-cv-wrapper .glyphicon-print:before{content:"\e045"!important}.pt-cv-wrapper .glyphicon-camera:before{content:"\e046"!important}.pt-cv-wrapper .glyphicon-font:before{content:"\e047"!important}.pt-cv-wrapper .glyphicon-bold:before{content:"\e048"!important}.pt-cv-wrapper .glyphicon-italic:before{content:"\e049"!important}.pt-cv-wrapper .glyphicon-text-height:before{content:"\e050"!important}.pt-cv-wrapper .glyphicon-text-width:before{content:"\e051"!important}.pt-cv-wrapper .glyphicon-align-left:before{content:"\e052"!important}.pt-cv-wrapper .glyphicon-align-center:before{content:"\e053"!important}.pt-cv-wrapper .glyphicon-align-right:before{content:"\e054"!important}.pt-cv-wrapper .glyphicon-align-justify:before{content:"\e055"!important}.pt-cv-wrapper .glyphicon-list:before{content:"\e056"!important}.pt-cv-wrapper .glyphicon-indent-left:before{content:"\e057"!important}.pt-cv-wrapper .glyphicon-indent-right:before{content:"\e058"!important}.pt-cv-wrapper .glyphicon-facetime-video:before{content:"\e059"!important}.pt-cv-wrapper .glyphicon-picture:before{content:"\e060"!important}.pt-cv-wrapper .glyphicon-map-marker:before{content:"\e062"!important}.pt-cv-wrapper .glyphicon-adjust:before{content:"\e063"!important}.pt-cv-wrapper .glyphicon-tint:before{content:"\e064"!important}.pt-cv-wrapper .glyphicon-edit:before{content:"\e065"!important}.pt-cv-wrapper .glyphicon-share:before{content:"\e066"!important}.pt-cv-wrapper .glyphicon-check:before{content:"\e067"!important}.pt-cv-wrapper .glyphicon-move:before{content:"\e068"!important}.pt-cv-wrapper .glyphicon-step-backward:before{content:"\e069"!important}.pt-cv-wrapper .glyphicon-fast-backward:before{content:"\e070"!important}.pt-cv-wrapper .glyphicon-backward:before{content:"\e071"!important}.pt-cv-wrapper .glyphicon-play:before{content:"\e072"!important}.pt-cv-wrapper .glyphicon-pause:before{content:"\e073"!important}.pt-cv-wrapper .glyphicon-stop:before{content:"\e074"!important}.pt-cv-wrapper .glyphicon-forward:before{content:"\e075"!important}.pt-cv-wrapper .glyphicon-fast-forward:before{content:"\e076"!important}.pt-cv-wrapper .glyphicon-step-forward:before{content:"\e077"!important}.pt-cv-wrapper .glyphicon-eject:before{content:"\e078"!important}.pt-cv-wrapper .glyphicon-chevron-left:before{content:"\e079"!important}.pt-cv-wrapper .glyphicon-chevron-right:before{content:"\e080"!important}.pt-cv-wrapper .glyphicon-plus-sign:before{content:"\e081"!important}.pt-cv-wrapper .glyphicon-minus-sign:before{content:"\e082"!important}.pt-cv-wrapper .glyphicon-remove-sign:before{content:"\e083"!important}.pt-cv-wrapper .glyphicon-ok-sign:before{content:"\e084"!important}.pt-cv-wrapper .glyphicon-question-sign:before{content:"\e085"!important}.pt-cv-wrapper .glyphicon-info-sign:before{content:"\e086"!important}.pt-cv-wrapper .glyphicon-screenshot:before{content:"\e087"!important}.pt-cv-wrapper .glyphicon-remove-circle:before{content:"\e088"!important}.pt-cv-wrapper .glyphicon-ok-circle:before{content:"\e089"!important}.pt-cv-wrapper .glyphicon-ban-circle:before{content:"\e090"!important}.pt-cv-wrapper .glyphicon-arrow-left:before{content:"\e091"!important}.pt-cv-wrapper .glyphicon-arrow-right:before{content:"\e092"!important}.pt-cv-wrapper .glyphicon-arrow-up:before{content:"\e093"!important}.pt-cv-wrapper .glyphicon-arrow-down:before{content:"\e094"!important}.pt-cv-wrapper .glyphicon-share-alt:before{content:"\e095"!important}.pt-cv-wrapper .glyphicon-resize-full:before{content:"\e096"!important}.pt-cv-wrapper .glyphicon-resize-small:before{content:"\e097"!important}.pt-cv-wrapper .glyphicon-exclamation-sign:before{content:"\e101"!important}.pt-cv-wrapper .glyphicon-gift:before{content:"\e102"!important}.pt-cv-wrapper .glyphicon-leaf:before{content:"\e103"!important}.pt-cv-wrapper .glyphicon-fire:before{content:"\e104"!important}.pt-cv-wrapper .glyphicon-eye-open:before{content:"\e105"!important}.pt-cv-wrapper .glyphicon-eye-close:before{content:"\e106"!important}.pt-cv-wrapper .glyphicon-warning-sign:before{content:"\e107"!important}.pt-cv-wrapper .glyphicon-plane:before{content:"\e108"!important}.pt-cv-wrapper .glyphicon-calendar:before{content:"\e109"!important}.pt-cv-wrapper .glyphicon-random:before{content:"\e110"!important}.pt-cv-wrapper .glyphicon-comment:before{content:"\e111"!important}.pt-cv-wrapper .glyphicon-magnet:before{content:"\e112"!important}.pt-cv-wrapper .glyphicon-chevron-up:before{content:"\e113"!important}.pt-cv-wrapper .glyphicon-chevron-down:before{content:"\e114"!important}.pt-cv-wrapper .glyphicon-retweet:before{content:"\e115"!important}.pt-cv-wrapper .glyphicon-shopping-cart:before{content:"\e116"!important}.pt-cv-wrapper .glyphicon-folder-close:before{content:"\e117"!important}.pt-cv-wrapper .glyphicon-folder-open:before{content:"\e118"!important}.pt-cv-wrapper .glyphicon-resize-vertical:before{content:"\e119"!important}.pt-cv-wrapper .glyphicon-resize-horizontal:before{content:"\e120"!important}.pt-cv-wrapper .glyphicon-hdd:before{content:"\e121"!important}.pt-cv-wrapper .glyphicon-bullhorn:before{content:"\e122"!important}.pt-cv-wrapper .glyphicon-bell:before{content:"\e123"!important}.pt-cv-wrapper .glyphicon-certificate:before{content:"\e124"!important}.pt-cv-wrapper .glyphicon-thumbs-up:before{content:"\e125"!important}.pt-cv-wrapper .glyphicon-thumbs-down:before{content:"\e126"!important}.pt-cv-wrapper .glyphicon-hand-right:before{content:"\e127"!important}.pt-cv-wrapper .glyphicon-hand-left:before{content:"\e128"!important}.pt-cv-wrapper .glyphicon-hand-up:before{content:"\e129"!important}.pt-cv-wrapper .glyphicon-hand-down:before{content:"\e130"!important}.pt-cv-wrapper .glyphicon-circle-arrow-right:before{content:"\e131"!important}.pt-cv-wrapper .glyphicon-circle-arrow-left:before{content:"\e132"!important}.pt-cv-wrapper .glyphicon-circle-arrow-up:before{content:"\e133"!important}.pt-cv-wrapper .glyphicon-circle-arrow-down:before{content:"\e134"!important}.pt-cv-wrapper .glyphicon-globe:before{content:"\e135"!important}.pt-cv-wrapper .glyphicon-wrench:before{content:"\e136"!important}.pt-cv-wrapper .glyphicon-tasks:before{content:"\e137"!important}.pt-cv-wrapper .glyphicon-filter:before{content:"\e138"!important}.pt-cv-wrapper .glyphicon-briefcase:before{content:"\e139"!important}.pt-cv-wrapper .glyphicon-fullscreen:before{content:"\e140"!important}.pt-cv-wrapper .glyphicon-dashboard:before{content:"\e141"!important}.pt-cv-wrapper .glyphicon-paperclip:before{content:"\e142"!important}.pt-cv-wrapper .glyphicon-heart-empty:before{content:"\e143"!important}.pt-cv-wrapper .glyphicon-link:before{content:"\e144"!important}.pt-cv-wrapper .glyphicon-phone:before{content:"\e145"!important}.pt-cv-wrapper .glyphicon-pushpin:before{content:"\e146"!important}.pt-cv-wrapper .glyphicon-usd:before{content:"\e148"!important}.pt-cv-wrapper .glyphicon-gbp:before{content:"\e149"!important}.pt-cv-wrapper .glyphicon-sort:before{content:"\e150"!important}.pt-cv-wrapper .glyphicon-sort-by-alphabet:before{content:"\e151"!important}.pt-cv-wrapper .glyphicon-sort-by-alphabet-alt:before{content:"\e152"!important}.pt-cv-wrapper .glyphicon-sort-by-order:before{content:"\e153"!important}.pt-cv-wrapper .glyphicon-sort-by-order-alt:before{content:"\e154"!important}.pt-cv-wrapper .glyphicon-sort-by-attributes:before{content:"\e155"!important}.pt-cv-wrapper .glyphicon-sort-by-attributes-alt:before{content:"\e156"!important}.pt-cv-wrapper .glyphicon-unchecked:before{content:"\e157"!important}.pt-cv-wrapper .glyphicon-expand:before{content:"\e158"!important}.pt-cv-wrapper .glyphicon-collapse-down:before{content:"\e159"!important}.pt-cv-wrapper .glyphicon-collapse-up:before{content:"\e160"!important}.pt-cv-wrapper .glyphicon-log-in:before{content:"\e161"!important}.pt-cv-wrapper .glyphicon-flash:before{content:"\e162"!important}.pt-cv-wrapper .glyphicon-log-out:before{content:"\e163"!important}.pt-cv-wrapper .glyphicon-new-window:before{content:"\e164"!important}.pt-cv-wrapper .glyphicon-record:before{content:"\e165"!important}.pt-cv-wrapper .glyphicon-save:before{content:"\e166"!important}.pt-cv-wrapper .glyphicon-open:before{content:"\e167"!important}.pt-cv-wrapper .glyphicon-saved:before{content:"\e168"!important}.pt-cv-wrapper .glyphicon-import:before{content:"\e169"!important}.pt-cv-wrapper .glyphicon-export:before{content:"\e170"!important}.pt-cv-wrapper .glyphicon-send:before{content:"\e171"!important}.pt-cv-wrapper .glyphicon-floppy-disk:before{content:"\e172"!important}.pt-cv-wrapper .glyphicon-floppy-saved:before{content:"\e173"!important}.pt-cv-wrapper .glyphicon-floppy-remove:before{content:"\e174"!important}.pt-cv-wrapper .glyphicon-floppy-save:before{content:"\e175"!important}.pt-cv-wrapper .glyphicon-floppy-open:before{content:"\e176"!important}.pt-cv-wrapper .glyphicon-credit-card:before{content:"\e177"!important}.pt-cv-wrapper .glyphicon-transfer:before{content:"\e178"!important}.pt-cv-wrapper .glyphicon-cutlery:before{content:"\e179"!important}.pt-cv-wrapper .glyphicon-header:before{content:"\e180"!important}.pt-cv-wrapper .glyphicon-compressed:before{content:"\e181"!important}.pt-cv-wrapper .glyphicon-earphone:before{content:"\e182"!important}.pt-cv-wrapper .glyphicon-phone-alt:before{content:"\e183"!important}.pt-cv-wrapper .glyphicon-tower:before{content:"\e184"!important}.pt-cv-wrapper .glyphicon-stats:before{content:"\e185"!important}.pt-cv-wrapper .glyphicon-sd-video:before{content:"\e186"!important}.pt-cv-wrapper .glyphicon-hd-video:before{content:"\e187"!important}.pt-cv-wrapper .glyphicon-subtitles:before{content:"\e188"!important}.pt-cv-wrapper .glyphicon-sound-stereo:before{content:"\e189"!important}.pt-cv-wrapper .glyphicon-sound-dolby:before{content:"\e190"!important}.pt-cv-wrapper .glyphicon-sound-5-1:before{content:"\e191"!important}.pt-cv-wrapper .glyphicon-sound-6-1:before{content:"\e192"!important}.pt-cv-wrapper .glyphicon-sound-7-1:before{content:"\e193"!important}.pt-cv-wrapper .glyphicon-copyright-mark:before{content:"\e194"!important}.pt-cv-wrapper .glyphicon-registration-mark:before{content:"\e195"!important}.pt-cv-wrapper .glyphicon-cloud-download:before{content:"\e197"!important}.pt-cv-wrapper .glyphicon-cloud-upload:before{content:"\e198"!important}.pt-cv-wrapper .glyphicon-tree-conifer:before{content:"\e199"!important}.pt-cv-wrapper .glyphicon-tree-deciduous:before{content:"\e200"!important}.pt-cv-wrapper .glyphicon-cd:before{content:"\e201"!important}.pt-cv-wrapper .glyphicon-save-file:before{content:"\e202"!important}.pt-cv-wrapper .glyphicon-open-file:before{content:"\e203"!important}.pt-cv-wrapper .glyphicon-level-up:before{content:"\e204"!important}.pt-cv-wrapper .glyphicon-copy:before{content:"\e205"!important}.pt-cv-wrapper .glyphicon-paste:before{content:"\e206"!important}.pt-cv-wrapper .glyphicon-alert:before{content:"\e209"!important}.pt-cv-wrapper .glyphicon-equalizer:before{content:"\e210"!important}.pt-cv-wrapper .glyphicon-king:before{content:"\e211"!important}.pt-cv-wrapper .glyphicon-queen:before{content:"\e212"!important}.pt-cv-wrapper .glyphicon-pawn:before{content:"\e213"!important}.pt-cv-wrapper .glyphicon-bishop:before{content:"\e214"!important}.pt-cv-wrapper .glyphicon-knight:before{content:"\e215"!important}.pt-cv-wrapper .glyphicon-baby-formula:before{content:"\e216"!important}.pt-cv-wrapper .glyphicon-tent:before{content:"\26fa"!important}.pt-cv-wrapper .glyphicon-blackboard:before{content:"\e218"!important}.pt-cv-wrapper .glyphicon-bed:before{content:"\e219"!important}.pt-cv-wrapper .glyphicon-apple:before{content:"\f8ff"!important}.pt-cv-wrapper .glyphicon-erase:before{content:"\e221"!important}.pt-cv-wrapper .glyphicon-hourglass:before{content:"\231b"!important}.pt-cv-wrapper .glyphicon-lamp:before{content:"\e223"!important}.pt-cv-wrapper .glyphicon-duplicate:before{content:"\e224"!important}.pt-cv-wrapper .glyphicon-piggy-bank:before{content:"\e225"!important}.pt-cv-wrapper .glyphicon-scissors:before{content:"\e226"!important}.pt-cv-wrapper .glyphicon-bitcoin:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-btc:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-xbt:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-yen:before{content:"\00a5"!important}.pt-cv-wrapper .glyphicon-jpy:before{content:"\00a5"!important}.pt-cv-wrapper .glyphicon-ruble:before{content:"\20bd"!important}.pt-cv-wrapper .glyphicon-rub:before{content:"\20bd"!important}.pt-cv-wrapper .glyphicon-scale:before{content:"\e230"!important}.pt-cv-wrapper .glyphicon-ice-lolly:before{content:"\e231"!important}.pt-cv-wrapper .glyphicon-ice-lolly-tasted:before{content:"\e232"!important}.pt-cv-wrapper .glyphicon-education:before{content:"\e233"!important}.pt-cv-wrapper .glyphicon-option-horizontal:before{content:"\e234"!important}.pt-cv-wrapper .glyphicon-option-vertical:before{content:"\e235"!important}.pt-cv-wrapper .glyphicon-menu-hamburger:before{content:"\e236"!important}.pt-cv-wrapper .glyphicon-modal-window:before{content:"\e237"!important}.pt-cv-wrapper .glyphicon-oil:before{content:"\e238"!important}.pt-cv-wrapper .glyphicon-grain:before{content:"\e239"!important}.pt-cv-wrapper .glyphicon-sunglasses:before{content:"\e240"!important}.pt-cv-wrapper .glyphicon-text-size:before{content:"\e241"!important}.pt-cv-wrapper .glyphicon-text-color:before{content:"\e242"!important}.pt-cv-wrapper .glyphicon-text-background:before{content:"\e243"!important}.pt-cv-wrapper .glyphicon-object-align-top:before{content:"\e244"!important}.pt-cv-wrapper .glyphicon-object-align-bottom:before{content:"\e245"!important}.pt-cv-wrapper .glyphicon-object-align-horizontal:before{content:"\e246"!important}.pt-cv-wrapper .glyphicon-object-align-left:before{content:"\e247"!important}.pt-cv-wrapper .glyphicon-object-align-vertical:before{content:"\e248"!important}.pt-cv-wrapper .glyphicon-object-align-right:before{content:"\e249"!important}.pt-cv-wrapper .glyphicon-triangle-right:before{content:"\e250"!important}.pt-cv-wrapper .glyphicon-triangle-left:before{content:"\e251"!important}.pt-cv-wrapper .glyphicon-triangle-bottom:before{content:"\e252"!important}.pt-cv-wrapper .glyphicon-triangle-top:before{content:"\e253"!important}.pt-cv-wrapper .glyphicon-console:before{content:"\e254"!important}.pt-cv-wrapper .glyphicon-superscript:before{content:"\e255"!important}.pt-cv-wrapper .glyphicon-subscript:before{content:"\e256"!important}.pt-cv-wrapper .glyphicon-menu-left:before{content:"\e257"!important}.pt-cv-wrapper .glyphicon-menu-right:before{content:"\e258"!important}.pt-cv-wrapper .glyphicon-menu-down:before{content:"\e259"!important}.pt-cv-wrapper .glyphicon-menu-up:before{content:"\e260"!important}.pt-cv-wrapper img{vertical-align:middle!important}.pt-cv-wrapper .img-responsive,.pt-cv-wrapper .thumbnail>img,.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .carousel-inner>.item>a>img{display:block!important;max-width:100%!important;height:auto!important}.pt-cv-wrapper .img-rounded{border-radius:6px!important}.pt-cv-wrapper .img-thumbnail{padding:4px!important;line-height:1.42857143!important;background-color:#fff!important;border:1px solid #ddd!important;border-radius:4px!important;-webkit-transition:all .2s ease-in-out!important;-o-transition:all .2s ease-in-out!important;transition:all .2s ease-in-out!important;display:inline-block!important;max-width:100%!important;height:auto!important}.pt-cv-wrapper .img-circle{border-radius:50%!important}.pt-cv-wrapper hr{margin-top:20px!important;margin-bottom:20px!important;border:0!important;border-top:1px solid #eee!important}.pt-cv-wrapper .sr-only{position:absolute!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;border:0!important}.pt-cv-wrapper .sr-only-focusable:active,.pt-cv-wrapper .sr-only-focusable:focus{position:static!important;width:auto!important;height:auto!important;margin:0!important;overflow:visible!important;clip:auto!important}.pt-cv-wrapper [role="button"]{cursor:pointer!important}.pt-cv-wrapper .container{margin-right:auto!important;margin-left:auto!important;padding-left:15px!important;padding-right:15px!important}@media(min-width:768px){.pt-cv-wrapper .container{width:750px!important}}@media(min-width:992px){.pt-cv-wrapper .container{width:970px!important}}@media(min-width:1200px){.pt-cv-wrapper .container{width:1170px!important}}.pt-cv-wrapper .container-fluid{margin-right:auto!important;margin-left:auto!important;padding-left:15px!important;padding-right:15px!important}.pt-cv-wrapper .row{margin-left:-15px!important;margin-right:-15px!important}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-xs-9,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-lg-12{position:relative!important;min-height:1px!important;padding-left:15px!important;padding-right:15px!important}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12{float:left!important}.pt-cv-wrapper .col-xs-12{width:100%!important}.pt-cv-wrapper .col-xs-11{width:91.66666667%!important}.pt-cv-wrapper .col-xs-10{width:83.33333333%!important}.pt-cv-wrapper .col-xs-9{width:75%!important}.pt-cv-wrapper .col-xs-8{width:66.66666667%!important}.pt-cv-wrapper .col-xs-7{width:58.33333333%!important}.pt-cv-wrapper .col-xs-6{width:50%!important}.pt-cv-wrapper .col-xs-5{width:41.66666667%!important}.pt-cv-wrapper .col-xs-4{width:33.33333333%!important}.pt-cv-wrapper .col-xs-3{width:25%!important}.pt-cv-wrapper .col-xs-2{width:16.66666667%!important}.pt-cv-wrapper .col-xs-1{width:8.33333333%!important}.pt-cv-wrapper .col-xs-pull-12{right:100%!important}.pt-cv-wrapper .col-xs-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-xs-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-xs-pull-9{right:75%!important}.pt-cv-wrapper .col-xs-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-xs-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-xs-pull-6{right:50%!important}.pt-cv-wrapper .col-xs-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-xs-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-xs-pull-3{right:25%!important}.pt-cv-wrapper .col-xs-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-xs-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-xs-pull-0{right:auto!important}.pt-cv-wrapper .col-xs-push-12{left:100%!important}.pt-cv-wrapper .col-xs-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-xs-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-xs-push-9{left:75%!important}.pt-cv-wrapper .col-xs-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-xs-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-xs-push-6{left:50%!important}.pt-cv-wrapper .col-xs-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-xs-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-xs-push-3{left:25%!important}.pt-cv-wrapper .col-xs-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-xs-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-xs-push-0{left:auto!important}.pt-cv-wrapper .col-xs-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-xs-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-xs-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-xs-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-xs-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-xs-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-xs-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-xs-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-xs-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-xs-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-xs-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-xs-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-xs-offset-0{margin-left:0!important}@media(min-width:768px){.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12{float:left!important}.pt-cv-wrapper .col-sm-12{width:100%!important}.pt-cv-wrapper .col-sm-11{width:91.66666667%!important}.pt-cv-wrapper .col-sm-10{width:83.33333333%!important}.pt-cv-wrapper .col-sm-9{width:75%!important}.pt-cv-wrapper .col-sm-8{width:66.66666667%!important}.pt-cv-wrapper .col-sm-7{width:58.33333333%!important}.pt-cv-wrapper .col-sm-6{width:50%!important}.pt-cv-wrapper .col-sm-5{width:41.66666667%!important}.pt-cv-wrapper .col-sm-4{width:33.33333333%!important}.pt-cv-wrapper .col-sm-3{width:25%!important}.pt-cv-wrapper .col-sm-2{width:16.66666667%!important}.pt-cv-wrapper .col-sm-1{width:8.33333333%!important}.pt-cv-wrapper .col-sm-pull-12{right:100%!important}.pt-cv-wrapper .col-sm-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-sm-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-sm-pull-9{right:75%!important}.pt-cv-wrapper .col-sm-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-sm-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-sm-pull-6{right:50%!important}.pt-cv-wrapper .col-sm-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-sm-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-sm-pull-3{right:25%!important}.pt-cv-wrapper .col-sm-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-sm-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-sm-pull-0{right:auto!important}.pt-cv-wrapper .col-sm-push-12{left:100%!important}.pt-cv-wrapper .col-sm-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-sm-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-sm-push-9{left:75%!important}.pt-cv-wrapper .col-sm-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-sm-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-sm-push-6{left:50%!important}.pt-cv-wrapper .col-sm-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-sm-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-sm-push-3{left:25%!important}.pt-cv-wrapper .col-sm-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-sm-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-sm-push-0{left:auto!important}.pt-cv-wrapper .col-sm-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-sm-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-sm-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-sm-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-sm-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-sm-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-sm-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-sm-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-sm-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-sm-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-sm-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-sm-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-sm-offset-0{margin-left:0!important}}@media(min-width:992px){.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12{float:left!important}.pt-cv-wrapper .col-md-12{width:100%!important}.pt-cv-wrapper .col-md-11{width:91.66666667%!important}.pt-cv-wrapper .col-md-10{width:83.33333333%!important}.pt-cv-wrapper .col-md-9{width:75%!important}.pt-cv-wrapper .col-md-8{width:66.66666667%!important}.pt-cv-wrapper .col-md-7{width:58.33333333%!important}.pt-cv-wrapper .col-md-6{width:50%!important}.pt-cv-wrapper .col-md-5{width:41.66666667%!important}.pt-cv-wrapper .col-md-4{width:33.33333333%!important}.pt-cv-wrapper .col-md-3{width:25%!important}.pt-cv-wrapper .col-md-2{width:16.66666667%!important}.pt-cv-wrapper .col-md-1{width:8.33333333%!important}.pt-cv-wrapper .col-md-pull-12{right:100%!important}.pt-cv-wrapper .col-md-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-md-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-md-pull-9{right:75%!important}.pt-cv-wrapper .col-md-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-md-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-md-pull-6{right:50%!important}.pt-cv-wrapper .col-md-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-md-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-md-pull-3{right:25%!important}.pt-cv-wrapper .col-md-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-md-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-md-pull-0{right:auto!important}.pt-cv-wrapper .col-md-push-12{left:100%!important}.pt-cv-wrapper .col-md-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-md-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-md-push-9{left:75%!important}.pt-cv-wrapper .col-md-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-md-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-md-push-6{left:50%!important}.pt-cv-wrapper .col-md-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-md-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-md-push-3{left:25%!important}.pt-cv-wrapper .col-md-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-md-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-md-push-0{left:auto!important}.pt-cv-wrapper .col-md-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-md-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-md-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-md-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-md-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-md-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-md-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-md-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-md-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-md-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-md-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-md-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-md-offset-0{margin-left:0!important}}@media(min-width:1200px){.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12{float:left!important}.pt-cv-wrapper .col-lg-12{width:100%!important}.pt-cv-wrapper .col-lg-11{width:91.66666667%!important}.pt-cv-wrapper .col-lg-10{width:83.33333333%!important}.pt-cv-wrapper .col-lg-9{width:75%!important}.pt-cv-wrapper .col-lg-8{width:66.66666667%!important}.pt-cv-wrapper .col-lg-7{width:58.33333333%!important}.pt-cv-wrapper .col-lg-6{width:50%!important}.pt-cv-wrapper .col-lg-5{width:41.66666667%!important}.pt-cv-wrapper .col-lg-4{width:33.33333333%!important}.pt-cv-wrapper .col-lg-3{width:25%!important}.pt-cv-wrapper .col-lg-2{width:16.66666667%!important}.pt-cv-wrapper .col-lg-1{width:8.33333333%!important}.pt-cv-wrapper .col-lg-pull-12{right:100%!important}.pt-cv-wrapper .col-lg-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-lg-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-lg-pull-9{right:75%!important}.pt-cv-wrapper .col-lg-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-lg-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-lg-pull-6{right:50%!important}.pt-cv-wrapper .col-lg-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-lg-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-lg-pull-3{right:25%!important}.pt-cv-wrapper .col-lg-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-lg-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-lg-pull-0{right:auto!important}.pt-cv-wrapper .col-lg-push-12{left:100%!important}.pt-cv-wrapper .col-lg-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-lg-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-lg-push-9{left:75%!important}.pt-cv-wrapper .col-lg-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-lg-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-lg-push-6{left:50%!important}.pt-cv-wrapper .col-lg-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-lg-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-lg-push-3{left:25%!important}.pt-cv-wrapper .col-lg-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-lg-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-lg-push-0{left:auto!important}.pt-cv-wrapper .col-lg-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-lg-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-lg-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-lg-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-lg-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-lg-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-lg-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-lg-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-lg-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-lg-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-lg-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-lg-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-lg-offset-0{margin-left:0!important}}.pt-cv-wrapper .btn{display:inline-block!important;margin-bottom:0!important;font-weight:normal!important;text-align:center!important;vertical-align:middle!important;-ms-touch-action:manipulation!important;touch-action:manipulation!important;cursor:pointer!important;background-image:none!important;border:1px solid transparent!important;white-space:nowrap!important;padding:6px 12px!important;font-size:14px!important;line-height:1.42857143!important;border-radius:4px!important;-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn:active:focus,.pt-cv-wrapper .btn.active:focus,.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:active.focus,.pt-cv-wrapper .btn.active.focus{outline:thin dotted!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px!important}.pt-cv-wrapper .btn:hover,.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn.focus{color:#333!important;text-decoration:none!important}.pt-cv-wrapper .btn:active,.pt-cv-wrapper .btn.active{outline:0!important;background-image:none!important;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important}.pt-cv-wrapper .btn.disabled,.pt-cv-wrapper .btn[disabled],.pt-cv-wrapper fieldset[disabled] .btn{cursor:not-allowed!important;opacity:.65!important;filter:alpha(opacity=65)!important;-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper a.btn.disabled,.pt-cv-wrapper fieldset[disabled] a.btn{pointer-events:none!important}.pt-cv-wrapper .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.pt-cv-wrapper .btn-default:focus,.pt-cv-wrapper .btn-default.focus{color:#333!important;background-color:#e6e6e6!important;border-color:#8c8c8c!important}.pt-cv-wrapper .btn-default:hover{color:#333!important;background-color:#e6e6e6!important;border-color:#adadad!important}.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{color:#333!important;background-color:#e6e6e6!important;border-color:#adadad!important}.pt-cv-wrapper .btn-default:active:hover,.pt-cv-wrapper .btn-default.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:hover,.pt-cv-wrapper .btn-default:active:focus,.pt-cv-wrapper .btn-default.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:focus,.pt-cv-wrapper .btn-default:active.focus,.pt-cv-wrapper .btn-default.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default.focus{color:#333!important;background-color:#d4d4d4!important;border-color:#8c8c8c!important}.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{background-image:none!important}.pt-cv-wrapper .btn-default.disabled,.pt-cv-wrapper .btn-default[disabled],.pt-cv-wrapper fieldset[disabled] .btn-default,.pt-cv-wrapper .btn-default.disabled:hover,.pt-cv-wrapper .btn-default[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-default:hover,.pt-cv-wrapper .btn-default.disabled:focus,.pt-cv-wrapper .btn-default[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-default:focus,.pt-cv-wrapper .btn-default.disabled.focus,.pt-cv-wrapper .btn-default[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-default.focus,.pt-cv-wrapper .btn-default.disabled:active,.pt-cv-wrapper .btn-default[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-default:active,.pt-cv-wrapper .btn-default.disabled.active,.pt-cv-wrapper .btn-default[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-default.active{background-color:#fff!important;border-color:#ccc!important}.pt-cv-wrapper .btn-default .badge{color:#fff!important;background-color:#333!important}.pt-cv-wrapper .btn-primary{color:#fff!important;background-color:#337ab7!important;border-color:#2e6da4!important}.pt-cv-wrapper .btn-primary:focus,.pt-cv-wrapper .btn-primary.focus{color:#fff!important;background-color:#286090!important;border-color:#122b40!important}.pt-cv-wrapper .btn-primary:hover{color:#fff!important;background-color:#286090!important;border-color:#204d74!important}.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{color:#fff!important;background-color:#286090!important;border-color:#204d74!important}.pt-cv-wrapper .btn-primary:active:hover,.pt-cv-wrapper .btn-primary.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:hover,.pt-cv-wrapper .btn-primary:active:focus,.pt-cv-wrapper .btn-primary.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:focus,.pt-cv-wrapper .btn-primary:active.focus,.pt-cv-wrapper .btn-primary.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary.focus{color:#fff!important;background-color:#204d74!important;border-color:#122b40!important}.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{background-image:none!important}.pt-cv-wrapper .btn-primary.disabled,.pt-cv-wrapper .btn-primary[disabled],.pt-cv-wrapper fieldset[disabled] .btn-primary,.pt-cv-wrapper .btn-primary.disabled:hover,.pt-cv-wrapper .btn-primary[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-primary:hover,.pt-cv-wrapper .btn-primary.disabled:focus,.pt-cv-wrapper .btn-primary[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:focus,.pt-cv-wrapper .btn-primary.disabled.focus,.pt-cv-wrapper .btn-primary[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-primary.focus,.pt-cv-wrapper .btn-primary.disabled:active,.pt-cv-wrapper .btn-primary[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-primary:active,.pt-cv-wrapper .btn-primary.disabled.active,.pt-cv-wrapper .btn-primary[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-primary.active{background-color:#337ab7!important;border-color:#2e6da4!important}.pt-cv-wrapper .btn-primary .badge{color:#337ab7!important;background-color:#fff!important}.pt-cv-wrapper .btn-success{color:#fff!important;background-color:#5cb85c!important;border-color:#4cae4c!important}.pt-cv-wrapper .btn-success:focus,.pt-cv-wrapper .btn-success.focus{color:#fff!important;background-color:#449d44!important;border-color:#255625!important}.pt-cv-wrapper .btn-success:hover{color:#fff!important;background-color:#449d44!important;border-color:#398439!important}.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{color:#fff!important;background-color:#449d44!important;border-color:#398439!important}.pt-cv-wrapper .btn-success:active:hover,.pt-cv-wrapper .btn-success.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:hover,.pt-cv-wrapper .btn-success:active:focus,.pt-cv-wrapper .btn-success.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:focus,.pt-cv-wrapper .btn-success:active.focus,.pt-cv-wrapper .btn-success.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success.focus{color:#fff!important;background-color:#398439!important;border-color:#255625!important}.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{background-image:none!important}.pt-cv-wrapper .btn-success.disabled,.pt-cv-wrapper .btn-success[disabled],.pt-cv-wrapper fieldset[disabled] .btn-success,.pt-cv-wrapper .btn-success.disabled:hover,.pt-cv-wrapper .btn-success[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-success:hover,.pt-cv-wrapper .btn-success.disabled:focus,.pt-cv-wrapper .btn-success[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-success:focus,.pt-cv-wrapper .btn-success.disabled.focus,.pt-cv-wrapper .btn-success[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-success.focus,.pt-cv-wrapper .btn-success.disabled:active,.pt-cv-wrapper .btn-success[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-success:active,.pt-cv-wrapper .btn-success.disabled.active,.pt-cv-wrapper .btn-success[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-success.active{background-color:#5cb85c!important;border-color:#4cae4c!important}.pt-cv-wrapper .btn-success .badge{color:#5cb85c!important;background-color:#fff!important}.pt-cv-wrapper .btn-info{color:#fff!important;background-color:#5bc0de!important;border-color:#46b8da!important}.pt-cv-wrapper .btn-info:focus,.pt-cv-wrapper .btn-info.focus{color:#fff!important;background-color:#31b0d5!important;border-color:#1b6d85!important}.pt-cv-wrapper .btn-info:hover{color:#fff!important;background-color:#31b0d5!important;border-color:#269abc!important}.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{color:#fff!important;background-color:#31b0d5!important;border-color:#269abc!important}.pt-cv-wrapper .btn-info:active:hover,.pt-cv-wrapper .btn-info.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:hover,.pt-cv-wrapper .btn-info:active:focus,.pt-cv-wrapper .btn-info.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:focus,.pt-cv-wrapper .btn-info:active.focus,.pt-cv-wrapper .btn-info.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info.focus{color:#fff!important;background-color:#269abc!important;border-color:#1b6d85!important}.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{background-image:none!important}.pt-cv-wrapper .btn-info.disabled,.pt-cv-wrapper .btn-info[disabled],.pt-cv-wrapper fieldset[disabled] .btn-info,.pt-cv-wrapper .btn-info.disabled:hover,.pt-cv-wrapper .btn-info[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-info:hover,.pt-cv-wrapper .btn-info.disabled:focus,.pt-cv-wrapper .btn-info[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-info:focus,.pt-cv-wrapper .btn-info.disabled.focus,.pt-cv-wrapper .btn-info[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-info.focus,.pt-cv-wrapper .btn-info.disabled:active,.pt-cv-wrapper .btn-info[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-info:active,.pt-cv-wrapper .btn-info.disabled.active,.pt-cv-wrapper .btn-info[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-info.active{background-color:#5bc0de!important;border-color:#46b8da!important}.pt-cv-wrapper .btn-info .badge{color:#5bc0de!important;background-color:#fff!important}.pt-cv-wrapper .btn-warning{color:#fff!important;background-color:#f0ad4e!important;border-color:#eea236!important}.pt-cv-wrapper .btn-warning:focus,.pt-cv-wrapper .btn-warning.focus{color:#fff!important;background-color:#ec971f!important;border-color:#985f0d!important}.pt-cv-wrapper .btn-warning:hover{color:#fff!important;background-color:#ec971f!important;border-color:#d58512!important}.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{color:#fff!important;background-color:#ec971f!important;border-color:#d58512!important}.pt-cv-wrapper .btn-warning:active:hover,.pt-cv-wrapper .btn-warning.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:hover,.pt-cv-wrapper .btn-warning:active:focus,.pt-cv-wrapper .btn-warning.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:focus,.pt-cv-wrapper .btn-warning:active.focus,.pt-cv-wrapper .btn-warning.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning.focus{color:#fff!important;background-color:#d58512!important;border-color:#985f0d!important}.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{background-image:none!important}.pt-cv-wrapper .btn-warning.disabled,.pt-cv-wrapper .btn-warning[disabled],.pt-cv-wrapper fieldset[disabled] .btn-warning,.pt-cv-wrapper .btn-warning.disabled:hover,.pt-cv-wrapper .btn-warning[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-warning:hover,.pt-cv-wrapper .btn-warning.disabled:focus,.pt-cv-wrapper .btn-warning[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:focus,.pt-cv-wrapper .btn-warning.disabled.focus,.pt-cv-wrapper .btn-warning[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-warning.focus,.pt-cv-wrapper .btn-warning.disabled:active,.pt-cv-wrapper .btn-warning[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-warning:active,.pt-cv-wrapper .btn-warning.disabled.active,.pt-cv-wrapper .btn-warning[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-warning.active{background-color:#f0ad4e!important;border-color:#eea236!important}.pt-cv-wrapper .btn-warning .badge{color:#f0ad4e!important;background-color:#fff!important}.pt-cv-wrapper .btn-danger{color:#fff!important;background-color:#d9534f!important;border-color:#d43f3a!important}.pt-cv-wrapper .btn-danger:focus,.pt-cv-wrapper .btn-danger.focus{color:#fff!important;background-color:#c9302c!important;border-color:#761c19!important}.pt-cv-wrapper .btn-danger:hover{color:#fff!important;background-color:#c9302c!important;border-color:#ac2925!important}.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{color:#fff!important;background-color:#c9302c!important;border-color:#ac2925!important}.pt-cv-wrapper .btn-danger:active:hover,.pt-cv-wrapper .btn-danger.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:hover,.pt-cv-wrapper .btn-danger:active:focus,.pt-cv-wrapper .btn-danger.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:focus,.pt-cv-wrapper .btn-danger:active.focus,.pt-cv-wrapper .btn-danger.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger.focus{color:#fff!important;background-color:#ac2925!important;border-color:#761c19!important}.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{background-image:none!important}.pt-cv-wrapper .btn-danger.disabled,.pt-cv-wrapper .btn-danger[disabled],.pt-cv-wrapper fieldset[disabled] .btn-danger,.pt-cv-wrapper .btn-danger.disabled:hover,.pt-cv-wrapper .btn-danger[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-danger:hover,.pt-cv-wrapper .btn-danger.disabled:focus,.pt-cv-wrapper .btn-danger[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:focus,.pt-cv-wrapper .btn-danger.disabled.focus,.pt-cv-wrapper .btn-danger[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-danger.focus,.pt-cv-wrapper .btn-danger.disabled:active,.pt-cv-wrapper .btn-danger[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-danger:active,.pt-cv-wrapper .btn-danger.disabled.active,.pt-cv-wrapper .btn-danger[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-danger.active{background-color:#d9534f!important;border-color:#d43f3a!important}.pt-cv-wrapper .btn-danger .badge{color:#d9534f!important;background-color:#fff!important}.pt-cv-wrapper .btn-link{color:#337ab7!important;font-weight:normal!important;border-radius:0!important}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link.active,.pt-cv-wrapper .btn-link[disabled],.pt-cv-wrapper fieldset[disabled] .btn-link{background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:hover,.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:active{border-color:transparent!important}.pt-cv-wrapper .btn-link:hover,.pt-cv-wrapper .btn-link:focus{color:#23527c!important;text-decoration:underline!important;background-color:transparent!important}.pt-cv-wrapper .btn-link[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-link:hover,.pt-cv-wrapper .btn-link[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-link:focus{color:#777!important;text-decoration:none!important}.pt-cv-wrapper .btn-lg,.pt-cv-wrapper .btn-group-lg>.btn{padding:10px 16px!important;font-size:18px!important;line-height:1.3333333!important;border-radius:6px!important}.pt-cv-wrapper .btn-sm,.pt-cv-wrapper .btn-group-sm>.btn{padding:5px 10px!important;font-size:12px!important;line-height:1.5!important;border-radius:3px!important}.pt-cv-wrapper .btn-xs,.pt-cv-wrapper .btn-group-xs>.btn{padding:1px 5px!important;font-size:12px!important;line-height:1.5!important;border-radius:3px!important}.pt-cv-wrapper .btn-block{display:block!important;width:100%!important}.pt-cv-wrapper .btn-block+.btn-block{margin-top:5px!important}.pt-cv-wrapper input[type="submit"].btn-block,.pt-cv-wrapper input[type="reset"].btn-block,.pt-cv-wrapper input[type="button"].btn-block{width:100%!important}.pt-cv-wrapper .fade{opacity:0!important;-webkit-transition:opacity .15s linear!important;-o-transition:opacity .15s linear!important;transition:opacity .15s linear!important}.pt-cv-wrapper .fade.in{opacity:1!important}.pt-cv-wrapper .collapse{display:none!important}.pt-cv-wrapper .collapse.in{display:block!important}.pt-cv-wrapper tr.collapse.in{display:table-row!important}.pt-cv-wrapper tbody.collapse.in{display:table-row-group!important}.pt-cv-wrapper .collapsing{position:relative!important;height:0!important;overflow:hidden!important;-webkit-transition-property:height,visibility!important;-o-transition-property:height,visibility!important;transition-property:height,visibility!important;-webkit-transition-duration:.35s!important;-o-transition-duration:.35s!important;transition-duration:.35s!important;-webkit-transition-timing-function:ease!important;-o-transition-timing-function:ease!important;transition-timing-function:ease!important}.pt-cv-wrapper .caret{display:inline-block!important;width:0!important;height:0!important;margin-left:2px!important;vertical-align:middle!important;border-top:4px dashed!important;border-top:4px solid \9!important;border-right:4px solid transparent!important;border-left:4px solid transparent!important}.pt-cv-wrapper .dropup,.pt-cv-wrapper .dropdown{position:relative!important}.pt-cv-wrapper .dropdown-toggle:focus{outline:0!important}.pt-cv-wrapper .dropdown-menu{position:absolute!important;top:100%!important;left:0!important;z-index:1000!important;display:none!important;float:left!important;min-width:160px!important;padding:5px 0!important;margin:2px 0 0!important;list-style:none!important;font-size:14px!important;text-align:left!important;background-color:#fff!important;border:1px solid #ccc!important;border:1px solid rgba(0,0,0,0.15)!important;border-radius:4px!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175)!important;box-shadow:0 6px 12px rgba(0,0,0,0.175)!important;-webkit-background-clip:padding-box!important;background-clip:padding-box!important}.pt-cv-wrapper .dropdown-menu.pull-right{right:0!important;left:auto!important}.pt-cv-wrapper .dropdown-menu .divider{height:1px!important;margin:9px 0!important;overflow:hidden!important;background-color:#e5e5e5!important}.pt-cv-wrapper .dropdown-menu>li>a{display:block!important;padding:3px 20px!important;clear:both!important;font-weight:normal!important;line-height:1.42857143!important;color:#333!important;white-space:nowrap!important}.pt-cv-wrapper .dropdown-menu>li>a:hover,.pt-cv-wrapper .dropdown-menu>li>a:focus{text-decoration:none!important;color:#262626!important;background-color:#f5f5f5!important}.pt-cv-wrapper .dropdown-menu>.active>a,.pt-cv-wrapper .dropdown-menu>.active>a:hover,.pt-cv-wrapper .dropdown-menu>.active>a:focus{color:#fff!important;text-decoration:none!important;outline:0!important;background-color:#337ab7!important}.pt-cv-wrapper .dropdown-menu>.disabled>a,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus{color:#777!important}.pt-cv-wrapper .dropdown-menu>.disabled>a:hover,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus{text-decoration:none!important;background-color:transparent!important;background-image:none!important;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)!important;cursor:not-allowed!important}.pt-cv-wrapper .open>.dropdown-menu{display:block!important}.pt-cv-wrapper .open>a{outline:0!important}.pt-cv-wrapper .dropdown-menu-right{left:auto!important;right:0!important}.pt-cv-wrapper .dropdown-menu-left{left:0!important;right:auto!important}.pt-cv-wrapper .dropdown-header{display:block!important;padding:3px 20px!important;font-size:12px!important;line-height:1.42857143!important;color:#777!important;white-space:nowrap!important}.pt-cv-wrapper .dropdown-backdrop{position:fixed!important;left:0!important;right:0!important;bottom:0!important;top:0!important;z-index:990!important}.pt-cv-wrapper .pull-right>.dropdown-menu{right:0!important;left:auto!important}.pt-cv-wrapper .dropup .caret,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .caret{border-top:0!important;border-bottom:4px dashed!important;border-bottom:4px solid \9!important;content:""!important}.pt-cv-wrapper .dropup .dropdown-menu,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto!important;bottom:100%!important;margin-bottom:2px!important}@media(min-width:768px){.pt-cv-wrapper .navbar-right .dropdown-menu{left:auto!important;right:0!important}.pt-cv-wrapper .navbar-right .dropdown-menu-left{left:0!important;right:auto!important}}.pt-cv-wrapper .btn-group,.pt-cv-wrapper .btn-group-vertical{position:relative!important;display:inline-block!important;vertical-align:middle!important}.pt-cv-wrapper .btn-group>.btn,.pt-cv-wrapper .btn-group-vertical>.btn{position:relative!important;float:left!important}.pt-cv-wrapper .btn-group>.btn:hover,.pt-cv-wrapper .btn-group-vertical>.btn:hover,.pt-cv-wrapper .btn-group>.btn:focus,.pt-cv-wrapper .btn-group-vertical>.btn:focus,.pt-cv-wrapper .btn-group>.btn:active,.pt-cv-wrapper .btn-group-vertical>.btn:active,.pt-cv-wrapper .btn-group>.btn.active,.pt-cv-wrapper .btn-group-vertical>.btn.active{z-index:2!important}.pt-cv-wrapper .btn-group .btn+.btn,.pt-cv-wrapper .btn-group .btn+.btn-group,.pt-cv-wrapper .btn-group .btn-group+.btn,.pt-cv-wrapper .btn-group .btn-group+.btn-group{margin-left:-1px!important}.pt-cv-wrapper .btn-toolbar{margin-left:-5px!important}.pt-cv-wrapper .btn-toolbar .btn,.pt-cv-wrapper .btn-toolbar .btn-group,.pt-cv-wrapper .btn-toolbar .input-group{float:left!important}.pt-cv-wrapper .btn-toolbar>.btn,.pt-cv-wrapper .btn-toolbar>.btn-group,.pt-cv-wrapper .btn-toolbar>.input-group{margin-left:5px!important}.pt-cv-wrapper .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0!important}.pt-cv-wrapper .btn-group>.btn:first-child{margin-left:0!important}.pt-cv-wrapper .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0!important;border-top-right-radius:0!important}.pt-cv-wrapper .btn-group>.btn:last-child:not(:first-child),.pt-cv-wrapper .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group{float:left!important}.pt-cv-wrapper .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group .dropdown-toggle:active,.pt-cv-wrapper .btn-group.open .dropdown-toggle{outline:0!important}.pt-cv-wrapper .btn-group>.btn+.dropdown-toggle{padding-left:8px!important;padding-right:8px!important}.pt-cv-wrapper .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px!important;padding-right:12px!important}.pt-cv-wrapper .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important}.pt-cv-wrapper .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper .btn .caret{margin-left:0!important}.pt-cv-wrapper .btn-lg .caret{border-width:5px 5px 0!important;border-bottom-width:0!important}.pt-cv-wrapper .dropup .btn-lg .caret{border-width:0 5px 5px!important}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{display:block!important;float:none!important;width:100%!important;max-width:100%!important}.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{float:none!important}.pt-cv-wrapper .btn-group-vertical>.btn+.btn,.pt-cv-wrapper .btn-group-vertical>.btn+.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px!important;margin-left:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px!important;border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px!important;border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group-justified{display:table!important;width:100%!important;table-layout:fixed!important;border-collapse:separate!important}.pt-cv-wrapper .btn-group-justified>.btn,.pt-cv-wrapper .btn-group-justified>.btn-group{float:none!important;display:table-cell!important;width:1%!important}.pt-cv-wrapper .btn-group-justified>.btn-group .btn{width:100%!important}.pt-cv-wrapper .btn-group-justified>.btn-group .dropdown-menu{left:auto!important}.pt-cv-wrapper [data-toggle="buttons"]>.btn input[type="radio"],.pt-cv-wrapper [data-toggle="buttons"]>.btn-group>.btn input[type="radio"],.pt-cv-wrapper [data-toggle="buttons"]>.btn input[type="checkbox"],.pt-cv-wrapper [data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute!important;clip:rect(0,0,0,0)!important;pointer-events:none!important}.pt-cv-wrapper .nav{margin-bottom:0!important;padding-left:0!important;list-style:none!important}.pt-cv-wrapper .nav>li{position:relative!important;display:block!important}.pt-cv-wrapper .nav>li>a{position:relative!important;display:block!important;padding:10px 15px!important}.pt-cv-wrapper .nav>li>a:hover,.pt-cv-wrapper .nav>li>a:focus{text-decoration:none!important;background-color:#eee!important}.pt-cv-wrapper .nav>li.disabled>a{color:#777!important}.pt-cv-wrapper .nav>li.disabled>a:hover,.pt-cv-wrapper .nav>li.disabled>a:focus{color:#777!important;text-decoration:none!important;background-color:transparent!important;cursor:not-allowed!important}.pt-cv-wrapper .nav .open>a,.pt-cv-wrapper .nav .open>a:hover,.pt-cv-wrapper .nav .open>a:focus{background-color:#eee!important;border-color:#337ab7!important}.pt-cv-wrapper .nav .nav-divider{height:1px!important;margin:9px 0!important;overflow:hidden!important;background-color:#e5e5e5!important}.pt-cv-wrapper .nav>li>a>img{max-width:none!important}.pt-cv-wrapper .nav-tabs{border-bottom:1px solid #ddd!important}.pt-cv-wrapper .nav-tabs>li{float:left!important;margin-bottom:-1px!important}.pt-cv-wrapper .nav-tabs>li>a{margin-right:2px!important;line-height:1.42857143!important;border:1px solid transparent!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs>li>a:hover{border-color:#eee #eee #ddd!important}.pt-cv-wrapper .nav-tabs>li.active>a,.pt-cv-wrapper .nav-tabs>li.active>a:hover,.pt-cv-wrapper .nav-tabs>li.active>a:focus{color:#555!important;background-color:#fff!important;border:1px solid #ddd!important;border-bottom-color:transparent!important;cursor:default!important}.pt-cv-wrapper .nav-tabs.nav-justified{width:100%!important;border-bottom:0!important}.pt-cv-wrapper .nav-tabs.nav-justified>li{float:none!important}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{text-align:center!important;margin-bottom:5px!important}.pt-cv-wrapper .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto!important;left:auto!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li{display:table-cell!important;width:1%!important}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-bottom:0!important}}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-right:0!important;border-radius:4px!important}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff!important}}.pt-cv-wrapper .nav-pills>li{float:left!important}.pt-cv-wrapper .nav-pills>li>a{border-radius:4px!important}.pt-cv-wrapper .nav-pills>li+li{margin-left:2px!important}.pt-cv-wrapper .nav-pills>li.active>a,.pt-cv-wrapper .nav-pills>li.active>a:hover,.pt-cv-wrapper .nav-pills>li.active>a:focus{color:#fff!important;background-color:#337ab7!important}.pt-cv-wrapper .nav-stacked>li{float:none!important}.pt-cv-wrapper .nav-stacked>li+li{margin-top:2px!important;margin-left:0!important}.pt-cv-wrapper .nav-justified{width:100%!important}.pt-cv-wrapper .nav-justified>li{float:none!important}.pt-cv-wrapper .nav-justified>li>a{text-align:center!important;margin-bottom:5px!important}.pt-cv-wrapper .nav-justified>.dropdown .dropdown-menu{top:auto!important;left:auto!important}@media(min-width:768px){.pt-cv-wrapper .nav-justified>li{display:table-cell!important;width:1%!important}.pt-cv-wrapper .nav-justified>li>a{margin-bottom:0!important}}.pt-cv-wrapper .nav-tabs-justified{border-bottom:0!important}.pt-cv-wrapper .nav-tabs-justified>li>a{margin-right:0!important;border-radius:4px!important}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus{border:1px solid #ddd!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs-justified>li>a{border-bottom:1px solid #ddd!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus{border-bottom-color:#fff!important}}.pt-cv-wrapper .tab-content>.tab-pane{display:none!important}.pt-cv-wrapper .tab-content>.active{display:block!important}.pt-cv-wrapper .nav-tabs .dropdown-menu{margin-top:-1px!important;border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .pagination{display:inline-block!important;padding-left:0!important;margin:20px 0!important;border-radius:4px!important}.pt-cv-wrapper .pagination>li{display:inline!important}.pt-cv-wrapper .pagination>li>a,.pt-cv-wrapper .pagination>li>span{position:relative!important;float:left!important;padding:6px 12px!important;line-height:1.42857143!important;text-decoration:none!important;color:#337ab7!important;background-color:#fff!important;border:1px solid #ddd!important;margin-left:-1px!important}.pt-cv-wrapper .pagination>li:first-child>a,.pt-cv-wrapper .pagination>li:first-child>span{margin-left:0!important;border-bottom-left-radius:4px!important;border-top-left-radius:4px!important}.pt-cv-wrapper .pagination>li:last-child>a,.pt-cv-wrapper .pagination>li:last-child>span{border-bottom-right-radius:4px!important;border-top-right-radius:4px!important}.pt-cv-wrapper .pagination>li>a:hover,.pt-cv-wrapper .pagination>li>span:hover,.pt-cv-wrapper .pagination>li>a:focus,.pt-cv-wrapper .pagination>li>span:focus{z-index:3!important;color:#23527c!important;background-color:#eee!important;border-color:#ddd!important}.pt-cv-wrapper .pagination>.active>a,.pt-cv-wrapper .pagination>.active>span,.pt-cv-wrapper .pagination>.active>a:hover,.pt-cv-wrapper .pagination>.active>span:hover,.pt-cv-wrapper .pagination>.active>a:focus,.pt-cv-wrapper .pagination>.active>span:focus{z-index:2!important;color:#fff!important;background-color:#337ab7!important;border-color:#337ab7!important;cursor:default!important}.pt-cv-wrapper .pagination>.disabled>span,.pt-cv-wrapper .pagination>.disabled>span:hover,.pt-cv-wrapper .pagination>.disabled>span:focus,.pt-cv-wrapper .pagination>.disabled>a,.pt-cv-wrapper .pagination>.disabled>a:hover,.pt-cv-wrapper .pagination>.disabled>a:focus{color:#777!important;background-color:#fff!important;border-color:#ddd!important;cursor:not-allowed!important}.pt-cv-wrapper .pagination-lg>li>a,.pt-cv-wrapper .pagination-lg>li>span{padding:10px 16px!important;font-size:18px!important;line-height:1.3333333!important}.pt-cv-wrapper .pagination-lg>li:first-child>a,.pt-cv-wrapper .pagination-lg>li:first-child>span{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}.pt-cv-wrapper .pagination-lg>li:last-child>a,.pt-cv-wrapper .pagination-lg>li:last-child>span{border-bottom-right-radius:6px!important;border-top-right-radius:6px!important}.pt-cv-wrapper .pagination-sm>li>a,.pt-cv-wrapper .pagination-sm>li>span{padding:5px 10px!important;font-size:12px!important;line-height:1.5!important}.pt-cv-wrapper .pagination-sm>li:first-child>a,.pt-cv-wrapper .pagination-sm>li:first-child>span{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.pt-cv-wrapper .pagination-sm>li:last-child>a,.pt-cv-wrapper .pagination-sm>li:last-child>span{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.pt-cv-wrapper .thumbnail{display:block!important;padding:4px!important;margin-bottom:20px!important;line-height:1.42857143!important;background-color:#fff!important;border:1px solid #ddd!important;border-radius:4px!important;-webkit-transition:border .2s ease-in-out!important;-o-transition:border .2s ease-in-out!important;transition:border .2s ease-in-out!important}.pt-cv-wrapper .thumbnail>img,.pt-cv-wrapper .thumbnail a>img{margin-left:auto!important;margin-right:auto!important}.pt-cv-wrapper a.thumbnail:hover,.pt-cv-wrapper a.thumbnail:focus,.pt-cv-wrapper a.thumbnail.active{border-color:#337ab7!important}.pt-cv-wrapper .thumbnail .caption{padding:9px!important;color:#333!important}.pt-cv-wrapper .pt-cv-carousel{position:relative!important}.pt-cv-wrapper .carousel-inner{position:relative!important;overflow:hidden!important;width:100%!important}.pt-cv-wrapper .carousel-inner>.item{display:none!important;position:relative!important;-webkit-transition:.6s ease-in-out left!important;-o-transition:.6s ease-in-out left!important;transition:.6s ease-in-out left!important}.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .carousel-inner>.item>a>img{line-height:1!important}@media all and (transform-3d),(-webkit-transform-3d){.pt-cv-wrapper .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out!important;-o-transition:-o-transform .6s ease-in-out!important;transition:transform .6s ease-in-out!important;-webkit-backface-visibility:hidden!important;backface-visibility:hidden!important;-webkit-perspective:1000px!important;perspective:1000px!important}.pt-cv-wrapper .carousel-inner>.item.next,.pt-cv-wrapper .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0)!important;transform:translate3d(100%,0,0)!important;left:0!important}.pt-cv-wrapper .carousel-inner>.item.prev,.pt-cv-wrapper .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important;left:0!important}.pt-cv-wrapper .carousel-inner>.item.next.left,.pt-cv-wrapper .carousel-inner>.item.prev.right,.pt-cv-wrapper .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important;left:0!important}}.pt-cv-wrapper .carousel-inner>.active,.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{display:block!important}.pt-cv-wrapper .carousel-inner>.active{left:0!important}.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{position:absolute!important;top:0!important;width:100%!important}.pt-cv-wrapper .carousel-inner>.next{left:100%!important}.pt-cv-wrapper .carousel-inner>.prev{left:-100%!important}.pt-cv-wrapper .carousel-inner>.next.left,.pt-cv-wrapper .carousel-inner>.prev.right{left:0!important}.pt-cv-wrapper .carousel-inner>.active.left{left:-100%!important}.pt-cv-wrapper .carousel-inner>.active.right{left:100%!important}.pt-cv-wrapper .carousel-control{position:absolute!important;top:0!important;left:0!important;bottom:0!important;width:15%!important;opacity:.5!important;filter:alpha(opacity=50)!important;font-size:20px!important;color:#fff!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,0.6)!important}.pt-cv-wrapper .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-image:-o-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)))!important;background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-repeat:repeat-x!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)!important}.pt-cv-wrapper .carousel-control.right{left:auto!important;right:0!important;background-image:-webkit-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-image:-o-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)))!important;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-repeat:repeat-x!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)!important}.pt-cv-wrapper .carousel-control:hover,.pt-cv-wrapper .carousel-control:focus{outline:0!important;color:#fff!important;text-decoration:none!important;opacity:.9!important;filter:alpha(opacity=90)!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right{position:absolute!important;top:50%!important;margin-top:-10px!important;z-index:5!important;display:inline-block!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .glyphicon-chevron-left{left:50%!important;margin-left:-10px!important}.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right{right:50%!important;margin-right:-10px!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next{width:20px!important;height:20px!important;line-height:1!important;font-family:serif!important}.pt-cv-wrapper .carousel-control .icon-prev:before{content:'\2039'!important}.pt-cv-wrapper .carousel-control .icon-next:before{content:'\203a'!important}.pt-cv-wrapper .pt-cv-carousel-indicators{position:absolute!important;bottom:10px!important;left:50%!important;z-index:15!important;width:60%!important;margin-left:-30%!important;padding-left:0!important;list-style:none!important;text-align:center!important}.pt-cv-wrapper .pt-cv-carousel-indicators li{display:inline-block!important;width:10px!important;height:10px!important;margin:1px!important;text-indent:-999px!important;border:1px solid #fff!important;border-radius:10px!important;cursor:pointer!important;background-color:#000 \9!important;background-color:rgba(0,0,0,0)!important}.pt-cv-wrapper .pt-cv-carousel-indicators .active{margin:0!important;width:12px!important;height:12px!important;background-color:#fff!important}.pt-cv-wrapper .pt-cv-carousel-caption{position:absolute!important;left:15%!important;right:15%!important;bottom:20px!important;z-index:10!important;padding-top:20px!important;padding-bottom:20px!important;color:#fff!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,0.6)!important}.pt-cv-wrapper .pt-cv-carousel-caption .btn{text-shadow:none!important}@media screen and (min-width:768px){.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next{width:30px!important;height:30px!important;margin-top:-15px!important;font-size:30px!important}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{margin-left:-15px!important}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{margin-right:-15px!important}.pt-cv-wrapper .pt-cv-carousel-caption{left:20%!important;right:20%!important;padding-bottom:30px!important}.pt-cv-wrapper .pt-cv-carousel-indicators{bottom:20px!important}}.pt-cv-wrapper .clearfix:before,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container:before,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container-fluid:before,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .row:before,.pt-cv-wrapper .row:after,.pt-cv-wrapper .btn-toolbar:before,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:before,.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .nav:before,.pt-cv-wrapper .nav:after{content:" "!important;display:table!important}.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .row:after,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .nav:after{clear:both!important}.pt-cv-wrapper .center-block{display:block!important;margin-left:auto!important;margin-right:auto!important}.pt-cv-wrapper .pull-right{float:right!important}.pt-cv-wrapper .pull-left{float:left!important}.pt-cv-wrapper .hide{display:none!important}.pt-cv-wrapper .show{display:block!important}.pt-cv-wrapper .invisible{visibility:hidden!important}.pt-cv-wrapper .text-hide{font:0/0 a!important;color:transparent!important;text-shadow:none!important;background-color:transparent!important;border:0!important}.pt-cv-wrapper .hidden{display:none!important}.pt-cv-wrapper .affix{position:fixed!important}.pt-cv-wrapper .text-left{text-align:left!important}.pt-cv-wrapper .text-right{text-align:right!important}.pt-cv-wrapper .text-center{text-align:center!important}.pt-cv-wrapper .text-justify{text-align:justify!important}.pt-cv-wrapper .text-nowrap{white-space:nowrap!important}.pt-cv-wrapper .text-lowercase{text-transform:lowercase!important}.pt-cv-wrapper .text-uppercase{text-transform:uppercase!important}.pt-cv-wrapper .text-capitalize{text-transform:capitalize!important}.pt-cv-wrapper .text-muted{color:#777!important}.pt-cv-wrapper .text-primary{color:#428bca!important}.pt-cv-wrapper .h1,.pt-cv-wrapper .h2,.pt-cv-wrapper .h3,.pt-cv-wrapper .h4,.pt-cv-wrapper .h5,.pt-cv-wrapper .h6,.pt-cv-wrapper h1,.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper h4,.pt-cv-wrapper h5,.pt-cv-wrapper h6{font-family:inherit!important;font-weight:500!important;line-height:1.1!important;color:inherit!important}.pt-cv-view *,.pt-cv-view *:before,.pt-cv-view *:after{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.pt-cv-view{position:relative!important;clear:both!important}.pt-cv-view:after{clear:both!important;content:''!important;display:block!important}.pt-cv-page{position:relative!important}.pt-cv-gls-group{clear:left!important}.pt-cv-view strong,.pt-cv-view strong *{font-weight:600!important}.pt-cv-colsys{margin-left:-15px!important;margin-right:-15px!important}@media(min-width:992px){.pt-cv-colsys [data-cvc="2"] .col-md-6:nth-child(2n+1),.pt-cv-colsys [data-cvc="3"] .col-md-4:nth-child(3n+1),.pt-cv-colsys [data-cvc="4"] .col-md-3:nth-child(4n+1),.pt-cv-colsys [data-cvc="5"] .col-md-2:nth-child(5n+1),.pt-cv-colsys [data-cvc="6"] .col-md-2:nth-child(6n+1),.pt-cv-colsys [data-cvc="7"] .col-md-1:nth-child(7n+1),.pt-cv-colsys [data-cvc="8"] .col-md-1:nth-child(8n+1),.pt-cv-colsys [data-cvc="9"] .col-md-1:nth-child(9n+1),.pt-cv-colsys [data-cvc="10"] .col-md-1:nth-child(10n+1),.pt-cv-colsys [data-cvc="11"] .col-md-1:nth-child(11n+1),.pt-cv-colsys [data-cvc="12"] .col-md-1:nth-child(12n+1){clear:left!important}}@media(min-width:768px) and (max-width:991px){.pt-cv-colsys .col-sm-6:nth-child(2n+1),.pt-cv-colsys .col-sm-4:nth-child(3n+1),.pt-cv-colsys .col-sm-3:nth-child(4n+1),.pt-cv-colsys .col-sm-2:nth-child(5n+1),.pt-cv-colsys .col-sm-2:nth-child(6n+1){clear:left!important}}@media(max-width:767px){.pt-cv-colsys .col-xs-6:nth-child(2n+1),.pt-cv-colsys .col-xs-4:nth-child(3n+1),.pt-cv-colsys .col-xs-3:nth-child(4n+1),.pt-cv-colsys .col-xs-2:nth-child(5n+1),.pt-cv-colsys .col-xs-2:nth-child(6n+1){clear:left!important}}@media(min-width:992px){.pt-cv-colsys [data-cvc="5"] .pt-cv-content-item{width:20%!important}.pt-cv-colsys [data-cvc="7"] .pt-cv-content-item{width:14.28571428%!important}.pt-cv-colsys [data-cvc="8"] .pt-cv-content-item{width:12.5%!important}.pt-cv-colsys [data-cvc="9"] .pt-cv-content-item{width:11.11111111%!important}.pt-cv-colsys [data-cvc="10"] .pt-cv-content-item{width:10%!important}.pt-cv-colsys [data-cvc="11"] .pt-cv-content-item{width:9.09090909%!important}}.pt-cv-colsys .pt-cv-content-item{flex:none!important;max-width:initial!important}.pt-cv-view a,.pt-cv-wrapper .btn{text-decoration:none!important;outline:0!important;font-style:normal!important}.pt-cv-view a{pointer-events:auto!important}.pt-cv-readmore{color:#fff!important;margin:10px 0!important;max-width:100%!important}.pt-cv-content-item{padding-bottom:15px!important;position:relative!important;overflow:hidden!important}.pt-cv-view .pt-cv-content-item>*{margin-bottom:10px!important}.pt-cv-ifield>*{margin-bottom:10px!important}.pt-cv-collapsible .pt-cv-content-item>*{margin-bottom:0!important}.pt-cv-title{margin-top:0!important}h4.pt-cv-title{font-size:18px!important}.pt-cv-view .pt-cv-title{margin-bottom:10px!important}.pt-cv-title a{font-weight:600!important}.pt-cv-thumbnail{height:auto!important;max-width:100%!important;margin-top:0!important;margin-bottom:10px!important;min-width:inherit!important}.pt-cv-thumbnail.pull-left{margin-right:15px!important}.pt-cv-thumbnail.pull-right{margin-left:15px!important}.pt-cv-no-image{min-width:80px!important;min-height:80px!important}.pt-cv-content,.pt-cv-content *{font-weight:400!important}.pt-cv-meta-fields{font-size:13px!important;margin-top:0!important}.pt-cv-meta-fields a{color:#41b7d8!important}.pt-cv-pagination-wrapper{margin:20px 0!important}.pt-cv-view+.pagination{float:left!important;margin:0 auto!important}.pt-cv-view+.pagination>li{background:none!important}.pt-cv-view+.pagination>li>a{cursor:pointer!important}.pt-cv-spinner{width:15px!important;height:15px!important;margin-top:-25px!important;display:inline-block!important;opacity:0!important;filter:alpha(opacity=0)!important;color:#0470ec!important;-webkit-transition:opacity .25s,width .25s!important;-moz-transition:opacity .25s,width .25s!important;-o-transition:opacity .25s,width .25s!important;transition:opacity .25s,width .25s!important}.pt-cv-spinner.active{opacity:1!important;filter:alpha(opacity=100)!important}.pt-cv-clear-pagination{margin-bottom:50px!important}.pt-cv-pagination-wrapper{clear:both!important;position:relative!important}.pt-cv-pagination-wrapper .pt-cv-pagination.pagination{-webkit-box-shadow:none!important;box-shadow:none!important;border:0!important;padding:0!important;margin:initial!important;min-height:initial!important;width:auto!important;display:inline-block!important}.pt-cv-pagination li{display:inline!important;background-image:none!important}.pt-cv-pagination li:before,.pt-cv-pagination li:after{content:none!important}.pt-cv-pagination a{cursor:pointer!important}.pt-cv-pagination li.active a{border-color:rgba(66,139,202,0.2)!important}.pt-cv-pagination li a[href="#"]{pointer-events:none!important}.pt-cv-collapsible .panel{display:block!important}.pt-cv-collapsible .panel-heading{padding:0!important}.pt-cv-collapsible .panel-heading a{display:block!important;padding:10px 15px!important}.pt-cv-collapsible .panel-body{padding:10px!important}.pt-cv-view .collapse{display:none!important;visibility:hidden!important}.pt-cv-view .collapse.in{display:block!important;visibility:visible!important;overflow:auto!important}.pt-cv-collapsible .panel-heading br{display:none!important}.pt-cv-scrollable{margin-left:0!important;margin-right:0!important}.pt-cv-scrollable .pt-cv-carousel-caption{text-align:left!important;bottom:15px!important;padding:10px!important}.pt-cv-scrollable .pt-cv-carousel-caption *{text-shadow:none!important}.pt-cv-scrollable .pt-cv-title{padding-bottom:0!important}.pt-cv-scrollable .pt-cv-carousel-caption{margin-bottom:10px!important}.pt-cv-scrollable .pt-cv-thumbnail{width:100%!important}.pt-cv-carousel-caption:empty{display:none!important}.pt-cv-scrollable .pt-cv-carousel .item{height:auto!important;margin:auto!important;min-height:0!important;max-height:none!important;line-height:normal!important}.pt-cv-scrollable .pt-cv-cap-w-img{background:rgba(0,0,0,0.6)!important;text-shadow:0 1px 1px #000!important;left:15px!important;right:15px!important}.pt-cv-cap-w-img *{color:#fff!important}.pt-cv-cap-w-img .pt-cv-title a{color:#fff!important}.pt-cv-scrollable .pt-cv-cap-wo-img{position:relative!important;bottom:0!important;left:0!important;right:0!important}.pt-cv-cap-wo-img *{color:#000!important}.pt-cv-cap-wo-img .pt-cv-readmore{color:#fff!important}.pt-cv-view .carousel-control{background-image:none!important;height:30px!important;width:40px!important;bottom:0!important;top:auto!important;color:#00a100!important}.pt-cv-view .pt-cv-carousel-indicators{bottom:0!important;margin-bottom:4px!important}.pt-cv-view .pt-cv-carousel-indicators li{background:#cecece!important;border:1px solid #cecece!important;margin:0 0!important}.pt-cv-view .pt-cv-carousel-indicators li.active{background:#428bca!important;border:1px solid #428bca!important}.pt-cv-2-col .pt-cv-title{clear:none!important}@media(min-width:480px){.pt-cv-2-col .pt-cv-colwrap{display:table!important;word-break:break-word!important}}@media(max-width:479px){.pt-cv-2-col .pt-cv-colwrap{clear:both!important}}.pt-cv-view .panel{margin-bottom:20px!important;background-color:#fff!important;border:1px solid transparent!important;border-radius:4px!important;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05)!important;box-shadow:0 1px 1px rgba(0,0,0,0.05)!important}.pt-cv-view .panel-default{border-color:#ddd!important;padding-bottom:0!important}.pt-cv-view .panel-default>.panel-heading{color:#333!important;background-color:#f5f5f5!important;border-color:#ddd!important}.pt-cv-pagination:after,.pt-cv-pagination:before{content:none!important}.pt-cv-wrapper [class*="pt-cv-"] a{box-shadow:none!important}.pt-cv-view p:empty{display:none!important}.pt-cv-view .pt-cv-ifield{margin-bottom:0!important}@media(max-width:480px){.pt-cv-nolf .pt-cv-2-col .pt-cv-thumbnail{float:none!important;margin:0!important}}@media print{.pt-cv-view a[href]:after{content:none!important}.pt-cv-view .collapse{display:block!important;height:auto!important;visibility:visible!important}}
1
+ /*!
2
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.pt-cv-wrapper article,.pt-cv-wrapper aside,.pt-cv-wrapper details,.pt-cv-wrapper figcaption,.pt-cv-wrapper footer,.pt-cv-wrapper header,.pt-cv-wrapper hgroup,.pt-cv-wrapper main,.pt-cv-wrapper menu,.pt-cv-wrapper nav,.pt-cv-wrapper section,.pt-cv-wrapper summary{display:block!important}.pt-cv-wrapper audio,.pt-cv-wrapper canvas,.pt-cv-wrapper progress,.pt-cv-wrapper video{display:inline-block!important;vertical-align:baseline!important}.pt-cv-wrapper audio:not([controls]){display:none!important;height:0!important}.pt-cv-wrapper [hidden],.pt-cv-wrapper template{display:none!important}.pt-cv-wrapper a{background-color:transparent!important}.pt-cv-wrapper a:active,.pt-cv-wrapper a:hover{outline:0!important}.pt-cv-wrapper abbr[title]{border-bottom:1px dotted!important}.pt-cv-wrapper b,.pt-cv-wrapper strong{font-weight:bold!important}.pt-cv-wrapper dfn{font-style:italic!important}.pt-cv-wrapper h1{margin:.67em 0!important}.pt-cv-wrapper mark{background:#ff0!important;color:#000!important}.pt-cv-wrapper small{font-size:80%!important}.pt-cv-wrapper sub,.pt-cv-wrapper sup{font-size:75%!important;line-height:0!important;position:relative!important;vertical-align:baseline!important}.pt-cv-wrapper sup{top:-0.5em!important}.pt-cv-wrapper sub{bottom:-0.25em!important}.pt-cv-wrapper img{border:0!important}.pt-cv-wrapper svg:not(:root){overflow:hidden!important}.pt-cv-wrapper hr{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important;height:0!important}.pt-cv-wrapper pre{overflow:auto!important}.pt-cv-wrapper code,.pt-cv-wrapper kbd,.pt-cv-wrapper pre,.pt-cv-wrapper samp{font-family:monospace,monospace!important;font-size:1em!important}.pt-cv-wrapper button,.pt-cv-wrapper input,.pt-cv-wrapper optgroup,.pt-cv-wrapper select,.pt-cv-wrapper textarea{color:inherit!important;font:inherit!important;margin:0!important}.pt-cv-wrapper button{overflow:visible!important}.pt-cv-wrapper button,.pt-cv-wrapper select{text-transform:none!important}.pt-cv-wrapper button,.pt-cv-wrapper html input[type="button"],.pt-cv-wrapper input[type="reset"],.pt-cv-wrapper input[type="submit"]{-webkit-appearance:button!important;cursor:pointer!important}.pt-cv-wrapper button[disabled],.pt-cv-wrapper html input[disabled]{cursor:default!important}.pt-cv-wrapper button::-moz-focus-inner,.pt-cv-wrapper input::-moz-focus-inner{border:0!important;padding:0!important}.pt-cv-wrapper input{line-height:normal!important}.pt-cv-wrapper input[type="checkbox"],.pt-cv-wrapper input[type="radio"]{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;padding:0!important}.pt-cv-wrapper input[type="number"]::-webkit-inner-spin-button,.pt-cv-wrapper input[type="number"]::-webkit-outer-spin-button{height:auto!important}.pt-cv-wrapper input[type="search"]{-webkit-appearance:textfield!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.pt-cv-wrapper input[type="search"]::-webkit-search-cancel-button,.pt-cv-wrapper input[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important}.pt-cv-wrapper fieldset{border:1px solid #c0c0c0!important;margin:0 2px!important;padding:.35em .625em .75em!important}.pt-cv-wrapper legend{border:0!important;padding:0!important}.pt-cv-wrapper textarea{overflow:auto!important}.pt-cv-wrapper optgroup{font-weight:bold!important}.pt-cv-wrapper table{border-collapse:collapse!important;border-spacing:0!important}.pt-cv-wrapper td,.pt-cv-wrapper th{padding:0!important}@media print{.pt-cv-wrapper *,.pt-cv-wrapper *:before,.pt-cv-wrapper *:after{background:transparent!important;color:#000!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}.pt-cv-wrapper a,.pt-cv-wrapper a:visited{text-decoration:underline!important}.pt-cv-wrapper a[href]:after{content:" (" attr(href) ")"!important}.pt-cv-wrapper abbr[title]:after{content:" (" attr(title) ")"!important}.pt-cv-wrapper a[href^="#"]:after,.pt-cv-wrapper a[href^="javascript:"]:after{content:""!important}.pt-cv-wrapper pre,.pt-cv-wrapper blockquote{border:1px solid #999!important;page-break-inside:avoid!important}.pt-cv-wrapper thead{display:table-header-group!important}.pt-cv-wrapper tr,.pt-cv-wrapper img{page-break-inside:avoid!important}.pt-cv-wrapper img{max-width:100%!important}.pt-cv-wrapper p,.pt-cv-wrapper h2,.pt-cv-wrapper h3{orphans:3!important;widows:3!important}.pt-cv-wrapper h2,.pt-cv-wrapper h3{page-break-after:avoid!important}.pt-cv-wrapper .navbar{display:none!important}.pt-cv-wrapper .btn>.caret,.pt-cv-wrapper .dropup>.btn>.caret{border-top-color:#000!important}.pt-cv-wrapper .label{border:1px solid #000!important}.pt-cv-wrapper .table{border-collapse:collapse!important}.pt-cv-wrapper .table td,.pt-cv-wrapper .table th{background-color:#fff!important}.pt-cv-wrapper .table-bordered th,.pt-cv-wrapper .table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.pt-cv-wrapper .glyphicon{position:relative!important;top:1px!important;display:inline-block!important;font-family:'Glyphicons Halflings'!important;font-style:normal!important;font-weight:normal!important;line-height:1!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.pt-cv-wrapper .glyphicon-asterisk:before{content:"\2a"!important}.pt-cv-wrapper .glyphicon-plus:before{content:"\2b"!important}.pt-cv-wrapper .glyphicon-euro:before,.pt-cv-wrapper .glyphicon-eur:before{content:"\20ac"!important}.pt-cv-wrapper .glyphicon-minus:before{content:"\2212"!important}.pt-cv-wrapper .glyphicon-cloud:before{content:"\2601"!important}.pt-cv-wrapper .glyphicon-envelope:before{content:"\2709"!important}.pt-cv-wrapper .glyphicon-pencil:before{content:"\270f"!important}.pt-cv-wrapper .glyphicon-glass:before{content:"\e001"!important}.pt-cv-wrapper .glyphicon-music:before{content:"\e002"!important}.pt-cv-wrapper .glyphicon-search:before{content:"\e003"!important}.pt-cv-wrapper .glyphicon-heart:before{content:"\e005"!important}.pt-cv-wrapper .glyphicon-star:before{content:"\e006"!important}.pt-cv-wrapper .glyphicon-star-empty:before{content:"\e007"!important}.pt-cv-wrapper .glyphicon-user:before{content:"\e008"!important}.pt-cv-wrapper .glyphicon-film:before{content:"\e009"!important}.pt-cv-wrapper .glyphicon-th-large:before{content:"\e010"!important}.pt-cv-wrapper .glyphicon-th:before{content:"\e011"!important}.pt-cv-wrapper .glyphicon-th-list:before{content:"\e012"!important}.pt-cv-wrapper .glyphicon-ok:before{content:"\e013"!important}.pt-cv-wrapper .glyphicon-remove:before{content:"\e014"!important}.pt-cv-wrapper .glyphicon-zoom-in:before{content:"\e015"!important}.pt-cv-wrapper .glyphicon-zoom-out:before{content:"\e016"!important}.pt-cv-wrapper .glyphicon-off:before{content:"\e017"!important}.pt-cv-wrapper .glyphicon-signal:before{content:"\e018"!important}.pt-cv-wrapper .glyphicon-cog:before{content:"\e019"!important}.pt-cv-wrapper .glyphicon-trash:before{content:"\e020"!important}.pt-cv-wrapper .glyphicon-home:before{content:"\e021"!important}.pt-cv-wrapper .glyphicon-file:before{content:"\e022"!important}.pt-cv-wrapper .glyphicon-time:before{content:"\e023"!important}.pt-cv-wrapper .glyphicon-road:before{content:"\e024"!important}.pt-cv-wrapper .glyphicon-download-alt:before{content:"\e025"!important}.pt-cv-wrapper .glyphicon-download:before{content:"\e026"!important}.pt-cv-wrapper .glyphicon-upload:before{content:"\e027"!important}.pt-cv-wrapper .glyphicon-inbox:before{content:"\e028"!important}.pt-cv-wrapper .glyphicon-play-circle:before{content:"\e029"!important}.pt-cv-wrapper .glyphicon-repeat:before{content:"\e030"!important}.pt-cv-wrapper .glyphicon-refresh:before{content:"\e031"!important}.pt-cv-wrapper .glyphicon-list-alt:before{content:"\e032"!important}.pt-cv-wrapper .glyphicon-lock:before{content:"\e033"!important}.pt-cv-wrapper .glyphicon-flag:before{content:"\e034"!important}.pt-cv-wrapper .glyphicon-headphones:before{content:"\e035"!important}.pt-cv-wrapper .glyphicon-volume-off:before{content:"\e036"!important}.pt-cv-wrapper .glyphicon-volume-down:before{content:"\e037"!important}.pt-cv-wrapper .glyphicon-volume-up:before{content:"\e038"!important}.pt-cv-wrapper .glyphicon-qrcode:before{content:"\e039"!important}.pt-cv-wrapper .glyphicon-barcode:before{content:"\e040"!important}.pt-cv-wrapper .glyphicon-tag:before{content:"\e041"!important}.pt-cv-wrapper .glyphicon-tags:before{content:"\e042"!important}.pt-cv-wrapper .glyphicon-book:before{content:"\e043"!important}.pt-cv-wrapper .glyphicon-bookmark:before{content:"\e044"!important}.pt-cv-wrapper .glyphicon-print:before{content:"\e045"!important}.pt-cv-wrapper .glyphicon-camera:before{content:"\e046"!important}.pt-cv-wrapper .glyphicon-font:before{content:"\e047"!important}.pt-cv-wrapper .glyphicon-bold:before{content:"\e048"!important}.pt-cv-wrapper .glyphicon-italic:before{content:"\e049"!important}.pt-cv-wrapper .glyphicon-text-height:before{content:"\e050"!important}.pt-cv-wrapper .glyphicon-text-width:before{content:"\e051"!important}.pt-cv-wrapper .glyphicon-align-left:before{content:"\e052"!important}.pt-cv-wrapper .glyphicon-align-center:before{content:"\e053"!important}.pt-cv-wrapper .glyphicon-align-right:before{content:"\e054"!important}.pt-cv-wrapper .glyphicon-align-justify:before{content:"\e055"!important}.pt-cv-wrapper .glyphicon-list:before{content:"\e056"!important}.pt-cv-wrapper .glyphicon-indent-left:before{content:"\e057"!important}.pt-cv-wrapper .glyphicon-indent-right:before{content:"\e058"!important}.pt-cv-wrapper .glyphicon-facetime-video:before{content:"\e059"!important}.pt-cv-wrapper .glyphicon-picture:before{content:"\e060"!important}.pt-cv-wrapper .glyphicon-map-marker:before{content:"\e062"!important}.pt-cv-wrapper .glyphicon-adjust:before{content:"\e063"!important}.pt-cv-wrapper .glyphicon-tint:before{content:"\e064"!important}.pt-cv-wrapper .glyphicon-edit:before{content:"\e065"!important}.pt-cv-wrapper .glyphicon-share:before{content:"\e066"!important}.pt-cv-wrapper .glyphicon-check:before{content:"\e067"!important}.pt-cv-wrapper .glyphicon-move:before{content:"\e068"!important}.pt-cv-wrapper .glyphicon-step-backward:before{content:"\e069"!important}.pt-cv-wrapper .glyphicon-fast-backward:before{content:"\e070"!important}.pt-cv-wrapper .glyphicon-backward:before{content:"\e071"!important}.pt-cv-wrapper .glyphicon-play:before{content:"\e072"!important}.pt-cv-wrapper .glyphicon-pause:before{content:"\e073"!important}.pt-cv-wrapper .glyphicon-stop:before{content:"\e074"!important}.pt-cv-wrapper .glyphicon-forward:before{content:"\e075"!important}.pt-cv-wrapper .glyphicon-fast-forward:before{content:"\e076"!important}.pt-cv-wrapper .glyphicon-step-forward:before{content:"\e077"!important}.pt-cv-wrapper .glyphicon-eject:before{content:"\e078"!important}.pt-cv-wrapper .glyphicon-chevron-left:before{content:"\e079"!important}.pt-cv-wrapper .glyphicon-chevron-right:before{content:"\e080"!important}.pt-cv-wrapper .glyphicon-plus-sign:before{content:"\e081"!important}.pt-cv-wrapper .glyphicon-minus-sign:before{content:"\e082"!important}.pt-cv-wrapper .glyphicon-remove-sign:before{content:"\e083"!important}.pt-cv-wrapper .glyphicon-ok-sign:before{content:"\e084"!important}.pt-cv-wrapper .glyphicon-question-sign:before{content:"\e085"!important}.pt-cv-wrapper .glyphicon-info-sign:before{content:"\e086"!important}.pt-cv-wrapper .glyphicon-screenshot:before{content:"\e087"!important}.pt-cv-wrapper .glyphicon-remove-circle:before{content:"\e088"!important}.pt-cv-wrapper .glyphicon-ok-circle:before{content:"\e089"!important}.pt-cv-wrapper .glyphicon-ban-circle:before{content:"\e090"!important}.pt-cv-wrapper .glyphicon-arrow-left:before{content:"\e091"!important}.pt-cv-wrapper .glyphicon-arrow-right:before{content:"\e092"!important}.pt-cv-wrapper .glyphicon-arrow-up:before{content:"\e093"!important}.pt-cv-wrapper .glyphicon-arrow-down:before{content:"\e094"!important}.pt-cv-wrapper .glyphicon-share-alt:before{content:"\e095"!important}.pt-cv-wrapper .glyphicon-resize-full:before{content:"\e096"!important}.pt-cv-wrapper .glyphicon-resize-small:before{content:"\e097"!important}.pt-cv-wrapper .glyphicon-exclamation-sign:before{content:"\e101"!important}.pt-cv-wrapper .glyphicon-gift:before{content:"\e102"!important}.pt-cv-wrapper .glyphicon-leaf:before{content:"\e103"!important}.pt-cv-wrapper .glyphicon-fire:before{content:"\e104"!important}.pt-cv-wrapper .glyphicon-eye-open:before{content:"\e105"!important}.pt-cv-wrapper .glyphicon-eye-close:before{content:"\e106"!important}.pt-cv-wrapper .glyphicon-warning-sign:before{content:"\e107"!important}.pt-cv-wrapper .glyphicon-plane:before{content:"\e108"!important}.pt-cv-wrapper .glyphicon-calendar:before{content:"\e109"!important}.pt-cv-wrapper .glyphicon-random:before{content:"\e110"!important}.pt-cv-wrapper .glyphicon-comment:before{content:"\e111"!important}.pt-cv-wrapper .glyphicon-magnet:before{content:"\e112"!important}.pt-cv-wrapper .glyphicon-chevron-up:before{content:"\e113"!important}.pt-cv-wrapper .glyphicon-chevron-down:before{content:"\e114"!important}.pt-cv-wrapper .glyphicon-retweet:before{content:"\e115"!important}.pt-cv-wrapper .glyphicon-shopping-cart:before{content:"\e116"!important}.pt-cv-wrapper .glyphicon-folder-close:before{content:"\e117"!important}.pt-cv-wrapper .glyphicon-folder-open:before{content:"\e118"!important}.pt-cv-wrapper .glyphicon-resize-vertical:before{content:"\e119"!important}.pt-cv-wrapper .glyphicon-resize-horizontal:before{content:"\e120"!important}.pt-cv-wrapper .glyphicon-hdd:before{content:"\e121"!important}.pt-cv-wrapper .glyphicon-bullhorn:before{content:"\e122"!important}.pt-cv-wrapper .glyphicon-bell:before{content:"\e123"!important}.pt-cv-wrapper .glyphicon-certificate:before{content:"\e124"!important}.pt-cv-wrapper .glyphicon-thumbs-up:before{content:"\e125"!important}.pt-cv-wrapper .glyphicon-thumbs-down:before{content:"\e126"!important}.pt-cv-wrapper .glyphicon-hand-right:before{content:"\e127"!important}.pt-cv-wrapper .glyphicon-hand-left:before{content:"\e128"!important}.pt-cv-wrapper .glyphicon-hand-up:before{content:"\e129"!important}.pt-cv-wrapper .glyphicon-hand-down:before{content:"\e130"!important}.pt-cv-wrapper .glyphicon-circle-arrow-right:before{content:"\e131"!important}.pt-cv-wrapper .glyphicon-circle-arrow-left:before{content:"\e132"!important}.pt-cv-wrapper .glyphicon-circle-arrow-up:before{content:"\e133"!important}.pt-cv-wrapper .glyphicon-circle-arrow-down:before{content:"\e134"!important}.pt-cv-wrapper .glyphicon-globe:before{content:"\e135"!important}.pt-cv-wrapper .glyphicon-wrench:before{content:"\e136"!important}.pt-cv-wrapper .glyphicon-tasks:before{content:"\e137"!important}.pt-cv-wrapper .glyphicon-filter:before{content:"\e138"!important}.pt-cv-wrapper .glyphicon-briefcase:before{content:"\e139"!important}.pt-cv-wrapper .glyphicon-fullscreen:before{content:"\e140"!important}.pt-cv-wrapper .glyphicon-dashboard:before{content:"\e141"!important}.pt-cv-wrapper .glyphicon-paperclip:before{content:"\e142"!important}.pt-cv-wrapper .glyphicon-heart-empty:before{content:"\e143"!important}.pt-cv-wrapper .glyphicon-link:before{content:"\e144"!important}.pt-cv-wrapper .glyphicon-phone:before{content:"\e145"!important}.pt-cv-wrapper .glyphicon-pushpin:before{content:"\e146"!important}.pt-cv-wrapper .glyphicon-usd:before{content:"\e148"!important}.pt-cv-wrapper .glyphicon-gbp:before{content:"\e149"!important}.pt-cv-wrapper .glyphicon-sort:before{content:"\e150"!important}.pt-cv-wrapper .glyphicon-sort-by-alphabet:before{content:"\e151"!important}.pt-cv-wrapper .glyphicon-sort-by-alphabet-alt:before{content:"\e152"!important}.pt-cv-wrapper .glyphicon-sort-by-order:before{content:"\e153"!important}.pt-cv-wrapper .glyphicon-sort-by-order-alt:before{content:"\e154"!important}.pt-cv-wrapper .glyphicon-sort-by-attributes:before{content:"\e155"!important}.pt-cv-wrapper .glyphicon-sort-by-attributes-alt:before{content:"\e156"!important}.pt-cv-wrapper .glyphicon-unchecked:before{content:"\e157"!important}.pt-cv-wrapper .glyphicon-expand:before{content:"\e158"!important}.pt-cv-wrapper .glyphicon-collapse-down:before{content:"\e159"!important}.pt-cv-wrapper .glyphicon-collapse-up:before{content:"\e160"!important}.pt-cv-wrapper .glyphicon-log-in:before{content:"\e161"!important}.pt-cv-wrapper .glyphicon-flash:before{content:"\e162"!important}.pt-cv-wrapper .glyphicon-log-out:before{content:"\e163"!important}.pt-cv-wrapper .glyphicon-new-window:before{content:"\e164"!important}.pt-cv-wrapper .glyphicon-record:before{content:"\e165"!important}.pt-cv-wrapper .glyphicon-save:before{content:"\e166"!important}.pt-cv-wrapper .glyphicon-open:before{content:"\e167"!important}.pt-cv-wrapper .glyphicon-saved:before{content:"\e168"!important}.pt-cv-wrapper .glyphicon-import:before{content:"\e169"!important}.pt-cv-wrapper .glyphicon-export:before{content:"\e170"!important}.pt-cv-wrapper .glyphicon-send:before{content:"\e171"!important}.pt-cv-wrapper .glyphicon-floppy-disk:before{content:"\e172"!important}.pt-cv-wrapper .glyphicon-floppy-saved:before{content:"\e173"!important}.pt-cv-wrapper .glyphicon-floppy-remove:before{content:"\e174"!important}.pt-cv-wrapper .glyphicon-floppy-save:before{content:"\e175"!important}.pt-cv-wrapper .glyphicon-floppy-open:before{content:"\e176"!important}.pt-cv-wrapper .glyphicon-credit-card:before{content:"\e177"!important}.pt-cv-wrapper .glyphicon-transfer:before{content:"\e178"!important}.pt-cv-wrapper .glyphicon-cutlery:before{content:"\e179"!important}.pt-cv-wrapper .glyphicon-header:before{content:"\e180"!important}.pt-cv-wrapper .glyphicon-compressed:before{content:"\e181"!important}.pt-cv-wrapper .glyphicon-earphone:before{content:"\e182"!important}.pt-cv-wrapper .glyphicon-phone-alt:before{content:"\e183"!important}.pt-cv-wrapper .glyphicon-tower:before{content:"\e184"!important}.pt-cv-wrapper .glyphicon-stats:before{content:"\e185"!important}.pt-cv-wrapper .glyphicon-sd-video:before{content:"\e186"!important}.pt-cv-wrapper .glyphicon-hd-video:before{content:"\e187"!important}.pt-cv-wrapper .glyphicon-subtitles:before{content:"\e188"!important}.pt-cv-wrapper .glyphicon-sound-stereo:before{content:"\e189"!important}.pt-cv-wrapper .glyphicon-sound-dolby:before{content:"\e190"!important}.pt-cv-wrapper .glyphicon-sound-5-1:before{content:"\e191"!important}.pt-cv-wrapper .glyphicon-sound-6-1:before{content:"\e192"!important}.pt-cv-wrapper .glyphicon-sound-7-1:before{content:"\e193"!important}.pt-cv-wrapper .glyphicon-copyright-mark:before{content:"\e194"!important}.pt-cv-wrapper .glyphicon-registration-mark:before{content:"\e195"!important}.pt-cv-wrapper .glyphicon-cloud-download:before{content:"\e197"!important}.pt-cv-wrapper .glyphicon-cloud-upload:before{content:"\e198"!important}.pt-cv-wrapper .glyphicon-tree-conifer:before{content:"\e199"!important}.pt-cv-wrapper .glyphicon-tree-deciduous:before{content:"\e200"!important}.pt-cv-wrapper .glyphicon-cd:before{content:"\e201"!important}.pt-cv-wrapper .glyphicon-save-file:before{content:"\e202"!important}.pt-cv-wrapper .glyphicon-open-file:before{content:"\e203"!important}.pt-cv-wrapper .glyphicon-level-up:before{content:"\e204"!important}.pt-cv-wrapper .glyphicon-copy:before{content:"\e205"!important}.pt-cv-wrapper .glyphicon-paste:before{content:"\e206"!important}.pt-cv-wrapper .glyphicon-alert:before{content:"\e209"!important}.pt-cv-wrapper .glyphicon-equalizer:before{content:"\e210"!important}.pt-cv-wrapper .glyphicon-king:before{content:"\e211"!important}.pt-cv-wrapper .glyphicon-queen:before{content:"\e212"!important}.pt-cv-wrapper .glyphicon-pawn:before{content:"\e213"!important}.pt-cv-wrapper .glyphicon-bishop:before{content:"\e214"!important}.pt-cv-wrapper .glyphicon-knight:before{content:"\e215"!important}.pt-cv-wrapper .glyphicon-baby-formula:before{content:"\e216"!important}.pt-cv-wrapper .glyphicon-tent:before{content:"\26fa"!important}.pt-cv-wrapper .glyphicon-blackboard:before{content:"\e218"!important}.pt-cv-wrapper .glyphicon-bed:before{content:"\e219"!important}.pt-cv-wrapper .glyphicon-apple:before{content:"\f8ff"!important}.pt-cv-wrapper .glyphicon-erase:before{content:"\e221"!important}.pt-cv-wrapper .glyphicon-hourglass:before{content:"\231b"!important}.pt-cv-wrapper .glyphicon-lamp:before{content:"\e223"!important}.pt-cv-wrapper .glyphicon-duplicate:before{content:"\e224"!important}.pt-cv-wrapper .glyphicon-piggy-bank:before{content:"\e225"!important}.pt-cv-wrapper .glyphicon-scissors:before{content:"\e226"!important}.pt-cv-wrapper .glyphicon-bitcoin:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-btc:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-xbt:before{content:"\e227"!important}.pt-cv-wrapper .glyphicon-yen:before{content:"\00a5"!important}.pt-cv-wrapper .glyphicon-jpy:before{content:"\00a5"!important}.pt-cv-wrapper .glyphicon-ruble:before{content:"\20bd"!important}.pt-cv-wrapper .glyphicon-rub:before{content:"\20bd"!important}.pt-cv-wrapper .glyphicon-scale:before{content:"\e230"!important}.pt-cv-wrapper .glyphicon-ice-lolly:before{content:"\e231"!important}.pt-cv-wrapper .glyphicon-ice-lolly-tasted:before{content:"\e232"!important}.pt-cv-wrapper .glyphicon-education:before{content:"\e233"!important}.pt-cv-wrapper .glyphicon-option-horizontal:before{content:"\e234"!important}.pt-cv-wrapper .glyphicon-option-vertical:before{content:"\e235"!important}.pt-cv-wrapper .glyphicon-menu-hamburger:before{content:"\e236"!important}.pt-cv-wrapper .glyphicon-modal-window:before{content:"\e237"!important}.pt-cv-wrapper .glyphicon-oil:before{content:"\e238"!important}.pt-cv-wrapper .glyphicon-grain:before{content:"\e239"!important}.pt-cv-wrapper .glyphicon-sunglasses:before{content:"\e240"!important}.pt-cv-wrapper .glyphicon-text-size:before{content:"\e241"!important}.pt-cv-wrapper .glyphicon-text-color:before{content:"\e242"!important}.pt-cv-wrapper .glyphicon-text-background:before{content:"\e243"!important}.pt-cv-wrapper .glyphicon-object-align-top:before{content:"\e244"!important}.pt-cv-wrapper .glyphicon-object-align-bottom:before{content:"\e245"!important}.pt-cv-wrapper .glyphicon-object-align-horizontal:before{content:"\e246"!important}.pt-cv-wrapper .glyphicon-object-align-left:before{content:"\e247"!important}.pt-cv-wrapper .glyphicon-object-align-vertical:before{content:"\e248"!important}.pt-cv-wrapper .glyphicon-object-align-right:before{content:"\e249"!important}.pt-cv-wrapper .glyphicon-triangle-right:before{content:"\e250"!important}.pt-cv-wrapper .glyphicon-triangle-left:before{content:"\e251"!important}.pt-cv-wrapper .glyphicon-triangle-bottom:before{content:"\e252"!important}.pt-cv-wrapper .glyphicon-triangle-top:before{content:"\e253"!important}.pt-cv-wrapper .glyphicon-console:before{content:"\e254"!important}.pt-cv-wrapper .glyphicon-superscript:before{content:"\e255"!important}.pt-cv-wrapper .glyphicon-subscript:before{content:"\e256"!important}.pt-cv-wrapper .glyphicon-menu-left:before{content:"\e257"!important}.pt-cv-wrapper .glyphicon-menu-right:before{content:"\e258"!important}.pt-cv-wrapper .glyphicon-menu-down:before{content:"\e259"!important}.pt-cv-wrapper .glyphicon-menu-up:before{content:"\e260"!important}.pt-cv-wrapper img{vertical-align:middle!important}.pt-cv-wrapper .img-responsive,.pt-cv-wrapper .thumbnail>img,.pt-cv-wrapper .thumbnail a>img,.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .carousel-inner>.item>a>img{display:block!important;max-width:100%!important;height:auto!important}.pt-cv-wrapper .img-rounded{border-radius:6px!important}.pt-cv-wrapper .img-thumbnail{padding:4px!important;line-height:1.42857143!important;background-color:#fff!important;border:1px solid #ddd!important;border-radius:4px!important;-webkit-transition:all .2s ease-in-out!important;-o-transition:all .2s ease-in-out!important;transition:all .2s ease-in-out!important;display:inline-block!important;max-width:100%!important;height:auto!important}.pt-cv-wrapper .img-circle{border-radius:50%!important}.pt-cv-wrapper hr{margin-top:20px!important;margin-bottom:20px!important;border:0!important;border-top:1px solid #eee!important}.pt-cv-wrapper .sr-only{position:absolute!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;border:0!important}.pt-cv-wrapper .sr-only-focusable:active,.pt-cv-wrapper .sr-only-focusable:focus{position:static!important;width:auto!important;height:auto!important;margin:0!important;overflow:visible!important;clip:auto!important}.pt-cv-wrapper [role="button"]{cursor:pointer!important}.pt-cv-wrapper .container{margin-right:auto!important;margin-left:auto!important;padding-left:15px!important;padding-right:15px!important}@media(min-width:768px){.pt-cv-wrapper .container{width:750px!important}}@media(min-width:992px){.pt-cv-wrapper .container{width:970px!important}}@media(min-width:1200px){.pt-cv-wrapper .container{width:1170px!important}}.pt-cv-wrapper .container-fluid{margin-right:auto!important;margin-left:auto!important;padding-left:15px!important;padding-right:15px!important}.pt-cv-wrapper .row{margin-left:-15px!important;margin-right:-15px!important}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-xs-9,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-xs-12,.pt-cv-wrapper .col-sm-12,.pt-cv-wrapper .col-md-12,.pt-cv-wrapper .col-lg-12{position:relative!important;min-height:1px!important;padding-left:15px!important;padding-right:15px!important}.pt-cv-wrapper .col-xs-1,.pt-cv-wrapper .col-xs-2,.pt-cv-wrapper .col-xs-3,.pt-cv-wrapper .col-xs-4,.pt-cv-wrapper .col-xs-5,.pt-cv-wrapper .col-xs-6,.pt-cv-wrapper .col-xs-7,.pt-cv-wrapper .col-xs-8,.pt-cv-wrapper .col-xs-9,.pt-cv-wrapper .col-xs-10,.pt-cv-wrapper .col-xs-11,.pt-cv-wrapper .col-xs-12{float:left!important}.pt-cv-wrapper .col-xs-12{width:100%!important}.pt-cv-wrapper .col-xs-11{width:91.66666667%!important}.pt-cv-wrapper .col-xs-10{width:83.33333333%!important}.pt-cv-wrapper .col-xs-9{width:75%!important}.pt-cv-wrapper .col-xs-8{width:66.66666667%!important}.pt-cv-wrapper .col-xs-7{width:58.33333333%!important}.pt-cv-wrapper .col-xs-6{width:50%!important}.pt-cv-wrapper .col-xs-5{width:41.66666667%!important}.pt-cv-wrapper .col-xs-4{width:33.33333333%!important}.pt-cv-wrapper .col-xs-3{width:25%!important}.pt-cv-wrapper .col-xs-2{width:16.66666667%!important}.pt-cv-wrapper .col-xs-1{width:8.33333333%!important}.pt-cv-wrapper .col-xs-pull-12{right:100%!important}.pt-cv-wrapper .col-xs-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-xs-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-xs-pull-9{right:75%!important}.pt-cv-wrapper .col-xs-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-xs-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-xs-pull-6{right:50%!important}.pt-cv-wrapper .col-xs-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-xs-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-xs-pull-3{right:25%!important}.pt-cv-wrapper .col-xs-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-xs-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-xs-pull-0{right:auto!important}.pt-cv-wrapper .col-xs-push-12{left:100%!important}.pt-cv-wrapper .col-xs-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-xs-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-xs-push-9{left:75%!important}.pt-cv-wrapper .col-xs-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-xs-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-xs-push-6{left:50%!important}.pt-cv-wrapper .col-xs-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-xs-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-xs-push-3{left:25%!important}.pt-cv-wrapper .col-xs-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-xs-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-xs-push-0{left:auto!important}.pt-cv-wrapper .col-xs-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-xs-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-xs-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-xs-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-xs-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-xs-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-xs-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-xs-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-xs-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-xs-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-xs-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-xs-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-xs-offset-0{margin-left:0!important}@media(min-width:768px){.pt-cv-wrapper .col-sm-1,.pt-cv-wrapper .col-sm-2,.pt-cv-wrapper .col-sm-3,.pt-cv-wrapper .col-sm-4,.pt-cv-wrapper .col-sm-5,.pt-cv-wrapper .col-sm-6,.pt-cv-wrapper .col-sm-7,.pt-cv-wrapper .col-sm-8,.pt-cv-wrapper .col-sm-9,.pt-cv-wrapper .col-sm-10,.pt-cv-wrapper .col-sm-11,.pt-cv-wrapper .col-sm-12{float:left!important}.pt-cv-wrapper .col-sm-12{width:100%!important}.pt-cv-wrapper .col-sm-11{width:91.66666667%!important}.pt-cv-wrapper .col-sm-10{width:83.33333333%!important}.pt-cv-wrapper .col-sm-9{width:75%!important}.pt-cv-wrapper .col-sm-8{width:66.66666667%!important}.pt-cv-wrapper .col-sm-7{width:58.33333333%!important}.pt-cv-wrapper .col-sm-6{width:50%!important}.pt-cv-wrapper .col-sm-5{width:41.66666667%!important}.pt-cv-wrapper .col-sm-4{width:33.33333333%!important}.pt-cv-wrapper .col-sm-3{width:25%!important}.pt-cv-wrapper .col-sm-2{width:16.66666667%!important}.pt-cv-wrapper .col-sm-1{width:8.33333333%!important}.pt-cv-wrapper .col-sm-pull-12{right:100%!important}.pt-cv-wrapper .col-sm-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-sm-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-sm-pull-9{right:75%!important}.pt-cv-wrapper .col-sm-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-sm-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-sm-pull-6{right:50%!important}.pt-cv-wrapper .col-sm-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-sm-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-sm-pull-3{right:25%!important}.pt-cv-wrapper .col-sm-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-sm-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-sm-pull-0{right:auto!important}.pt-cv-wrapper .col-sm-push-12{left:100%!important}.pt-cv-wrapper .col-sm-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-sm-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-sm-push-9{left:75%!important}.pt-cv-wrapper .col-sm-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-sm-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-sm-push-6{left:50%!important}.pt-cv-wrapper .col-sm-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-sm-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-sm-push-3{left:25%!important}.pt-cv-wrapper .col-sm-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-sm-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-sm-push-0{left:auto!important}.pt-cv-wrapper .col-sm-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-sm-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-sm-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-sm-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-sm-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-sm-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-sm-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-sm-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-sm-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-sm-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-sm-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-sm-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-sm-offset-0{margin-left:0!important}}@media(min-width:992px){.pt-cv-wrapper .col-md-1,.pt-cv-wrapper .col-md-2,.pt-cv-wrapper .col-md-3,.pt-cv-wrapper .col-md-4,.pt-cv-wrapper .col-md-5,.pt-cv-wrapper .col-md-6,.pt-cv-wrapper .col-md-7,.pt-cv-wrapper .col-md-8,.pt-cv-wrapper .col-md-9,.pt-cv-wrapper .col-md-10,.pt-cv-wrapper .col-md-11,.pt-cv-wrapper .col-md-12{float:left!important}.pt-cv-wrapper .col-md-12{width:100%!important}.pt-cv-wrapper .col-md-11{width:91.66666667%!important}.pt-cv-wrapper .col-md-10{width:83.33333333%!important}.pt-cv-wrapper .col-md-9{width:75%!important}.pt-cv-wrapper .col-md-8{width:66.66666667%!important}.pt-cv-wrapper .col-md-7{width:58.33333333%!important}.pt-cv-wrapper .col-md-6{width:50%!important}.pt-cv-wrapper .col-md-5{width:41.66666667%!important}.pt-cv-wrapper .col-md-4{width:33.33333333%!important}.pt-cv-wrapper .col-md-3{width:25%!important}.pt-cv-wrapper .col-md-2{width:16.66666667%!important}.pt-cv-wrapper .col-md-1{width:8.33333333%!important}.pt-cv-wrapper .col-md-pull-12{right:100%!important}.pt-cv-wrapper .col-md-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-md-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-md-pull-9{right:75%!important}.pt-cv-wrapper .col-md-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-md-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-md-pull-6{right:50%!important}.pt-cv-wrapper .col-md-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-md-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-md-pull-3{right:25%!important}.pt-cv-wrapper .col-md-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-md-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-md-pull-0{right:auto!important}.pt-cv-wrapper .col-md-push-12{left:100%!important}.pt-cv-wrapper .col-md-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-md-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-md-push-9{left:75%!important}.pt-cv-wrapper .col-md-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-md-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-md-push-6{left:50%!important}.pt-cv-wrapper .col-md-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-md-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-md-push-3{left:25%!important}.pt-cv-wrapper .col-md-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-md-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-md-push-0{left:auto!important}.pt-cv-wrapper .col-md-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-md-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-md-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-md-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-md-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-md-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-md-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-md-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-md-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-md-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-md-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-md-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-md-offset-0{margin-left:0!important}}@media(min-width:1200px){.pt-cv-wrapper .col-lg-1,.pt-cv-wrapper .col-lg-2,.pt-cv-wrapper .col-lg-3,.pt-cv-wrapper .col-lg-4,.pt-cv-wrapper .col-lg-5,.pt-cv-wrapper .col-lg-6,.pt-cv-wrapper .col-lg-7,.pt-cv-wrapper .col-lg-8,.pt-cv-wrapper .col-lg-9,.pt-cv-wrapper .col-lg-10,.pt-cv-wrapper .col-lg-11,.pt-cv-wrapper .col-lg-12{float:left!important}.pt-cv-wrapper .col-lg-12{width:100%!important}.pt-cv-wrapper .col-lg-11{width:91.66666667%!important}.pt-cv-wrapper .col-lg-10{width:83.33333333%!important}.pt-cv-wrapper .col-lg-9{width:75%!important}.pt-cv-wrapper .col-lg-8{width:66.66666667%!important}.pt-cv-wrapper .col-lg-7{width:58.33333333%!important}.pt-cv-wrapper .col-lg-6{width:50%!important}.pt-cv-wrapper .col-lg-5{width:41.66666667%!important}.pt-cv-wrapper .col-lg-4{width:33.33333333%!important}.pt-cv-wrapper .col-lg-3{width:25%!important}.pt-cv-wrapper .col-lg-2{width:16.66666667%!important}.pt-cv-wrapper .col-lg-1{width:8.33333333%!important}.pt-cv-wrapper .col-lg-pull-12{right:100%!important}.pt-cv-wrapper .col-lg-pull-11{right:91.66666667%!important}.pt-cv-wrapper .col-lg-pull-10{right:83.33333333%!important}.pt-cv-wrapper .col-lg-pull-9{right:75%!important}.pt-cv-wrapper .col-lg-pull-8{right:66.66666667%!important}.pt-cv-wrapper .col-lg-pull-7{right:58.33333333%!important}.pt-cv-wrapper .col-lg-pull-6{right:50%!important}.pt-cv-wrapper .col-lg-pull-5{right:41.66666667%!important}.pt-cv-wrapper .col-lg-pull-4{right:33.33333333%!important}.pt-cv-wrapper .col-lg-pull-3{right:25%!important}.pt-cv-wrapper .col-lg-pull-2{right:16.66666667%!important}.pt-cv-wrapper .col-lg-pull-1{right:8.33333333%!important}.pt-cv-wrapper .col-lg-pull-0{right:auto!important}.pt-cv-wrapper .col-lg-push-12{left:100%!important}.pt-cv-wrapper .col-lg-push-11{left:91.66666667%!important}.pt-cv-wrapper .col-lg-push-10{left:83.33333333%!important}.pt-cv-wrapper .col-lg-push-9{left:75%!important}.pt-cv-wrapper .col-lg-push-8{left:66.66666667%!important}.pt-cv-wrapper .col-lg-push-7{left:58.33333333%!important}.pt-cv-wrapper .col-lg-push-6{left:50%!important}.pt-cv-wrapper .col-lg-push-5{left:41.66666667%!important}.pt-cv-wrapper .col-lg-push-4{left:33.33333333%!important}.pt-cv-wrapper .col-lg-push-3{left:25%!important}.pt-cv-wrapper .col-lg-push-2{left:16.66666667%!important}.pt-cv-wrapper .col-lg-push-1{left:8.33333333%!important}.pt-cv-wrapper .col-lg-push-0{left:auto!important}.pt-cv-wrapper .col-lg-offset-12{margin-left:100%!important}.pt-cv-wrapper .col-lg-offset-11{margin-left:91.66666667%!important}.pt-cv-wrapper .col-lg-offset-10{margin-left:83.33333333%!important}.pt-cv-wrapper .col-lg-offset-9{margin-left:75%!important}.pt-cv-wrapper .col-lg-offset-8{margin-left:66.66666667%!important}.pt-cv-wrapper .col-lg-offset-7{margin-left:58.33333333%!important}.pt-cv-wrapper .col-lg-offset-6{margin-left:50%!important}.pt-cv-wrapper .col-lg-offset-5{margin-left:41.66666667%!important}.pt-cv-wrapper .col-lg-offset-4{margin-left:33.33333333%!important}.pt-cv-wrapper .col-lg-offset-3{margin-left:25%!important}.pt-cv-wrapper .col-lg-offset-2{margin-left:16.66666667%!important}.pt-cv-wrapper .col-lg-offset-1{margin-left:8.33333333%!important}.pt-cv-wrapper .col-lg-offset-0{margin-left:0!important}}.pt-cv-wrapper .btn{display:inline-block!important;margin-bottom:0!important;font-weight:normal!important;text-align:center!important;vertical-align:middle!important;-ms-touch-action:manipulation!important;touch-action:manipulation!important;cursor:pointer!important;background-image:none!important;border:1px solid transparent!important;white-space:nowrap!important;padding:6px 12px!important;font-size:14px!important;line-height:1.42857143!important;border-radius:4px!important;-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn:active:focus,.pt-cv-wrapper .btn.active:focus,.pt-cv-wrapper .btn.focus,.pt-cv-wrapper .btn:active.focus,.pt-cv-wrapper .btn.active.focus{outline:thin dotted!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px!important}.pt-cv-wrapper .btn:hover,.pt-cv-wrapper .btn:focus,.pt-cv-wrapper .btn.focus{color:#333!important;text-decoration:none!important}.pt-cv-wrapper .btn:active,.pt-cv-wrapper .btn.active{outline:0!important;background-image:none!important;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important}.pt-cv-wrapper .btn.disabled,.pt-cv-wrapper .btn[disabled],.pt-cv-wrapper fieldset[disabled] .btn{cursor:not-allowed!important;opacity:.65!important;filter:alpha(opacity=65)!important;-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper a.btn.disabled,.pt-cv-wrapper fieldset[disabled] a.btn{pointer-events:none!important}.pt-cv-wrapper .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.pt-cv-wrapper .btn-default:focus,.pt-cv-wrapper .btn-default.focus{color:#333!important;background-color:#e6e6e6!important;border-color:#8c8c8c!important}.pt-cv-wrapper .btn-default:hover{color:#333!important;background-color:#e6e6e6!important;border-color:#adadad!important}.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{color:#333!important;background-color:#e6e6e6!important;border-color:#adadad!important}.pt-cv-wrapper .btn-default:active:hover,.pt-cv-wrapper .btn-default.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:hover,.pt-cv-wrapper .btn-default:active:focus,.pt-cv-wrapper .btn-default.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default:focus,.pt-cv-wrapper .btn-default:active.focus,.pt-cv-wrapper .btn-default.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-default.focus{color:#333!important;background-color:#d4d4d4!important;border-color:#8c8c8c!important}.pt-cv-wrapper .btn-default:active,.pt-cv-wrapper .btn-default.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-default{background-image:none!important}.pt-cv-wrapper .btn-default.disabled,.pt-cv-wrapper .btn-default[disabled],.pt-cv-wrapper fieldset[disabled] .btn-default,.pt-cv-wrapper .btn-default.disabled:hover,.pt-cv-wrapper .btn-default[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-default:hover,.pt-cv-wrapper .btn-default.disabled:focus,.pt-cv-wrapper .btn-default[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-default:focus,.pt-cv-wrapper .btn-default.disabled.focus,.pt-cv-wrapper .btn-default[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-default.focus,.pt-cv-wrapper .btn-default.disabled:active,.pt-cv-wrapper .btn-default[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-default:active,.pt-cv-wrapper .btn-default.disabled.active,.pt-cv-wrapper .btn-default[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-default.active{background-color:#fff!important;border-color:#ccc!important}.pt-cv-wrapper .btn-default .badge{color:#fff!important;background-color:#333!important}.pt-cv-wrapper .btn-primary{color:#fff!important;background-color:#337ab7!important;border-color:#2e6da4!important}.pt-cv-wrapper .btn-primary:focus,.pt-cv-wrapper .btn-primary.focus{color:#fff!important;background-color:#286090!important;border-color:#122b40!important}.pt-cv-wrapper .btn-primary:hover{color:#fff!important;background-color:#286090!important;border-color:#204d74!important}.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{color:#fff!important;background-color:#286090!important;border-color:#204d74!important}.pt-cv-wrapper .btn-primary:active:hover,.pt-cv-wrapper .btn-primary.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:hover,.pt-cv-wrapper .btn-primary:active:focus,.pt-cv-wrapper .btn-primary.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary:focus,.pt-cv-wrapper .btn-primary:active.focus,.pt-cv-wrapper .btn-primary.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary.focus{color:#fff!important;background-color:#204d74!important;border-color:#122b40!important}.pt-cv-wrapper .btn-primary:active,.pt-cv-wrapper .btn-primary.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-primary{background-image:none!important}.pt-cv-wrapper .btn-primary.disabled,.pt-cv-wrapper .btn-primary[disabled],.pt-cv-wrapper fieldset[disabled] .btn-primary,.pt-cv-wrapper .btn-primary.disabled:hover,.pt-cv-wrapper .btn-primary[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-primary:hover,.pt-cv-wrapper .btn-primary.disabled:focus,.pt-cv-wrapper .btn-primary[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-primary:focus,.pt-cv-wrapper .btn-primary.disabled.focus,.pt-cv-wrapper .btn-primary[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-primary.focus,.pt-cv-wrapper .btn-primary.disabled:active,.pt-cv-wrapper .btn-primary[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-primary:active,.pt-cv-wrapper .btn-primary.disabled.active,.pt-cv-wrapper .btn-primary[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-primary.active{background-color:#337ab7!important;border-color:#2e6da4!important}.pt-cv-wrapper .btn-primary .badge{color:#337ab7!important;background-color:#fff!important}.pt-cv-wrapper .btn-success{color:#fff!important;background-color:#5cb85c!important;border-color:#4cae4c!important}.pt-cv-wrapper .btn-success:focus,.pt-cv-wrapper .btn-success.focus{color:#fff!important;background-color:#449d44!important;border-color:#255625!important}.pt-cv-wrapper .btn-success:hover{color:#fff!important;background-color:#449d44!important;border-color:#398439!important}.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{color:#fff!important;background-color:#449d44!important;border-color:#398439!important}.pt-cv-wrapper .btn-success:active:hover,.pt-cv-wrapper .btn-success.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:hover,.pt-cv-wrapper .btn-success:active:focus,.pt-cv-wrapper .btn-success.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success:focus,.pt-cv-wrapper .btn-success:active.focus,.pt-cv-wrapper .btn-success.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-success.focus{color:#fff!important;background-color:#398439!important;border-color:#255625!important}.pt-cv-wrapper .btn-success:active,.pt-cv-wrapper .btn-success.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-success{background-image:none!important}.pt-cv-wrapper .btn-success.disabled,.pt-cv-wrapper .btn-success[disabled],.pt-cv-wrapper fieldset[disabled] .btn-success,.pt-cv-wrapper .btn-success.disabled:hover,.pt-cv-wrapper .btn-success[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-success:hover,.pt-cv-wrapper .btn-success.disabled:focus,.pt-cv-wrapper .btn-success[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-success:focus,.pt-cv-wrapper .btn-success.disabled.focus,.pt-cv-wrapper .btn-success[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-success.focus,.pt-cv-wrapper .btn-success.disabled:active,.pt-cv-wrapper .btn-success[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-success:active,.pt-cv-wrapper .btn-success.disabled.active,.pt-cv-wrapper .btn-success[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-success.active{background-color:#5cb85c!important;border-color:#4cae4c!important}.pt-cv-wrapper .btn-success .badge{color:#5cb85c!important;background-color:#fff!important}.pt-cv-wrapper .btn-info{color:#fff!important;background-color:#5bc0de!important;border-color:#46b8da!important}.pt-cv-wrapper .btn-info:focus,.pt-cv-wrapper .btn-info.focus{color:#fff!important;background-color:#31b0d5!important;border-color:#1b6d85!important}.pt-cv-wrapper .btn-info:hover{color:#fff!important;background-color:#31b0d5!important;border-color:#269abc!important}.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{color:#fff!important;background-color:#31b0d5!important;border-color:#269abc!important}.pt-cv-wrapper .btn-info:active:hover,.pt-cv-wrapper .btn-info.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:hover,.pt-cv-wrapper .btn-info:active:focus,.pt-cv-wrapper .btn-info.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info:focus,.pt-cv-wrapper .btn-info:active.focus,.pt-cv-wrapper .btn-info.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-info.focus{color:#fff!important;background-color:#269abc!important;border-color:#1b6d85!important}.pt-cv-wrapper .btn-info:active,.pt-cv-wrapper .btn-info.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-info{background-image:none!important}.pt-cv-wrapper .btn-info.disabled,.pt-cv-wrapper .btn-info[disabled],.pt-cv-wrapper fieldset[disabled] .btn-info,.pt-cv-wrapper .btn-info.disabled:hover,.pt-cv-wrapper .btn-info[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-info:hover,.pt-cv-wrapper .btn-info.disabled:focus,.pt-cv-wrapper .btn-info[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-info:focus,.pt-cv-wrapper .btn-info.disabled.focus,.pt-cv-wrapper .btn-info[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-info.focus,.pt-cv-wrapper .btn-info.disabled:active,.pt-cv-wrapper .btn-info[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-info:active,.pt-cv-wrapper .btn-info.disabled.active,.pt-cv-wrapper .btn-info[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-info.active{background-color:#5bc0de!important;border-color:#46b8da!important}.pt-cv-wrapper .btn-info .badge{color:#5bc0de!important;background-color:#fff!important}.pt-cv-wrapper .btn-warning{color:#fff!important;background-color:#f0ad4e!important;border-color:#eea236!important}.pt-cv-wrapper .btn-warning:focus,.pt-cv-wrapper .btn-warning.focus{color:#fff!important;background-color:#ec971f!important;border-color:#985f0d!important}.pt-cv-wrapper .btn-warning:hover{color:#fff!important;background-color:#ec971f!important;border-color:#d58512!important}.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{color:#fff!important;background-color:#ec971f!important;border-color:#d58512!important}.pt-cv-wrapper .btn-warning:active:hover,.pt-cv-wrapper .btn-warning.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:hover,.pt-cv-wrapper .btn-warning:active:focus,.pt-cv-wrapper .btn-warning.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning:focus,.pt-cv-wrapper .btn-warning:active.focus,.pt-cv-wrapper .btn-warning.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning.focus{color:#fff!important;background-color:#d58512!important;border-color:#985f0d!important}.pt-cv-wrapper .btn-warning:active,.pt-cv-wrapper .btn-warning.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-warning{background-image:none!important}.pt-cv-wrapper .btn-warning.disabled,.pt-cv-wrapper .btn-warning[disabled],.pt-cv-wrapper fieldset[disabled] .btn-warning,.pt-cv-wrapper .btn-warning.disabled:hover,.pt-cv-wrapper .btn-warning[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-warning:hover,.pt-cv-wrapper .btn-warning.disabled:focus,.pt-cv-wrapper .btn-warning[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-warning:focus,.pt-cv-wrapper .btn-warning.disabled.focus,.pt-cv-wrapper .btn-warning[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-warning.focus,.pt-cv-wrapper .btn-warning.disabled:active,.pt-cv-wrapper .btn-warning[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-warning:active,.pt-cv-wrapper .btn-warning.disabled.active,.pt-cv-wrapper .btn-warning[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-warning.active{background-color:#f0ad4e!important;border-color:#eea236!important}.pt-cv-wrapper .btn-warning .badge{color:#f0ad4e!important;background-color:#fff!important}.pt-cv-wrapper .btn-danger{color:#fff!important;background-color:#d9534f!important;border-color:#d43f3a!important}.pt-cv-wrapper .btn-danger:focus,.pt-cv-wrapper .btn-danger.focus{color:#fff!important;background-color:#c9302c!important;border-color:#761c19!important}.pt-cv-wrapper .btn-danger:hover{color:#fff!important;background-color:#c9302c!important;border-color:#ac2925!important}.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{color:#fff!important;background-color:#c9302c!important;border-color:#ac2925!important}.pt-cv-wrapper .btn-danger:active:hover,.pt-cv-wrapper .btn-danger.active:hover,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:hover,.pt-cv-wrapper .btn-danger:active:focus,.pt-cv-wrapper .btn-danger.active:focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger:focus,.pt-cv-wrapper .btn-danger:active.focus,.pt-cv-wrapper .btn-danger.active.focus,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger.focus{color:#fff!important;background-color:#ac2925!important;border-color:#761c19!important}.pt-cv-wrapper .btn-danger:active,.pt-cv-wrapper .btn-danger.active,.pt-cv-wrapper .open>.dropdown-toggle.btn-danger{background-image:none!important}.pt-cv-wrapper .btn-danger.disabled,.pt-cv-wrapper .btn-danger[disabled],.pt-cv-wrapper fieldset[disabled] .btn-danger,.pt-cv-wrapper .btn-danger.disabled:hover,.pt-cv-wrapper .btn-danger[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-danger:hover,.pt-cv-wrapper .btn-danger.disabled:focus,.pt-cv-wrapper .btn-danger[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-danger:focus,.pt-cv-wrapper .btn-danger.disabled.focus,.pt-cv-wrapper .btn-danger[disabled].focus,.pt-cv-wrapper fieldset[disabled] .btn-danger.focus,.pt-cv-wrapper .btn-danger.disabled:active,.pt-cv-wrapper .btn-danger[disabled]:active,.pt-cv-wrapper fieldset[disabled] .btn-danger:active,.pt-cv-wrapper .btn-danger.disabled.active,.pt-cv-wrapper .btn-danger[disabled].active,.pt-cv-wrapper fieldset[disabled] .btn-danger.active{background-color:#d9534f!important;border-color:#d43f3a!important}.pt-cv-wrapper .btn-danger .badge{color:#d9534f!important;background-color:#fff!important}.pt-cv-wrapper .btn-link{color:#337ab7!important;font-weight:normal!important;border-radius:0!important}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:active,.pt-cv-wrapper .btn-link.active,.pt-cv-wrapper .btn-link[disabled],.pt-cv-wrapper fieldset[disabled] .btn-link{background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper .btn-link,.pt-cv-wrapper .btn-link:hover,.pt-cv-wrapper .btn-link:focus,.pt-cv-wrapper .btn-link:active{border-color:transparent!important}.pt-cv-wrapper .btn-link:hover,.pt-cv-wrapper .btn-link:focus{color:#23527c!important;text-decoration:underline!important;background-color:transparent!important}.pt-cv-wrapper .btn-link[disabled]:hover,.pt-cv-wrapper fieldset[disabled] .btn-link:hover,.pt-cv-wrapper .btn-link[disabled]:focus,.pt-cv-wrapper fieldset[disabled] .btn-link:focus{color:#777!important;text-decoration:none!important}.pt-cv-wrapper .btn-lg,.pt-cv-wrapper .btn-group-lg>.btn{padding:10px 16px!important;font-size:18px!important;line-height:1.3333333!important;border-radius:6px!important}.pt-cv-wrapper .btn-sm,.pt-cv-wrapper .btn-group-sm>.btn{padding:5px 10px!important;font-size:12px!important;line-height:1.5!important;border-radius:3px!important}.pt-cv-wrapper .btn-xs,.pt-cv-wrapper .btn-group-xs>.btn{padding:1px 5px!important;font-size:12px!important;line-height:1.5!important;border-radius:3px!important}.pt-cv-wrapper .btn-block{display:block!important;width:100%!important}.pt-cv-wrapper .btn-block+.btn-block{margin-top:5px!important}.pt-cv-wrapper input[type="submit"].btn-block,.pt-cv-wrapper input[type="reset"].btn-block,.pt-cv-wrapper input[type="button"].btn-block{width:100%!important}.pt-cv-wrapper .fade{opacity:0!important;-webkit-transition:opacity .15s linear!important;-o-transition:opacity .15s linear!important;transition:opacity .15s linear!important}.pt-cv-wrapper .fade.in{opacity:1!important}.pt-cv-wrapper .collapse{display:none!important}.pt-cv-wrapper .collapse.in{display:block!important}.pt-cv-wrapper tr.collapse.in{display:table-row!important}.pt-cv-wrapper tbody.collapse.in{display:table-row-group!important}.pt-cv-wrapper .collapsing{position:relative!important;height:0!important;overflow:hidden!important;-webkit-transition-property:height,visibility!important;-o-transition-property:height,visibility!important;transition-property:height,visibility!important;-webkit-transition-duration:.35s!important;-o-transition-duration:.35s!important;transition-duration:.35s!important;-webkit-transition-timing-function:ease!important;-o-transition-timing-function:ease!important;transition-timing-function:ease!important}.pt-cv-wrapper .caret{display:inline-block!important;width:0!important;height:0!important;margin-left:2px!important;vertical-align:middle!important;border-top:4px dashed!important;border-top:4px solid \9!important;border-right:4px solid transparent!important;border-left:4px solid transparent!important}.pt-cv-wrapper .dropup,.pt-cv-wrapper .dropdown{position:relative!important}.pt-cv-wrapper .dropdown-toggle:focus{outline:0!important}.pt-cv-wrapper .dropdown-menu{position:absolute!important;top:100%!important;left:0!important;z-index:1000!important;display:none!important;float:left!important;min-width:160px!important;padding:5px 0!important;margin:2px 0 0!important;list-style:none!important;font-size:14px!important;text-align:left!important;background-color:#fff!important;border:1px solid #ccc!important;border:1px solid rgba(0,0,0,0.15)!important;border-radius:4px!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175)!important;box-shadow:0 6px 12px rgba(0,0,0,0.175)!important;-webkit-background-clip:padding-box!important;background-clip:padding-box!important}.pt-cv-wrapper .dropdown-menu.pull-right{right:0!important;left:auto!important}.pt-cv-wrapper .dropdown-menu .divider{height:1px!important;margin:9px 0!important;overflow:hidden!important;background-color:#e5e5e5!important}.pt-cv-wrapper .dropdown-menu>li>a{display:block!important;padding:3px 20px!important;clear:both!important;font-weight:normal!important;line-height:1.42857143!important;color:#333!important;white-space:nowrap!important}.pt-cv-wrapper .dropdown-menu>li>a:hover,.pt-cv-wrapper .dropdown-menu>li>a:focus{text-decoration:none!important;color:#262626!important;background-color:#f5f5f5!important}.pt-cv-wrapper .dropdown-menu>.active>a,.pt-cv-wrapper .dropdown-menu>.active>a:hover,.pt-cv-wrapper .dropdown-menu>.active>a:focus{color:#fff!important;text-decoration:none!important;outline:0!important;background-color:#337ab7!important}.pt-cv-wrapper .dropdown-menu>.disabled>a,.pt-cv-wrapper .dropdown-menu>.disabled>a:hover,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus{color:#777!important}.pt-cv-wrapper .dropdown-menu>.disabled>a:hover,.pt-cv-wrapper .dropdown-menu>.disabled>a:focus{text-decoration:none!important;background-color:transparent!important;background-image:none!important;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)!important;cursor:not-allowed!important}.pt-cv-wrapper .open>.dropdown-menu{display:block!important}.pt-cv-wrapper .open>a{outline:0!important}.pt-cv-wrapper .dropdown-menu-right{left:auto!important;right:0!important}.pt-cv-wrapper .dropdown-menu-left{left:0!important;right:auto!important}.pt-cv-wrapper .dropdown-header{display:block!important;padding:3px 20px!important;font-size:12px!important;line-height:1.42857143!important;color:#777!important;white-space:nowrap!important}.pt-cv-wrapper .dropdown-backdrop{position:fixed!important;left:0!important;right:0!important;bottom:0!important;top:0!important;z-index:990!important}.pt-cv-wrapper .pull-right>.dropdown-menu{right:0!important;left:auto!important}.pt-cv-wrapper .dropup .caret,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .caret{border-top:0!important;border-bottom:4px dashed!important;border-bottom:4px solid \9!important;content:""!important}.pt-cv-wrapper .dropup .dropdown-menu,.pt-cv-wrapper .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto!important;bottom:100%!important;margin-bottom:2px!important}@media(min-width:768px){.pt-cv-wrapper .navbar-right .dropdown-menu{left:auto!important;right:0!important}.pt-cv-wrapper .navbar-right .dropdown-menu-left{left:0!important;right:auto!important}}.pt-cv-wrapper .btn-group,.pt-cv-wrapper .btn-group-vertical{position:relative!important;display:inline-block!important;vertical-align:middle!important}.pt-cv-wrapper .btn-group>.btn,.pt-cv-wrapper .btn-group-vertical>.btn{position:relative!important;float:left!important}.pt-cv-wrapper .btn-group>.btn:hover,.pt-cv-wrapper .btn-group-vertical>.btn:hover,.pt-cv-wrapper .btn-group>.btn:focus,.pt-cv-wrapper .btn-group-vertical>.btn:focus,.pt-cv-wrapper .btn-group>.btn:active,.pt-cv-wrapper .btn-group-vertical>.btn:active,.pt-cv-wrapper .btn-group>.btn.active,.pt-cv-wrapper .btn-group-vertical>.btn.active{z-index:2!important}.pt-cv-wrapper .btn-group .btn+.btn,.pt-cv-wrapper .btn-group .btn+.btn-group,.pt-cv-wrapper .btn-group .btn-group+.btn,.pt-cv-wrapper .btn-group .btn-group+.btn-group{margin-left:-1px!important}.pt-cv-wrapper .btn-toolbar{margin-left:-5px!important}.pt-cv-wrapper .btn-toolbar .btn,.pt-cv-wrapper .btn-toolbar .btn-group,.pt-cv-wrapper .btn-toolbar .input-group{float:left!important}.pt-cv-wrapper .btn-toolbar>.btn,.pt-cv-wrapper .btn-toolbar>.btn-group,.pt-cv-wrapper .btn-toolbar>.input-group{margin-left:5px!important}.pt-cv-wrapper .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0!important}.pt-cv-wrapper .btn-group>.btn:first-child{margin-left:0!important}.pt-cv-wrapper .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0!important;border-top-right-radius:0!important}.pt-cv-wrapper .btn-group>.btn:last-child:not(:first-child),.pt-cv-wrapper .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group{float:left!important}.pt-cv-wrapper .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.pt-cv-wrapper .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group .dropdown-toggle:active,.pt-cv-wrapper .btn-group.open .dropdown-toggle{outline:0!important}.pt-cv-wrapper .btn-group>.btn+.dropdown-toggle{padding-left:8px!important;padding-right:8px!important}.pt-cv-wrapper .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px!important;padding-right:12px!important}.pt-cv-wrapper .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)!important}.pt-cv-wrapper .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none!important;box-shadow:none!important}.pt-cv-wrapper .btn .caret{margin-left:0!important}.pt-cv-wrapper .btn-lg .caret{border-width:5px 5px 0!important;border-bottom-width:0!important}.pt-cv-wrapper .dropup .btn-lg .caret{border-width:0 5px 5px!important}.pt-cv-wrapper .btn-group-vertical>.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{display:block!important;float:none!important;width:100%!important;max-width:100%!important}.pt-cv-wrapper .btn-group-vertical>.btn-group>.btn{float:none!important}.pt-cv-wrapper .btn-group-vertical>.btn+.btn,.pt-cv-wrapper .btn-group-vertical>.btn+.btn-group,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn,.pt-cv-wrapper .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px!important;margin-left:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px!important;border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px!important;border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.pt-cv-wrapper .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pt-cv-wrapper .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .btn-group-justified{display:table!important;width:100%!important;table-layout:fixed!important;border-collapse:separate!important}.pt-cv-wrapper .btn-group-justified>.btn,.pt-cv-wrapper .btn-group-justified>.btn-group{float:none!important;display:table-cell!important;width:1%!important}.pt-cv-wrapper .btn-group-justified>.btn-group .btn{width:100%!important}.pt-cv-wrapper .btn-group-justified>.btn-group .dropdown-menu{left:auto!important}.pt-cv-wrapper [data-toggle="buttons"]>.btn input[type="radio"],.pt-cv-wrapper [data-toggle="buttons"]>.btn-group>.btn input[type="radio"],.pt-cv-wrapper [data-toggle="buttons"]>.btn input[type="checkbox"],.pt-cv-wrapper [data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute!important;clip:rect(0,0,0,0)!important;pointer-events:none!important}.pt-cv-wrapper .nav{margin-bottom:0!important;padding-left:0!important;list-style:none!important}.pt-cv-wrapper .nav>li{position:relative!important;display:block!important}.pt-cv-wrapper .nav>li>a{position:relative!important;display:block!important;padding:10px 15px!important}.pt-cv-wrapper .nav>li>a:hover,.pt-cv-wrapper .nav>li>a:focus{text-decoration:none!important;background-color:#eee!important}.pt-cv-wrapper .nav>li.disabled>a{color:#777!important}.pt-cv-wrapper .nav>li.disabled>a:hover,.pt-cv-wrapper .nav>li.disabled>a:focus{color:#777!important;text-decoration:none!important;background-color:transparent!important;cursor:not-allowed!important}.pt-cv-wrapper .nav .open>a,.pt-cv-wrapper .nav .open>a:hover,.pt-cv-wrapper .nav .open>a:focus{background-color:#eee!important;border-color:#337ab7!important}.pt-cv-wrapper .nav .nav-divider{height:1px!important;margin:9px 0!important;overflow:hidden!important;background-color:#e5e5e5!important}.pt-cv-wrapper .nav>li>a>img{max-width:none!important}.pt-cv-wrapper .nav-tabs{border-bottom:1px solid #ddd!important}.pt-cv-wrapper .nav-tabs>li{float:left!important;margin-bottom:-1px!important}.pt-cv-wrapper .nav-tabs>li>a{margin-right:2px!important;line-height:1.42857143!important;border:1px solid transparent!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs>li>a:hover{border-color:#eee #eee #ddd!important}.pt-cv-wrapper .nav-tabs>li.active>a,.pt-cv-wrapper .nav-tabs>li.active>a:hover,.pt-cv-wrapper .nav-tabs>li.active>a:focus{color:#555!important;background-color:#fff!important;border:1px solid #ddd!important;border-bottom-color:transparent!important;cursor:default!important}.pt-cv-wrapper .nav-tabs.nav-justified{width:100%!important;border-bottom:0!important}.pt-cv-wrapper .nav-tabs.nav-justified>li{float:none!important}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{text-align:center!important;margin-bottom:5px!important}.pt-cv-wrapper .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto!important;left:auto!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li{display:table-cell!important;width:1%!important}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-bottom:0!important}}.pt-cv-wrapper .nav-tabs.nav-justified>li>a{margin-right:0!important;border-radius:4px!important}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs.nav-justified>.active>a,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff!important}}.pt-cv-wrapper .nav-pills>li{float:left!important}.pt-cv-wrapper .nav-pills>li>a{border-radius:4px!important}.pt-cv-wrapper .nav-pills>li+li{margin-left:2px!important}.pt-cv-wrapper .nav-pills>li.active>a,.pt-cv-wrapper .nav-pills>li.active>a:hover,.pt-cv-wrapper .nav-pills>li.active>a:focus{color:#fff!important;background-color:#337ab7!important}.pt-cv-wrapper .nav-stacked>li{float:none!important}.pt-cv-wrapper .nav-stacked>li+li{margin-top:2px!important;margin-left:0!important}.pt-cv-wrapper .nav-justified{width:100%!important}.pt-cv-wrapper .nav-justified>li{float:none!important}.pt-cv-wrapper .nav-justified>li>a{text-align:center!important;margin-bottom:5px!important}.pt-cv-wrapper .nav-justified>.dropdown .dropdown-menu{top:auto!important;left:auto!important}@media(min-width:768px){.pt-cv-wrapper .nav-justified>li{display:table-cell!important;width:1%!important}.pt-cv-wrapper .nav-justified>li>a{margin-bottom:0!important}}.pt-cv-wrapper .nav-tabs-justified{border-bottom:0!important}.pt-cv-wrapper .nav-tabs-justified>li>a{margin-right:0!important;border-radius:4px!important}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus{border:1px solid #ddd!important}@media(min-width:768px){.pt-cv-wrapper .nav-tabs-justified>li>a{border-bottom:1px solid #ddd!important;border-radius:4px 4px 0 0!important}.pt-cv-wrapper .nav-tabs-justified>.active>a,.pt-cv-wrapper .nav-tabs-justified>.active>a:hover,.pt-cv-wrapper .nav-tabs-justified>.active>a:focus{border-bottom-color:#fff!important}}.pt-cv-wrapper .tab-content>.tab-pane{display:none!important}.pt-cv-wrapper .tab-content>.active{display:block!important}.pt-cv-wrapper .nav-tabs .dropdown-menu{margin-top:-1px!important;border-top-right-radius:0!important;border-top-left-radius:0!important}.pt-cv-wrapper .pagination{display:inline-block!important;padding-left:0!important;margin:20px 0!important;border-radius:4px!important}.pt-cv-wrapper .pagination>li{display:inline!important}.pt-cv-wrapper .pagination>li>a,.pt-cv-wrapper .pagination>li>span{position:relative!important;float:left!important;padding:6px 12px!important;line-height:1.42857143!important;text-decoration:none!important;color:#337ab7!important;background-color:#fff!important;border:1px solid #ddd!important;margin-left:-1px!important}.pt-cv-wrapper .pagination>li:first-child>a,.pt-cv-wrapper .pagination>li:first-child>span{margin-left:0!important;border-bottom-left-radius:4px!important;border-top-left-radius:4px!important}.pt-cv-wrapper .pagination>li:last-child>a,.pt-cv-wrapper .pagination>li:last-child>span{border-bottom-right-radius:4px!important;border-top-right-radius:4px!important}.pt-cv-wrapper .pagination>li>a:hover,.pt-cv-wrapper .pagination>li>span:hover,.pt-cv-wrapper .pagination>li>a:focus,.pt-cv-wrapper .pagination>li>span:focus{z-index:3!important;color:#23527c!important;background-color:#eee!important;border-color:#ddd!important}.pt-cv-wrapper .pagination>.active>a,.pt-cv-wrapper .pagination>.active>span,.pt-cv-wrapper .pagination>.active>a:hover,.pt-cv-wrapper .pagination>.active>span:hover,.pt-cv-wrapper .pagination>.active>a:focus,.pt-cv-wrapper .pagination>.active>span:focus{z-index:2!important;color:#fff!important;background-color:#337ab7!important;border-color:#337ab7!important;cursor:default!important}.pt-cv-wrapper .pagination>.disabled>span,.pt-cv-wrapper .pagination>.disabled>span:hover,.pt-cv-wrapper .pagination>.disabled>span:focus,.pt-cv-wrapper .pagination>.disabled>a,.pt-cv-wrapper .pagination>.disabled>a:hover,.pt-cv-wrapper .pagination>.disabled>a:focus{color:#777!important;background-color:#fff!important;border-color:#ddd!important;cursor:not-allowed!important}.pt-cv-wrapper .pagination-lg>li>a,.pt-cv-wrapper .pagination-lg>li>span{padding:10px 16px!important;font-size:18px!important;line-height:1.3333333!important}.pt-cv-wrapper .pagination-lg>li:first-child>a,.pt-cv-wrapper .pagination-lg>li:first-child>span{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}.pt-cv-wrapper .pagination-lg>li:last-child>a,.pt-cv-wrapper .pagination-lg>li:last-child>span{border-bottom-right-radius:6px!important;border-top-right-radius:6px!important}.pt-cv-wrapper .pagination-sm>li>a,.pt-cv-wrapper .pagination-sm>li>span{padding:5px 10px!important;font-size:12px!important;line-height:1.5!important}.pt-cv-wrapper .pagination-sm>li:first-child>a,.pt-cv-wrapper .pagination-sm>li:first-child>span{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.pt-cv-wrapper .pagination-sm>li:last-child>a,.pt-cv-wrapper .pagination-sm>li:last-child>span{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.pt-cv-wrapper .thumbnail{display:block!important;padding:4px!important;margin-bottom:20px!important;line-height:1.42857143!important;background-color:#fff!important;border:1px solid #ddd!important;border-radius:4px!important;-webkit-transition:border .2s ease-in-out!important;-o-transition:border .2s ease-in-out!important;transition:border .2s ease-in-out!important}.pt-cv-wrapper .thumbnail>img,.pt-cv-wrapper .thumbnail a>img{margin-left:auto!important;margin-right:auto!important}.pt-cv-wrapper a.thumbnail:hover,.pt-cv-wrapper a.thumbnail:focus,.pt-cv-wrapper a.thumbnail.active{border-color:#337ab7!important}.pt-cv-wrapper .thumbnail .caption{padding:9px!important;color:#333!important}.pt-cv-wrapper .pt-cv-carousel{position:relative!important}.pt-cv-wrapper .carousel-inner{position:relative!important;overflow:hidden!important;width:100%!important}.pt-cv-wrapper .carousel-inner>.item{display:none!important;position:relative!important;-webkit-transition:.6s ease-in-out left!important;-o-transition:.6s ease-in-out left!important;transition:.6s ease-in-out left!important}.pt-cv-wrapper .carousel-inner>.item>img,.pt-cv-wrapper .carousel-inner>.item>a>img{line-height:1!important}@media all and (transform-3d),(-webkit-transform-3d){.pt-cv-wrapper .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out!important;-o-transition:-o-transform .6s ease-in-out!important;transition:transform .6s ease-in-out!important;-webkit-backface-visibility:hidden!important;backface-visibility:hidden!important;-webkit-perspective:1000px!important;perspective:1000px!important}.pt-cv-wrapper .carousel-inner>.item.next,.pt-cv-wrapper .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0)!important;transform:translate3d(100%,0,0)!important;left:0!important}.pt-cv-wrapper .carousel-inner>.item.prev,.pt-cv-wrapper .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important;left:0!important}.pt-cv-wrapper .carousel-inner>.item.next.left,.pt-cv-wrapper .carousel-inner>.item.prev.right,.pt-cv-wrapper .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important;left:0!important}}.pt-cv-wrapper .carousel-inner>.active,.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{display:block!important}.pt-cv-wrapper .carousel-inner>.active{left:0!important}.pt-cv-wrapper .carousel-inner>.next,.pt-cv-wrapper .carousel-inner>.prev{position:absolute!important;top:0!important;width:100%!important}.pt-cv-wrapper .carousel-inner>.next{left:100%!important}.pt-cv-wrapper .carousel-inner>.prev{left:-100%!important}.pt-cv-wrapper .carousel-inner>.next.left,.pt-cv-wrapper .carousel-inner>.prev.right{left:0!important}.pt-cv-wrapper .carousel-inner>.active.left{left:-100%!important}.pt-cv-wrapper .carousel-inner>.active.right{left:100%!important}.pt-cv-wrapper .carousel-control{position:absolute!important;top:0!important;left:0!important;bottom:0!important;width:15%!important;opacity:.5!important;filter:alpha(opacity=50)!important;font-size:20px!important;color:#fff!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,0.6)!important}.pt-cv-wrapper .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-image:-o-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)))!important;background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%)!important;background-repeat:repeat-x!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)!important}.pt-cv-wrapper .carousel-control.right{left:auto!important;right:0!important;background-image:-webkit-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-image:-o-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)))!important;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%)!important;background-repeat:repeat-x!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)!important}.pt-cv-wrapper .carousel-control:hover,.pt-cv-wrapper .carousel-control:focus{outline:0!important;color:#fff!important;text-decoration:none!important;opacity:.9!important;filter:alpha(opacity=90)!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right{position:absolute!important;top:50%!important;margin-top:-10px!important;z-index:5!important;display:inline-block!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .glyphicon-chevron-left{left:50%!important;margin-left:-10px!important}.pt-cv-wrapper .carousel-control .icon-next,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right{right:50%!important;margin-right:-10px!important}.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next{width:20px!important;height:20px!important;line-height:1!important;font-family:serif!important}.pt-cv-wrapper .carousel-control .icon-prev:before{content:'\2039'!important}.pt-cv-wrapper .carousel-control .icon-next:before{content:'\203a'!important}.pt-cv-wrapper .pt-cv-carousel-indicators{position:absolute!important;bottom:10px!important;left:50%!important;z-index:15!important;width:60%!important;margin-left:-30%!important;padding-left:0!important;list-style:none!important;text-align:center!important}.pt-cv-wrapper .pt-cv-carousel-indicators li{display:inline-block!important;width:10px!important;height:10px!important;margin:1px!important;text-indent:-999px!important;border:1px solid #fff!important;border-radius:10px!important;cursor:pointer!important;background-color:#000 \9!important;background-color:rgba(0,0,0,0)!important}.pt-cv-wrapper .pt-cv-carousel-indicators .active{margin:0!important;width:12px!important;height:12px!important;background-color:#fff!important}.pt-cv-wrapper .pt-cv-carousel-caption{position:absolute!important;left:15%!important;right:15%!important;bottom:20px!important;z-index:10!important;padding-top:20px!important;padding-bottom:20px!important;color:#fff!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,0.6)!important}.pt-cv-wrapper .pt-cv-carousel-caption .btn{text-shadow:none!important}@media screen and (min-width:768px){.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-prev,.pt-cv-wrapper .carousel-control .icon-next{width:30px!important;height:30px!important;margin-top:-15px!important;font-size:30px!important}.pt-cv-wrapper .carousel-control .glyphicon-chevron-left,.pt-cv-wrapper .carousel-control .icon-prev{margin-left:-15px!important}.pt-cv-wrapper .carousel-control .glyphicon-chevron-right,.pt-cv-wrapper .carousel-control .icon-next{margin-right:-15px!important}.pt-cv-wrapper .pt-cv-carousel-caption{left:20%!important;right:20%!important;padding-bottom:30px!important}.pt-cv-wrapper .pt-cv-carousel-indicators{bottom:20px!important}}.pt-cv-wrapper .clearfix:before,.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container:before,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container-fluid:before,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .row:before,.pt-cv-wrapper .row:after,.pt-cv-wrapper .btn-toolbar:before,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:before,.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .nav:before,.pt-cv-wrapper .nav:after{content:" "!important;display:table!important}.pt-cv-wrapper .clearfix:after,.pt-cv-wrapper .container:after,.pt-cv-wrapper .container-fluid:after,.pt-cv-wrapper .row:after,.pt-cv-wrapper .btn-toolbar:after,.pt-cv-wrapper .btn-group-vertical>.btn-group:after,.pt-cv-wrapper .nav:after{clear:both!important}.pt-cv-wrapper .center-block{display:block!important;margin-left:auto!important;margin-right:auto!important}.pt-cv-wrapper .pull-right{float:right!important}.pt-cv-wrapper .pull-left{float:left!important}.pt-cv-wrapper .hide{display:none!important}.pt-cv-wrapper .show{display:block!important}.pt-cv-wrapper .invisible{visibility:hidden!important}.pt-cv-wrapper .text-hide{font:0/0 a!important;color:transparent!important;text-shadow:none!important;background-color:transparent!important;border:0!important}.pt-cv-wrapper .hidden{display:none!important}.pt-cv-wrapper .affix{position:fixed!important}.pt-cv-wrapper .text-left{text-align:left!important}.pt-cv-wrapper .text-right{text-align:right!important}.pt-cv-wrapper .text-center{text-align:center!important}.pt-cv-wrapper .text-justify{text-align:justify!important}.pt-cv-wrapper .text-nowrap{white-space:nowrap!important}.pt-cv-wrapper .text-lowercase{text-transform:lowercase!important}.pt-cv-wrapper .text-uppercase{text-transform:uppercase!important}.pt-cv-wrapper .text-capitalize{text-transform:capitalize!important}.pt-cv-wrapper .text-muted{color:#777!important}.pt-cv-wrapper .text-primary{color:#428bca!important}.pt-cv-wrapper .h1,.pt-cv-wrapper .h2,.pt-cv-wrapper .h3,.pt-cv-wrapper .h4,.pt-cv-wrapper .h5,.pt-cv-wrapper .h6,.pt-cv-wrapper h1,.pt-cv-wrapper h2,.pt-cv-wrapper h3,.pt-cv-wrapper h4,.pt-cv-wrapper h5,.pt-cv-wrapper h6{font-family:inherit!important;font-weight:500!important;line-height:1.1!important;color:inherit!important}.pt-cv-view *,.pt-cv-view *:before,.pt-cv-view *:after{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.pt-cv-view{position:relative!important;clear:both!important}.pt-cv-view:after{clear:both!important;content:''!important;display:block!important}.pt-cv-page{position:relative!important}.pt-cv-gls-group{clear:left!important}.pt-cv-view strong,.pt-cv-view strong *{font-weight:600!important}.pt-cv-colsys{margin-left:-15px!important;margin-right:-15px!important}@media(min-width:992px){.pt-cv-colsys [data-cvc="2"] .col-md-6:nth-child(2n+1),.pt-cv-colsys [data-cvc="3"] .col-md-4:nth-child(3n+1),.pt-cv-colsys [data-cvc="4"] .col-md-3:nth-child(4n+1),.pt-cv-colsys [data-cvc="5"] .col-md-2:nth-child(5n+1),.pt-cv-colsys [data-cvc="6"] .col-md-2:nth-child(6n+1),.pt-cv-colsys [data-cvc="7"] .col-md-1:nth-child(7n+1),.pt-cv-colsys [data-cvc="8"] .col-md-1:nth-child(8n+1),.pt-cv-colsys [data-cvc="9"] .col-md-1:nth-child(9n+1),.pt-cv-colsys [data-cvc="10"] .col-md-1:nth-child(10n+1),.pt-cv-colsys [data-cvc="11"] .col-md-1:nth-child(11n+1),.pt-cv-colsys [data-cvc="12"] .col-md-1:nth-child(12n+1){clear:left!important}}@media(min-width:768px) and (max-width:991px){.pt-cv-colsys .col-sm-6:nth-child(2n+1),.pt-cv-colsys .col-sm-4:nth-child(3n+1),.pt-cv-colsys .col-sm-3:nth-child(4n+1),.pt-cv-colsys .col-sm-2:nth-child(5n+1),.pt-cv-colsys .col-sm-2:nth-child(6n+1){clear:left!important}}@media(max-width:767px){.pt-cv-colsys .col-xs-6:nth-child(2n+1),.pt-cv-colsys .col-xs-4:nth-child(3n+1),.pt-cv-colsys .col-xs-3:nth-child(4n+1),.pt-cv-colsys .col-xs-2:nth-child(5n+1),.pt-cv-colsys .col-xs-2:nth-child(6n+1){clear:left!important}}@media(min-width:992px){.pt-cv-colsys [data-cvc="5"] .pt-cv-content-item{width:20%!important}.pt-cv-colsys [data-cvc="7"] .pt-cv-content-item{width:14.28571428%!important}.pt-cv-colsys [data-cvc="8"] .pt-cv-content-item{width:12.5%!important}.pt-cv-colsys [data-cvc="9"] .pt-cv-content-item{width:11.11111111%!important}.pt-cv-colsys [data-cvc="10"] .pt-cv-content-item{width:10%!important}.pt-cv-colsys [data-cvc="11"] .pt-cv-content-item{width:9.09090909%!important}}.pt-cv-colsys .pt-cv-content-item{flex:none!important;max-width:initial!important}.pt-cv-view a,.pt-cv-wrapper .btn{text-decoration:none!important;outline:0!important;font-style:normal!important}.pt-cv-view a{pointer-events:auto!important}.pt-cv-readmore{color:#fff!important;margin:10px 0!important;max-width:100%!important}.pt-cv-content-item{padding-bottom:15px!important;position:relative!important;overflow:hidden!important}.pt-cv-view .pt-cv-content-item>*{margin-bottom:10px!important}.pt-cv-ifield>*{margin-bottom:10px!important}.pt-cv-collapsible .pt-cv-content-item>*{margin-bottom:0!important}.pt-cv-title{margin-top:0!important}h4.pt-cv-title{font-size:18px!important}.pt-cv-view .pt-cv-title{margin-bottom:10px!important}.pt-cv-title a{font-weight:600!important}.pt-cv-thumbnail{height:auto!important;max-width:100%!important;margin-top:0!important;margin-bottom:10px!important;min-width:inherit!important}.pt-cv-thumbnail.pull-left{margin-right:15px!important}.pt-cv-thumbnail.pull-right{margin-left:15px!important}.pt-cv-no-image{min-width:80px!important;min-height:80px!important}.pt-cv-content,.pt-cv-content *{font-weight:400!important}.pt-cv-meta-fields{font-size:13px!important;margin-top:0!important}.pt-cv-meta-fields a{color:#41b7d8!important}.pt-cv-pagination-wrapper{margin:20px 0!important}.pt-cv-view+.pagination{float:left!important;margin:0 auto!important}.pt-cv-view+.pagination>li{background:none!important}.pt-cv-view+.pagination>li>a{cursor:pointer!important}.pt-cv-spinner{width:15px!important;height:15px!important;margin-top:-25px!important;display:inline-block!important;opacity:0!important;filter:alpha(opacity=0)!important;color:#0470ec!important;-webkit-transition:opacity .25s,width .25s!important;-moz-transition:opacity .25s,width .25s!important;-o-transition:opacity .25s,width .25s!important;transition:opacity .25s,width .25s!important}.pt-cv-spinner.active{opacity:1!important;filter:alpha(opacity=100)!important}.pt-cv-clear-pagination{margin-bottom:50px!important}.pt-cv-pagination-wrapper{clear:both!important;position:relative!important}.pt-cv-pagination-wrapper .pt-cv-pagination.pagination{-webkit-box-shadow:none!important;box-shadow:none!important;border:0!important;padding:0!important;margin:initial!important;min-height:initial!important;width:auto!important;display:inline-block!important}.pt-cv-pagination li{display:inline!important;background-image:none!important}.pt-cv-pagination li:before,.pt-cv-pagination li:after{content:none!important}.pt-cv-pagination a{cursor:pointer!important}.pt-cv-pagination li.active a{border-color:rgba(66,139,202,0.2)!important}.pt-cv-pagination li a[href="#"]{pointer-events:none!important}.pt-cv-collapsible .panel{display:block!important}.pt-cv-collapsible .panel-heading{padding:0!important}.pt-cv-collapsible .panel-heading a{display:block!important;padding:10px 15px!important}.pt-cv-collapsible .panel-body{padding:10px!important}.pt-cv-view .collapse{display:none!important;visibility:hidden!important}.pt-cv-view .collapse.in{display:block!important;visibility:visible!important;overflow:auto!important}.pt-cv-collapsible .panel-heading br{display:none!important}.pt-cv-scrollable{margin-left:0!important;margin-right:0!important}.pt-cv-scrollable .pt-cv-carousel-caption{text-align:left!important;bottom:15px!important;padding:10px!important}.pt-cv-scrollable .pt-cv-carousel-caption *{text-shadow:none!important}.pt-cv-scrollable .pt-cv-title{padding-bottom:0!important}.pt-cv-scrollable .pt-cv-carousel-caption{margin-bottom:10px!important}.pt-cv-scrollable .pt-cv-thumbnail{width:100%!important}.pt-cv-carousel-caption:empty{display:none!important}.pt-cv-scrollable .pt-cv-carousel .item{height:auto!important;margin:auto!important;min-height:0!important;max-height:none!important;line-height:normal!important}.pt-cv-scrollable .pt-cv-cap-w-img{background:rgba(0,0,0,0.6)!important;text-shadow:0 1px 1px #000!important;left:15px!important;right:15px!important}.pt-cv-cap-w-img *{color:#fff!important}.pt-cv-cap-w-img .pt-cv-title a{color:#fff!important}.pt-cv-scrollable .pt-cv-cap-wo-img{position:relative!important;bottom:0!important;left:0!important;right:0!important}.pt-cv-cap-wo-img *{color:#000!important}.pt-cv-cap-wo-img .pt-cv-readmore{color:#fff!important}.pt-cv-view .carousel-control{background-image:none!important;height:30px!important;width:40px!important;bottom:0!important;top:auto!important;color:#00a100!important;cursor:pointer!important}.pt-cv-view .pt-cv-carousel-indicators{bottom:0!important;margin-bottom:4px!important}.pt-cv-view .pt-cv-carousel-indicators li{background:#cecece!important;border:1px solid #cecece!important;margin:0 0!important}.pt-cv-view .pt-cv-carousel-indicators li.active{background:#428bca!important;border:1px solid #428bca!important}.pt-cv-2-col .pt-cv-title{clear:none!important}@media(min-width:480px){.pt-cv-2-col .pt-cv-colwrap{display:table!important;word-break:break-word!important}}@media(max-width:479px){.pt-cv-2-col .pt-cv-colwrap{clear:both!important}}.pt-cv-view .panel{margin-bottom:20px!important;background-color:#fff!important;border:1px solid transparent!important;border-radius:4px!important;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05)!important;box-shadow:0 1px 1px rgba(0,0,0,0.05)!important}.pt-cv-view .panel-default{border-color:#ddd!important;padding-bottom:0!important}.pt-cv-view .panel-default>.panel-heading{color:#333!important;background-color:#f5f5f5!important;border-color:#ddd!important}.pt-cv-pagination:after,.pt-cv-pagination:before{content:none!important}.pt-cv-wrapper [class*="pt-cv-"] a{box-shadow:none!important}.pt-cv-view p:empty{display:none!important}.pt-cv-view .pt-cv-ifield{margin-bottom:0!important}@media(max-width:480px){.pt-cv-nolf .pt-cv-2-col .pt-cv-thumbnail{float:none!important;margin:0!important}}@media print{.pt-cv-view a[href]:after{content:none!important}.pt-cv-view .collapse{display:block!important;height:auto!important;visibility:visible!important}}
public/assets/js/cv.js CHANGED
@@ -1,17 +1,17 @@
1
- /*! content-views 05-2019 */
2
- /*!
3
- * Bootstrap v3.4.1 (http://getbootstrap.com)
4
- * Copyright 2011-2019 Twitter, Inc.
5
- * Licensed under the MIT license
6
- */
7
- if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.cvslide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".pt-cv-carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.4.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("pt-cv-slide")?(f.addClass(b),"object"==typeof f&&f.length&&f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;d||(a.fn.carousel=b,a.fn.carousel.Constructor=c),a.fn.cvcarousel=b,a.fn.cvcarousel.Constructor=c;var e=function(c){var d=a(this),e=d.attr("href");e&&(e=e.replace(/.*(?=#[^\s]+$)/,""));var f=d.attr("data-target")||e,g=a(document).find(f);if(g.hasClass("pt-cv-carousel")){var h=a.extend({},g.data(),d.data()),i=d.attr("data-cvslide-to");i&&(h.interval=!1),b.call(g,h),i&&g.data("bs.carousel").to(i),c.preventDefault()}};a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.carousel.data-api","[data-cvslide]",e).on("click.bs.carousel.data-api","[data-cvslide-to]",e)}),a(window).on("load",function(){a('[data-ride="cvcarousel"]',".pt-cv-wrapper").each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(document).find(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="cvcollapse"][href="#'+b.id+'"],[data-toggle="cvcollapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.4.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){!window.cv_collapse_ignore_others&&e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle="cvcollapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;e||(a.fn.collapse=c,a.fn.collapse.Constructor=d),a.fn.cvcollapse=c,a.fn.cvcollapse.Constructor=d,a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.collapse.data-api",'[data-toggle="cvcollapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})})}(jQuery),+function(a){function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d="#"!==c?a(document).find(c):null;return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.4.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;h||(a.fn.dropdown=d,a.fn.dropdown.Constructor=g),a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)})}(jQuery),+function(a){function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.4.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(document).find(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;d||(a.fn.tab=b,a.fn.tab.Constructor=c);var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)})}(jQuery),/*!
8
- * Bootstrap paginator v0.5
9
- * Copyright 2013 Yun Lai <lyonlai1984@gmail.com>
10
- * Licensed http://www.apache.org/licenses/LICENSE-2.0
11
- */
12
- function(a){var b=function(a,b){this.init(a,b)},c=null;b.prototype={init:function(b,c){this.$element=a(b);{var d=c&&c.bootstrapMajorVersion?c.bootstrapMajorVersion:a.fn.bootstrapPaginator.defaults.bootstrapMajorVersion;this.$element.attr("id")}if(2===d&&!this.$element.is("div"))throw"in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option";if(d>2&&!this.$element.is("ul"))throw"in Bootstrap version 3 the pagination root item must be an ul element.";this.currentPage=1,this.lastPage=1,this.setOptions(c),this.initialized=!0},setOptions:function(b){this.options=a.extend({},this.options||a.fn.bootstrapPaginator.defaults,b),this.totalPages=parseInt(this.options.totalPages,10),this.numberOfPages=parseInt(this.options.numberOfPages,10),b&&"undefined"!=typeof b.currentPage&&this.setCurrentPage(b.currentPage),this.listen(),this.render(),this.initialized||this.lastPage===this.currentPage||this.$element.trigger("page-changed",[this.lastPage,this.currentPage])},listen:function(){this.$element.off("page-clicked"),this.$element.off("page-changed"),"function"==typeof this.options.onPageClicked&&this.$element.bind("page-clicked",this.options.onPageClicked),"function"==typeof this.options.onPageChanged&&this.$element.on("page-changed",this.options.onPageChanged),this.$element.bind("page-clicked",this.onPageClicked)},destroy:function(){this.$element.off("page-clicked"),this.$element.off("page-changed"),this.$element.removeData("bootstrapPaginator"),this.$element.empty()},show:function(a){this.setCurrentPage(a),this.render(),this.lastPage!==this.currentPage&&this.$element.trigger("page-changed",[this.lastPage,this.currentPage])},showNext:function(){var a=this.getPages();a.next&&this.show(a.next)},showPrevious:function(){var a=this.getPages();a.prev&&this.show(a.prev)},showFirst:function(){var a=this.getPages();a.first&&this.show(a.first)},showLast:function(){var a=this.getPages();a.last&&this.show(a.last)},onPageItemClicked:function(a){var b=a.data.type,c=a.data.page;this.$element.trigger("page-clicked",[a,b,c])},onPageClicked:function(b,c,d,e){var f=a(b.currentTarget);switch(d){case"first":f.bootstrapPaginator("showFirst");break;case"prev":f.bootstrapPaginator("showPrevious");break;case"next":f.bootstrapPaginator("showNext");break;case"last":f.bootstrapPaginator("showLast");break;case"page":f.bootstrapPaginator("show",e)}},render:function(){var b=this.getValueFromOption(this.options.containerClass,this.$element),c=this.options.size||"normal",d=this.options.alignment||"left",e=this.getPages(),f=2===this.options.bootstrapMajorVersion?a("<ul></ul>"):this.$element,g=2===this.options.bootstrapMajorVersion?this.getValueFromOption(this.options.listContainerClass,f):null,h=null,i=null,j=null,k=null,l=null,m=0;switch(c.toLowerCase()){case"large":case"small":case"mini":this.$element.addClass(a.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][c.toLowerCase()])}if(2===this.options.bootstrapMajorVersion)switch(d.toLowerCase()){case"center":this.$element.addClass("pagination-centered");break;case"right":this.$element.addClass("pagination-right")}for(this.$element.addClass(b),this.$element.empty(),2===this.options.bootstrapMajorVersion&&(this.$element.append(f),f.addClass(g)),this.pageRef=[],e.first&&(h=this.buildPageItem("first",e.first),h&&f.append(h)),e.prev&&(i=this.buildPageItem("prev",e.prev),i&&f.append(i)),m=0;m<e.length;m+=1)l=this.buildPageItem("page",e[m]),l&&f.append(l);e.next&&(j=this.buildPageItem("next",e.next),j&&f.append(j)),e.last&&(k=this.buildPageItem("last",e.last),k&&f.append(k))},buildPageItem:function(b,c){var d=a("<li></li>"),e=a("<a></a>"),f="",g="",h=this.options.itemContainerClass(b,c,this.currentPage),i=this.getValueFromOption(this.options.itemContentClass,b,c,this.currentPage),j=null;switch(b){case"first":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"last":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"prev":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"next":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"page":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage)}return d.addClass(h).append(e),e.addClass(i).html(f).on("click",null,{type:b,page:c},a.proxy(this.onPageItemClicked,this)),this.options.pageUrl&&e.attr("href",this.getValueFromOption(this.options.pageUrl,b,c,this.currentPage)),this.options.useBootstrapTooltip?(j=a.extend({},this.options.bootstrapTooltipOptions,{title:g}),e.tooltip(j)):e.attr("title",g),d},setCurrentPage:function(a){if(a>this.totalPages||1>a)throw"Page out of range";this.lastPage=this.currentPage,this.currentPage=parseInt(a,10)},getPages:function(){var a=this.totalPages,b=this.currentPage-parseInt(this.numberOfPages/2),b=b+this.numberOfPages>a?a-this.numberOfPages+1:b,c=[],d=0,e=0;for(b=1>b?1:b,d=b,e=0;e<this.numberOfPages&&a>=d;d+=1,e+=1)c.push(d);return c.first=1,c.prev=this.currentPage>1?this.currentPage-1:1,c.next=this.currentPage<a?this.currentPage+1:a,c.last=a,c.current=this.currentPage,c.total=a,c.numberOfPages=this.options.numberOfPages,c},getValueFromOption:function(a){var b=null,c=Array.prototype.slice.call(arguments,1);return b="function"==typeof a?a.apply(this,c):a}},c=a.fn.bootstrapPaginator,a.fn.bootstrapPaginator=function(c){var d=arguments,e=null;return a(this).each(function(f,g){var h=a(g),i=h.data("bootstrapPaginator"),j="object"!=typeof c?null:c;if(!i)return i=new b(this,j),h=a(i.$element),void h.data("bootstrapPaginator",i);if("string"==typeof c){if(!i[c])throw"Method "+c+" does not exist";e=i[c].apply(i,Array.prototype.slice.call(d,1))}else e=i.setOptions(c)}),e},a.fn.bootstrapPaginator.sizeArray={2:{large:"pagination-large",small:"pagination-small",mini:"pagination-mini"},3:{large:"pagination-lg",small:"pagination-sm",mini:""}},a.fn.bootstrapPaginator.defaults={containerClass:"",size:"normal",alignment:"left",bootstrapMajorVersion:2,listContainerClass:"",itemContainerClass:function(a,b,c){return b===c?"active":""},itemContentClass:function(){return""},currentPage:1,numberOfPages:5,totalPages:1,pageUrl:function(){return null},onPageClicked:null,onPageChanged:null,useBootstrapTooltip:!1,shouldShowPage:function(a,b,c){var d=!0;switch(a){case"first":d=1!==c;break;case"prev":d=1!==c;break;case"next":d=c!==this.totalPages;break;case"last":d=c!==this.totalPages;break;case"page":d=!0}return d},itemTexts:function(a,b){switch(a){case"first":return PT_CV_PAGINATION.first;case"prev":return PT_CV_PAGINATION.prev;case"next":return PT_CV_PAGINATION.next;case"last":return PT_CV_PAGINATION.last;case"page":return b}},tooltipTitles:function(a,b,c){switch(a){case"first":return PT_CV_PAGINATION.goto_first;case"prev":return PT_CV_PAGINATION.goto_prev;case"next":return PT_CV_PAGINATION.goto_next;case"last":return PT_CV_PAGINATION.goto_last;case"page":return b===c?PT_CV_PAGINATION.current_page+" "+b:PT_CV_PAGINATION.goto_page+" "+b}},bootstrapTooltipOptions:{animation:!0,html:!0,placement:"top",selector:!1,title:"",container:!1}},a.fn.bootstrapPaginator.Constructor=b}(window.jQuery),/**
13
- * CV JS
14
- * @author PT Guy <http://www.contentviewspro.com/>
15
- * @license GPL-2.0+
16
- */
17
- function(a){"use strict";a.PT_CV_Public=a.PT_CV_Public||{},PT_CV_PUBLIC=PT_CV_PUBLIC||{};var b=PT_CV_PUBLIC._prefix;a.PT_CV_Public=function(b){this.options=a.extend({},b),"undefined"==typeof this.options.skip&&this.pagination()},a.PT_CV_Public.prototype={pagination:function(){var c=this;a("."+b+"pagination."+b+"ajax").each(function(){var b=a(this),d=a(this).attr("data-totalpages"),e=a(this).attr("data-currentpage");a(this).bootstrapPaginator({bootstrapMajorVersion:3,currentPage:e?parseInt(e):1,totalPages:d?parseInt(d):1,numberOfPages:PT_CV_PUBLIC.page_to_show,shouldShowPage:function(a){if(!(d&&10>d))return!0;switch(a){case"first":case"last":return!1;default:return!0}},itemContainerClass:function(a,b,c){var d="cv-pageitem-"+("page"===a?"number":a);return d+" "+(b===c?"active":"")},onPageClicked:function(a,d,e,f){c._setup_pagination(b,f,function(){PT_CV_PUBLIC.paging=0})}})})},_setup_pagination:function(a,c,d){var e=this;if(PT_CV_PUBLIC.paging=PT_CV_PUBLIC.paging||0,!PT_CV_PUBLIC.paging&&!a.data("disabled")){PT_CV_PUBLIC.paging=1;var f=a.next("."+b+"spinner"),g=a;a.parent("."+b+"pagination-wrapper").length&&(g=a.parent("."+b+"pagination-wrapper"));var h=g.closest("."+b+"wrapper").children("."+b+"view");if(h.hasClass(b+"timeline")&&(h=h.children(".tl-items").first()),g.find("."+b+"more").length>0){var i=h.children("."+b+"page").first();i.length>0&&(h=i)}e._get_page(a,c,f,h,d)}},_get_page:function(c,d,e,f,g){var h=this,i=h._active_page(d,f,g);if(i)return g&&"function"==typeof g&&g(),void a("body").trigger(b+"pagination-finished-simple");a("body").trigger(b+"before-pagination");var j={action:"pagination_request",sid:c.attr("data-sid"),unid:c.attr("data-unid"),page:d,lang:PT_CV_PUBLIC.lang,ajax_nonce:PT_CV_PUBLIC._nonce,custom_data:window.cvdata};a.ajax({type:"POST",url:PT_CV_PUBLIC.ajaxurl,data:j,beforeSend:function(){e.addClass("active")}}).done(function(c){e.removeClass("active"),c.indexOf(b+"no-post")<0&&f.append(c),h._active_page(d,f,g),g&&"function"==typeof g&&g(),a("body").trigger(b+"pagination-finished",[f,a(c)])})},_active_page:function(c,d){var e=!1,f='[data-id="'+b+"page-"+parseInt(c)+'"]';return d.children(f).length&&(e=!0,d.children().hide(),d.children(f).show(),window.cvp_pagination_no_scroll||a("html, body").animate({scrollTop:d.children(f).offset().top-160},1e3)),e}},a(function(){new a.PT_CV_Public})}(jQuery);
1
+ /*! content-views 01-2020 */
2
+ /*!
3
+ * Bootstrap v3.4.1 (http://getbootstrap.com)
4
+ * Copyright 2011-2019 Twitter, Inc.
5
+ * Licensed under the MIT license
6
+ */
7
+ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.cvslide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".pt-cv-carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.4.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("pt-cv-slide")?(f.addClass(b),"object"==typeof f&&f.length&&f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;d||(a.fn.carousel=b,a.fn.carousel.Constructor=c),a.fn.cvcarousel=b,a.fn.cvcarousel.Constructor=c;var e=function(c){var d=a(this),e=d.attr("href");e&&(e=e.replace(/.*(?=#[^\s]+$)/,""));var f=d.attr("data-target")||e,g=a(document).find(f);if(g.hasClass("pt-cv-carousel")){var h=a.extend({},g.data(),d.data()),i=d.attr("data-cvslide-to");i&&(h.interval=!1),b.call(g,h),i&&g.data("bs.carousel").to(i),c.preventDefault()}};a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.carousel.data-api","[data-cvslide]",e).on("click.bs.carousel.data-api","[data-cvslide-to]",e)}),a(window).on("load",function(){a('[data-ride="cvcarousel"]',".pt-cv-wrapper").each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(document).find(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="cvcollapse"][href="#'+b.id+'"],[data-toggle="cvcollapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.4.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){!window.cv_collapse_ignore_others&&e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle="cvcollapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;e||(a.fn.collapse=c,a.fn.collapse.Constructor=d),a.fn.cvcollapse=c,a.fn.cvcollapse.Constructor=d,a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.collapse.data-api",'[data-toggle="cvcollapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})})}(jQuery),+function(a){function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d="#"!==c?a(document).find(c):null;return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.4.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;h||(a.fn.dropdown=d,a.fn.dropdown.Constructor=g),a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)})}(jQuery),+function(a){function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.4.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(document).find(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;d||(a.fn.tab=b,a.fn.tab.Constructor=c);var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).ready(function(){a(".pt-cv-wrapper").on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)})}(jQuery),/*!
8
+ * Bootstrap paginator v0.5
9
+ * Copyright 2013 Yun Lai <lyonlai1984@gmail.com>
10
+ * Licensed http://www.apache.org/licenses/LICENSE-2.0
11
+ */
12
+ function(a){var b=function(a,b){this.init(a,b)},c=null;b.prototype={init:function(b,c){this.$element=a(b);{var d=c&&c.bootstrapMajorVersion?c.bootstrapMajorVersion:a.fn.bootstrapPaginator.defaults.bootstrapMajorVersion;this.$element.attr("id")}if(2===d&&!this.$element.is("div"))throw"in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option";if(d>2&&!this.$element.is("ul"))throw"in Bootstrap version 3 the pagination root item must be an ul element.";this.currentPage=1,this.lastPage=1,this.setOptions(c),this.initialized=!0},setOptions:function(b){this.options=a.extend({},this.options||a.fn.bootstrapPaginator.defaults,b),this.totalPages=parseInt(this.options.totalPages,10),this.numberOfPages=parseInt(this.options.numberOfPages,10),b&&"undefined"!=typeof b.currentPage&&this.setCurrentPage(b.currentPage),this.listen(),this.render(),this.initialized||this.lastPage===this.currentPage||this.$element.trigger("page-changed",[this.lastPage,this.currentPage])},listen:function(){this.$element.off("page-clicked"),this.$element.off("page-changed"),"function"==typeof this.options.onPageClicked&&this.$element.bind("page-clicked",this.options.onPageClicked),"function"==typeof this.options.onPageChanged&&this.$element.on("page-changed",this.options.onPageChanged),this.$element.bind("page-clicked",this.onPageClicked)},destroy:function(){this.$element.off("page-clicked"),this.$element.off("page-changed"),this.$element.removeData("bootstrapPaginator"),this.$element.empty()},show:function(a){this.setCurrentPage(a),this.render(),this.lastPage!==this.currentPage&&this.$element.trigger("page-changed",[this.lastPage,this.currentPage])},showNext:function(){var a=this.getPages();a.next&&this.show(a.next)},showPrevious:function(){var a=this.getPages();a.prev&&this.show(a.prev)},showFirst:function(){var a=this.getPages();a.first&&this.show(a.first)},showLast:function(){var a=this.getPages();a.last&&this.show(a.last)},onPageItemClicked:function(a){var b=a.data.type,c=a.data.page;this.$element.trigger("page-clicked",[a,b,c])},onPageClicked:function(b,c,d,e){var f=a(b.currentTarget);switch(d){case"first":f.bootstrapPaginator("showFirst");break;case"prev":f.bootstrapPaginator("showPrevious");break;case"next":f.bootstrapPaginator("showNext");break;case"last":f.bootstrapPaginator("showLast");break;case"page":f.bootstrapPaginator("show",e)}},render:function(){var b=this.getValueFromOption(this.options.containerClass,this.$element),c=this.options.size||"normal",d=this.options.alignment||"left",e=this.getPages(),f=2===this.options.bootstrapMajorVersion?a("<ul></ul>"):this.$element,g=2===this.options.bootstrapMajorVersion?this.getValueFromOption(this.options.listContainerClass,f):null,h=null,i=null,j=null,k=null,l=null,m=0;switch(c.toLowerCase()){case"large":case"small":case"mini":this.$element.addClass(a.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][c.toLowerCase()])}if(2===this.options.bootstrapMajorVersion)switch(d.toLowerCase()){case"center":this.$element.addClass("pagination-centered");break;case"right":this.$element.addClass("pagination-right")}for(this.$element.addClass(b),this.$element.empty(),2===this.options.bootstrapMajorVersion&&(this.$element.append(f),f.addClass(g)),this.pageRef=[],e.first&&(h=this.buildPageItem("first",e.first),h&&f.append(h)),e.prev&&(i=this.buildPageItem("prev",e.prev),i&&f.append(i)),m=0;m<e.length;m+=1)l=this.buildPageItem("page",e[m]),l&&f.append(l);e.next&&(j=this.buildPageItem("next",e.next),j&&f.append(j)),e.last&&(k=this.buildPageItem("last",e.last),k&&f.append(k))},buildPageItem:function(b,c){var d=a("<li></li>"),e=a("<a></a>"),f="",g="",h=this.options.itemContainerClass(b,c,this.currentPage),i=this.getValueFromOption(this.options.itemContentClass,b,c,this.currentPage),j=null;switch(b){case"first":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"last":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"prev":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"next":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage);break;case"page":if(!this.getValueFromOption(this.options.shouldShowPage,b,c,this.currentPage))return;f=this.options.itemTexts(b,c,this.currentPage),g=this.options.tooltipTitles(b,c,this.currentPage)}return d.addClass(h).append(e),e.addClass(i).html(f).on("click",null,{type:b,page:c},a.proxy(this.onPageItemClicked,this)),this.options.pageUrl&&e.attr("href",this.getValueFromOption(this.options.pageUrl,b,c,this.currentPage)),this.options.useBootstrapTooltip?(j=a.extend({},this.options.bootstrapTooltipOptions,{title:g}),e.tooltip(j)):e.attr("title",g),d},setCurrentPage:function(a){(a>this.totalPages||1>a)&&(a=this.totalPages),this.lastPage=this.currentPage,this.currentPage=parseInt(a,10)},getPages:function(){var a=this.totalPages,b=this.currentPage-parseInt(this.numberOfPages/2),b=b+this.numberOfPages>a?a-this.numberOfPages+1:b,c=[],d=0,e=0;for(b=1>b?1:b,d=b,e=0;e<this.numberOfPages&&a>=d;d+=1,e+=1)c.push(d);return c.first=1,c.prev=this.currentPage>1?this.currentPage-1:1,c.next=this.currentPage<a?this.currentPage+1:a,c.last=a,c.current=this.currentPage,c.total=a,c.numberOfPages=this.options.numberOfPages,c},getValueFromOption:function(a){var b=null,c=Array.prototype.slice.call(arguments,1);return b="function"==typeof a?a.apply(this,c):a}},c=a.fn.bootstrapPaginator,a.fn.bootstrapPaginator=function(c){var d=arguments,e=null;return a(this).each(function(f,g){var h=a(g),i=h.data("bootstrapPaginator"),j="object"!=typeof c?null:c;if(!i)return i=new b(this,j),h=a(i.$element),void h.data("bootstrapPaginator",i);if("string"==typeof c){if(!i[c])throw"Method "+c+" does not exist";e=i[c].apply(i,Array.prototype.slice.call(d,1))}else e=i.setOptions(c)}),e},a.fn.bootstrapPaginator.sizeArray={2:{large:"pagination-large",small:"pagination-small",mini:"pagination-mini"},3:{large:"pagination-lg",small:"pagination-sm",mini:""}},a.fn.bootstrapPaginator.defaults={containerClass:"",size:"normal",alignment:"left",bootstrapMajorVersion:2,listContainerClass:"",itemContainerClass:function(a,b,c){return b===c?"active":""},itemContentClass:function(){return""},currentPage:1,numberOfPages:5,totalPages:1,pageUrl:function(){return null},onPageClicked:null,onPageChanged:null,useBootstrapTooltip:!1,shouldShowPage:function(a,b,c){var d=!0;switch(a){case"first":d=1!==c;break;case"prev":d=1!==c;break;case"next":d=c!==this.totalPages;break;case"last":d=c!==this.totalPages;break;case"page":d=!0}return d},itemTexts:function(a,b){switch(a){case"first":return PT_CV_PAGINATION.first;case"prev":return PT_CV_PAGINATION.prev;case"next":return PT_CV_PAGINATION.next;case"last":return PT_CV_PAGINATION.last;case"page":return b}},tooltipTitles:function(a,b,c){switch(a){case"first":return PT_CV_PAGINATION.goto_first;case"prev":return PT_CV_PAGINATION.goto_prev;case"next":return PT_CV_PAGINATION.goto_next;case"last":return PT_CV_PAGINATION.goto_last;case"page":return b===c?PT_CV_PAGINATION.current_page+" "+b:PT_CV_PAGINATION.goto_page+" "+b}},bootstrapTooltipOptions:{animation:!0,html:!0,placement:"top",selector:!1,title:"",container:!1}},a.fn.bootstrapPaginator.Constructor=b}(window.jQuery),/**
13
+ * CV JS
14
+ * @author PT Guy <http://www.contentviewspro.com/>
15
+ * @license GPL-2.0+
16
+ */
17
+ function(a){"use strict";a.PT_CV_Public=a.PT_CV_Public||{},PT_CV_PUBLIC=PT_CV_PUBLIC||{};var b=PT_CV_PUBLIC._prefix;a.PT_CV_Public=function(b){this.options=a.extend({},b),"undefined"==typeof this.options.skip&&this.pagination()},a.PT_CV_Public.prototype={pagination:function(){var c=this;a("."+b+"pagination."+b+"ajax").each(function(){var b=a(this),d=a(this).attr("data-totalpages"),e=a(this).attr("data-currentpage");a(this).bootstrapPaginator({bootstrapMajorVersion:3,currentPage:e?parseInt(e):1,totalPages:d?parseInt(d):1,numberOfPages:PT_CV_PUBLIC.page_to_show,shouldShowPage:function(a){if(!(d&&10>d))return!0;switch(a){case"first":case"last":return!1;default:return!0}},itemContainerClass:function(a,b,c){var d="cv-pageitem-"+("page"===a?"number":a);return d+" "+(b===c?"active":"")},onPageClicked:function(a,d,e,f){c._setup_pagination(b,f,function(){PT_CV_PUBLIC.paging=0})}})})},_setup_pagination:function(a,c,d){var e=this;if(PT_CV_PUBLIC.paging=PT_CV_PUBLIC.paging||0,!PT_CV_PUBLIC.paging&&!a.data("disabled")){PT_CV_PUBLIC.paging=1;var f=a.next("."+b+"spinner"),g=a;a.parent("."+b+"pagination-wrapper").length&&(g=a.parent("."+b+"pagination-wrapper"));var h=g.closest("."+b+"wrapper").children("."+b+"view");if(h.hasClass(b+"timeline")&&(h=h.children(".tl-items").first()),g.find("."+b+"more").length>0){var i=h.children("."+b+"page").first();i.length>0&&(h=i)}e._get_page(a,c,f,h,d)}},_get_page:function(c,d,e,f,g){var h=this;d=parseInt(d);var i=h._active_page(d,f,g);if(i)return g&&"function"==typeof g&&g(),void a("body").trigger(b+"pagination-finished-simple");a("body").trigger(b+"before-pagination");var j={action:"pagination_request",sid:c.attr("data-sid"),unid:c.attr("data-unid"),page:d,lang:PT_CV_PUBLIC.lang,ajax_nonce:PT_CV_PUBLIC._nonce,custom_data:window.cvdata};a.ajax({type:"POST",url:PT_CV_PUBLIC.ajaxurl,data:j,beforeSend:function(){e.addClass("active")}}).done(function(c){e.removeClass("active"),c.indexOf(b+"no-post")<0&&f.append(c),h._active_page(d,f,g),g&&"function"==typeof g&&g(),a("body").trigger(b+"pagination-finished",[f,a(c)])})},_active_page:function(c,d){var e=!1,f='[data-id="'+b+"page-"+c+'"]';return d.children(f).length&&(e=!0,d.children().hide(),d.children(f).show(),this._update_url(c),window.cvp_pagination_no_scroll||a("html, body").animate({scrollTop:d.children(f).offset().top-160},1e3)),e},_get_paginated_url:function(a){return PT_CV_PAGINATION.links.page_n&&PT_CV_PAGINATION.links.page_n.replace("_CVNUMBER_",parseInt(a))},_update_url:function(a){var b=this;if(!PT_CV_PUBLIC.is_admin&&!window.cv_pagination_no_update_url){var c=!1;c=a>1?b._get_paginated_url(a):PT_CV_PAGINATION.links.page_1,c&&history.replaceState(null,null,encodeURI(c))}}},a(function(){new a.PT_CV_Public})}(jQuery);
public/templates/collapsible/html/main.php CHANGED
@@ -1,37 +1,43 @@
1
- <?php
2
- /**
3
- * Layout Name: Collapsible List
4
- *
5
- * @package PT_Content_Views
6
- * @author PT Guy <http://www.contentviewspro.com/>
7
- * @license GPL-2.0+
8
- * @link http://www.contentviewspro.com/
9
- * @copyright 2014 PT Guy
10
- */
11
- if ( !defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- $random_id = PT_CV_Functions::string_random();
16
- $heading = isset( $fields_html[ 'title' ] ) ? $fields_html[ 'title' ] : '';
17
- unset( $fields_html[ 'title' ] );
18
- ?>
19
-
20
- <div class="panel-heading">
21
- <a class="panel-title" data-toggle="cvcollapse" data-parent="#<?php echo esc_attr( PT_CV_PREFIX_UPPER . 'ID' ); ?>" href="#<?php echo esc_attr( $random_id ); ?>">
22
- <?php
23
- $allowable_tags = (array) apply_filters( PT_CV_PREFIX_ . 'collapsible_heading_tags', array( '<b>', '<br>', '<code>', '<em>', '<i>', '<img>', '<big>', '<small>', '<span>', '<strong>', '<sub>', '<sup>', '<label>', '<cite>', ) );
24
- echo strip_tags( $heading, implode( '', $allowable_tags ) );
25
- ?>
26
- </a>
27
- <?php
28
- echo apply_filters( PT_CV_PREFIX_ . 'scrollable_toggle_icon', '' );
29
- ?>
30
- </div>
31
- <div id="<?php echo esc_attr( $random_id ); ?>" class="panel-collapse collapse <?php echo esc_attr( PT_CV_PREFIX_UPPER . 'CLASS' ); ?>">
32
- <div class="panel-body">
33
- <?php
34
- echo implode( "\n", $fields_html );
35
- ?>
36
- </div>
 
 
 
 
 
 
37
  </div>
1
+ <?php
2
+ /**
3
+ * Layout Name: Collapsible List
4
+ *
5
+ * @package PT_Content_Views
6
+ * @author PT Guy <http://www.contentviewspro.com/>
7
+ * @license GPL-2.0+
8
+ * @link http://www.contentviewspro.com/
9
+ * @copyright 2014 PT Guy
10
+ */
11
+ if ( !defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ $random_id = PT_CV_Functions::string_random();
16
+ $heading = isset( $fields_html[ 'title' ] ) ? $fields_html[ 'title' ] : '';
17
+ unset( $fields_html[ 'title' ] );
18
+
19
+ // Get link
20
+ $matches = array();
21
+ preg_match( '/href="([^"]+)"/', $heading, $matches );
22
+ $href = !empty( $matches[ 1 ] ) ? "href='" . esc_url( $matches[ 1 ] ) . "' onclick='event.preventDefault()'" : '';
23
+ ?>
24
+
25
+ <div class="panel-heading">
26
+ <a class="panel-title" data-toggle="cvcollapse" data-parent="#<?php echo esc_attr( PT_CV_PREFIX_UPPER . 'ID' ); ?>" data-target="#<?php echo esc_attr( $random_id ); ?>" <?php echo $href; ?>>
27
+ <?php
28
+ // Remove title wrapper and anchor tags, remain original post's title
29
+ $tt = tag_escape( PT_CV_Functions::setting_value( PT_CV_PREFIX . 'field-title-tag' ) );
30
+ echo preg_replace( array( '/<(' . $tt . '|a)[^>]*>/i', '/<\/(' . $tt . '|a)>/i' ), '', $heading );
31
+ ?>
32
+ </a>
33
+ <?php
34
+ echo apply_filters( PT_CV_PREFIX_ . 'scrollable_toggle_icon', '' );
35
+ ?>
36
+ </div>
37
+ <div id="<?php echo esc_attr( $random_id ); ?>" class="panel-collapse collapse <?php echo esc_attr( PT_CV_PREFIX_UPPER . 'CLASS' ); ?>">
38
+ <div class="panel-body">
39
+ <?php
40
+ echo implode( "\n", $fields_html );
41
+ ?>
42
+ </div>
43
  </div>