Testimonials Widget - Version 2.15.0

Version Description

  • If upgrading, bxSlider will not be enabled by default. You must enable it in your widget and global settings. CSS customizations must be reviewed to have the .active and .display-none classes removed. The main .testimonials-widget-testimonial class also need the display: none; and clear: left; removed.
Download this release

Release Info

Developer comprock
Plugin Icon wp plugin Testimonials Widget
Version 2.15.0
Comparing to
See all releases

Code changes from version 2.14.0 to 2.15.0

API.md CHANGED
@@ -32,6 +32,10 @@ The [Testimonials Widget plugin](http://wordpress.org/plugins/testimonials-widge
32
 
33
  More content ellipsis. [example](https://aihrus.zendesk.com/entries/23691577-How-do-I-change-the-more-content-ellipsis-)
34
 
 
 
 
 
35
  * `testimonials_widget_get_testimonial_html`
36
 
37
  Customize testimonial contents and layout within `get_testimonial_html`. Useful for moving processed parts around than regenerating everything from scratch.. [example](https://aihrus.zendesk.com/entries/23693433-How-do-I-use-filter-testimonials-widget-get-testimonial-html-)
32
 
33
  More content ellipsis. [example](https://aihrus.zendesk.com/entries/23691577-How-do-I-change-the-more-content-ellipsis-)
34
 
35
+ * `testimonials_widget_get_testimonials_html`
36
+
37
+ Customize the contents and layout within `get_testimonials_html`.
38
+
39
  * `testimonials_widget_get_testimonial_html`
40
 
41
  Customize testimonial contents and layout within `get_testimonial_html`. Useful for moving processed parts around than regenerating everything from scratch.. [example](https://aihrus.zendesk.com/entries/23693433-How-do-I-use-filter-testimonials-widget-get-testimonial-html-)
CHANGELOG.md CHANGED
@@ -2,6 +2,35 @@
2
 
3
  ## master
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  ## 2.14.0
6
  * Abstact schema generation
7
  * Add API action testimonials_widget_styles
2
 
3
  ## master
4
 
5
+ ## 2.15.0
6
+ * Add 2.15.0 upgrade notice
7
+ * Add filter `testimonials_widget_get_testimonials_html`
8
+ * Add option Always Load CSS?
9
+ * Add option Enable Video?
10
+ * Add option Start/Stop
11
+ * Add option Transition Mode
12
+ * BUGFIX JS slider_var not global
13
+ * BUGFIX active and display-none classes still included though using bxSlider
14
+ * Bump $2 donation request to $5
15
+ * Hide non-widget settings
16
+ * If upgrading, bxSlider will not be enabled by default. You must enable it in your widget and global settings. CSS customizations must be reviewed to have the `.active` and `.display-none` classes removed. The main `.testimonials-widget-testimonial` class also need the `display: none;` and `clear: left;` removed.
17
+ * Match transition defaults to those of current testimonials widget
18
+ * Move 2.14.0 transition options to Compatibility tab
19
+ * Move height options to Compatibility tab
20
+ * Moved testimonials-widget-2.14.0.css -> css/testimonials-widget-2.14.0.css
21
+ * Moved testimonials-widget-ie7.css -> css/testimonials-widget-ie7.css
22
+ * Reduce `empty` usage
23
+ * Require at least WordPress 3.6
24
+ * Simplify `wp_enqueue_style` handling
25
+ * Update .travis for phpmd exclusions
26
+ * Update FAQ
27
+ * Update PHPCS config
28
+ * Update TODO
29
+ * Use const JS_KEY
30
+ * [Auto-suggest category and tag options](http://wordpress.org/support/topic/feature-request-menus-in-the-widget)
31
+ * [Responsively set height](http://wordpress.org/support/topic/better-set-height?replies=3#post-4788316)
32
+ * [Use bxSlider JavaScript slider](http://bxslider.com/examples/auto-show-start-stop-controls) to make the transitions and navigation more slider like with a [pause button on testimonials](http://wordpress.org/support/topic/play-pause-icon-on-testimonial)
33
+
34
  ## 2.14.0
35
  * Abstact schema generation
36
  * Add API action testimonials_widget_styles
TODO.md CHANGED
@@ -2,9 +2,9 @@
2
 
3
  Is there something you want done? Write it up on the [support forums](http://wordpress.org/support/plugin/testimonials-widget) and then [donate](http://aihr.us/about-aihrus/donate/) or [write an awesome testimonial](http://aihr.us/about-aihrus/testimonials/add-testimonial/).
4
 
5
- * BUG saving settings doesn't show update notice
 
 
6
  * Consolidate schema by testimonial item
7
- * Show settings save errors as error notices
8
- * [Auto-suggest category and tag options](http://wordpress.org/support/topic/feature-request-menus-in-the-widget)
9
  * [CONFLICT](https://aihrus.zendesk.com/agent/#/tickets/562) Widgets Reloaded plugin - no longer allow me to exclude categories
10
- * [Use bxSlider JavaScript slider](http://bxslider.com/examples/auto-show-start-stop-controls) to make the transitions and navigation more slider like with a [pause button on testimonials](http://wordpress.org/support/topic/play-pause-icon-on-testimonial)
2
 
3
  Is there something you want done? Write it up on the [support forums](http://wordpress.org/support/plugin/testimonials-widget) and then [donate](http://aihr.us/about-aihrus/donate/) or [write an awesome testimonial](http://aihr.us/about-aihrus/testimonials/add-testimonial/).
4
 
5
+ * 3.X Remove prior version options
6
+ * Add easing options - http://bxslider.com/examples/easing, http://gsgd.co.uk/sandbox/jquery/easing/
7
+ * BUG Saving settings doesn't show update notice
8
  * Consolidate schema by testimonial item
9
+ * Show settings save errors in error notices
 
10
  * [CONFLICT](https://aihrus.zendesk.com/agent/#/tickets/562) Widgets Reloaded plugin - no longer allow me to exclude categories
 
ci/phpcs.ruleset.xml CHANGED
@@ -4,8 +4,11 @@
4
  Custom phpcs rules to check for Aihrus' WordPress projects
5
  </description>
6
 
7
- <exclude-pattern>lib/class-redrokk-metabox-class.php</exclude-pattern>
 
 
8
  <exclude-pattern>lib/Akismet.class.php</exclude-pattern>
 
9
 
10
  <rule ref="Generic">
11
  <exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.Found" />
@@ -29,6 +32,6 @@
29
  </rule>
30
 
31
  <rule ref="WordPress">
32
- <xexclude name="WordPress.XSS.EscapeOutput" />
33
  </rule>
34
  </ruleset>
4
  Custom phpcs rules to check for Aihrus' WordPress projects
5
  </description>
6
 
7
+ <exclude-pattern>js/jquery.bxslider.js</exclude-pattern>
8
+ <exclude-pattern>js/jquery.easing.1.3.js</exclude-pattern>
9
+ <exclude-pattern>js/jquery.fitvids.js</exclude-pattern>
10
  <exclude-pattern>lib/Akismet.class.php</exclude-pattern>
11
+ <exclude-pattern>lib/class-redrokk-metabox-class.php</exclude-pattern>
12
 
13
  <rule ref="Generic">
14
  <exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.Found" />
32
  </rule>
33
 
34
  <rule ref="WordPress">
35
+ <exclude name="WordPress.XSS.EscapeOutput" />
36
  </rule>
37
  </ruleset>
ci/phpcs.travis.ruleset.xml CHANGED
@@ -4,8 +4,11 @@
4
  Custom phpcs rules to check for Aihrus' WordPress projects
5
  </description>
6
 
7
- <exclude-pattern>lib/class-redrokk-metabox-class.php</exclude-pattern>
 
 
8
  <exclude-pattern>lib/Akismet.class.php</exclude-pattern>
 
9
 
10
  <rule ref="Generic">
11
  <exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.Found" />
4
  Custom phpcs rules to check for Aihrus' WordPress projects
5
  </description>
6
 
7
+ <exclude-pattern>js/jquery.bxslider.js</exclude-pattern>
8
+ <exclude-pattern>js/jquery.easing.1.3.js</exclude-pattern>
9
+ <exclude-pattern>js/jquery.fitvids.js</exclude-pattern>
10
  <exclude-pattern>lib/Akismet.class.php</exclude-pattern>
11
+ <exclude-pattern>lib/class-redrokk-metabox-class.php</exclude-pattern>
12
 
13
  <rule ref="Generic">
14
  <exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.Found" />
css/images/bx_loader.gif ADDED
Binary file
css/images/controls.png ADDED
Binary file
css/jquery.bxslider.css ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * BxSlider v4.0 - Fully loaded, responsive content slider
3
+ * http://bxslider.com
4
+ *
5
+ * Written by: Steven Wanderski, 2012
6
+ * http://stevenwanderski.com
7
+ * (while drinking Belgian ales and listening to jazz)
8
+ *
9
+ * CEO and founder of bxCreative, LTD
10
+ * http://bxcreative.com
11
+ */
12
+
13
+
14
+ /** RESET AND LAYOUT
15
+ ===================================*/
16
+
17
+ .bx-wrapper {
18
+ position: relative;
19
+ margin: 0 auto 60px;
20
+ padding: 0;
21
+ *zoom: 1;
22
+ }
23
+
24
+ .bx-wrapper img {
25
+ max-width: 100%;
26
+ display: block;
27
+ }
28
+
29
+ /** THEME
30
+ ===================================*/
31
+
32
+ .bx-wrapper .bx-viewport {
33
+ -moz-box-shadow: 0 0 5px #ccc;
34
+ -webkit-box-shadow: 0 0 5px #ccc;
35
+ box-shadow: 0 0 5px #ccc;
36
+ border: solid #fff 5px;
37
+ left: -5px;
38
+ background: #fff;
39
+ }
40
+
41
+ .bx-wrapper .bx-pager,
42
+ .bx-wrapper .bx-controls-auto {
43
+ position: absolute;
44
+ bottom: -30px;
45
+ width: 100%;
46
+ }
47
+
48
+ /* LOADER */
49
+
50
+ .bx-wrapper .bx-loading {
51
+ min-height: 50px;
52
+ background: url(images/bx_loader.gif) center center no-repeat #fff;
53
+ height: 100%;
54
+ width: 100%;
55
+ position: absolute;
56
+ top: 0;
57
+ left: 0;
58
+ z-index: 2000;
59
+ }
60
+
61
+ /* PAGER */
62
+
63
+ .bx-wrapper .bx-pager {
64
+ text-align: center;
65
+ font-size: .85em;
66
+ font-family: Arial;
67
+ font-weight: bold;
68
+ color: #666;
69
+ padding-top: 20px;
70
+ }
71
+
72
+ .bx-wrapper .bx-pager .bx-pager-item,
73
+ .bx-wrapper .bx-controls-auto .bx-controls-auto-item {
74
+ display: inline-block;
75
+ *zoom: 1;
76
+ *display: inline;
77
+ }
78
+
79
+ .bx-wrapper .bx-pager.bx-default-pager a {
80
+ background: #666;
81
+ text-indent: -9999px;
82
+ display: block;
83
+ width: 10px;
84
+ height: 10px;
85
+ margin: 0 5px;
86
+ outline: 0;
87
+ -moz-border-radius: 5px;
88
+ -webkit-border-radius: 5px;
89
+ border-radius: 5px;
90
+ }
91
+
92
+ .bx-wrapper .bx-pager.bx-default-pager a:hover,
93
+ .bx-wrapper .bx-pager.bx-default-pager a.active {
94
+ background: #000;
95
+ }
96
+
97
+ /* DIRECTION CONTROLS (NEXT / PREV) */
98
+
99
+ .bx-wrapper .bx-prev {
100
+ left: 10px;
101
+ background: url(images/controls.png) no-repeat 0 -32px;
102
+ }
103
+
104
+ .bx-wrapper .bx-next {
105
+ right: 10px;
106
+ background: url(images/controls.png) no-repeat -43px -32px;
107
+ }
108
+
109
+ .bx-wrapper .bx-prev:hover {
110
+ background-position: 0 0;
111
+ }
112
+
113
+ .bx-wrapper .bx-next:hover {
114
+ background-position: -43px 0;
115
+ }
116
+
117
+ .bx-wrapper .bx-controls-direction a {
118
+ position: absolute;
119
+ top: 50%;
120
+ margin-top: -16px;
121
+ outline: 0;
122
+ width: 32px;
123
+ height: 32px;
124
+ text-indent: -9999px;
125
+ z-index: 9999;
126
+ }
127
+
128
+ .bx-wrapper .bx-controls-direction a.disabled {
129
+ display: none;
130
+ }
131
+
132
+ /* AUTO CONTROLS (START / STOP) */
133
+
134
+ .bx-wrapper .bx-controls-auto {
135
+ text-align: center;
136
+ }
137
+
138
+ .bx-wrapper .bx-controls-auto .bx-start {
139
+ display: block;
140
+ text-indent: -9999px;
141
+ width: 10px;
142
+ height: 11px;
143
+ outline: 0;
144
+ background: url(images/controls.png) -86px -11px no-repeat;
145
+ margin: 0 3px;
146
+ }
147
+
148
+ .bx-wrapper .bx-controls-auto .bx-start:hover,
149
+ .bx-wrapper .bx-controls-auto .bx-start.active {
150
+ background-position: -86px 0;
151
+ }
152
+
153
+ .bx-wrapper .bx-controls-auto .bx-stop {
154
+ display: block;
155
+ text-indent: -9999px;
156
+ width: 9px;
157
+ height: 11px;
158
+ outline: 0;
159
+ background: url(images/controls.png) -86px -44px no-repeat;
160
+ margin: 0 3px;
161
+ }
162
+
163
+ .bx-wrapper .bx-controls-auto .bx-stop:hover,
164
+ .bx-wrapper .bx-controls-auto .bx-stop.active {
165
+ background-position: -86px -33px;
166
+ }
167
+
168
+ /* PAGER WITH AUTO-CONTROLS HYBRID LAYOUT */
169
+
170
+ .bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-pager {
171
+ text-align: left;
172
+ width: 80%;
173
+ }
174
+
175
+ .bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-controls-auto {
176
+ right: 0;
177
+ width: 35px;
178
+ }
179
+
180
+ /* IMAGE CAPTIONS */
181
+
182
+ .bx-wrapper .bx-caption {
183
+ position: absolute;
184
+ bottom: 0;
185
+ left: 0;
186
+ background: #666\9;
187
+ background: rgba(80, 80, 80, 0.75);
188
+ width: 100%;
189
+ }
190
+
191
+ .bx-wrapper .bx-caption span {
192
+ color: #fff;
193
+ font-family: Arial;
194
+ display: block;
195
+ font-size: .85em;
196
+ padding: 10px;
197
+ }
css/testimonials-widget-2.14.0.css ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .testimonials-widget-testimonials {
2
+ /* testimonials wrapper */
3
+ }
4
+
5
+ .testimonials-widget-testimonial {
6
+ clear: left;
7
+ display: none;
8
+ margin: 0 0 1.4em;
9
+ }
10
+
11
+ .testimonials-widget-testimonials .active {
12
+ /* active testimonials */
13
+ display: block;
14
+ }
15
+
16
+ .testimonials-widget-testimonials .display-none {
17
+ /* staged testimonials */
18
+ display: none;
19
+ }
20
+
21
+ .testimonials-widget-testimonials .paging {
22
+ clear: both;
23
+ font-weight: 700;
24
+ height: 1.4em;
25
+ }
26
+
27
+ .testimonials-widget-testimonials .paging.prepend {
28
+ margin-bottom: 1em;
29
+ }
30
+
31
+ .testimonials-widget-testimonials .paging.append {
32
+ margin-top: 1em;
33
+ }
34
+
35
+ .testimonials-widget-testimonials .alignleft {
36
+ float: left;
37
+ }
38
+
39
+ .testimonials-widget-testimonials .alignright {
40
+ float: right;
41
+ }
42
+
43
+ .testimonials-widget-testimonial.list,
44
+ .testimonials-widget-testimonial.single {
45
+ display: block;
46
+ }
47
+
48
+ .testimonials-widget-testimonial .image {
49
+ float: left;
50
+ margin-bottom: .4em;
51
+ margin-right: .2em;
52
+ }
53
+
54
+ .widget .testimonials-widget-testimonial .image {
55
+ display: block;
56
+ float: none;
57
+ }
58
+
59
+ .testimonials-widget-testimonial q,
60
+ .testimonials-widget-testimonial blockquote {
61
+ /* the testimonial itself */
62
+ quotes: none;
63
+ }
64
+
65
+ .testimonials-widget-testimonial .open-quote:before {
66
+ content: '\201C';
67
+ }
68
+
69
+ .testimonials-widget-testimonial .close-quote:after {
70
+ content: '\201D';
71
+ }
72
+
73
+ .testimonials-widget-testimonial cite,
74
+ .testimonials-widget-testimonial div.credit {
75
+ /* outer wrapper for source & company */
76
+ display: block; /* To display source and company on a new line */
77
+ margin-top: .2em;
78
+ text-align: right;
79
+ }
80
+
81
+ .widget .testimonials-widget-testimonial cite,
82
+ .widget .testimonials-widget-testimonial div.credit {
83
+ margin-top: .8em;
84
+ }
85
+
86
+ .widget .testimonials-widget-testimonial .whitespace cite,
87
+ .widget .whitespace cite,
88
+ .widget .testimonials-widget-testimonial .whitespace div.credit,
89
+ .widget .whitespace div.credit {
90
+ margin-top: .2em;
91
+ }
92
+
93
+ .testimonials-widget-testimonial cite:before,
94
+ .testimonials-widget-testimonial div.credit:before {
95
+ content: "– "
96
+ }
97
+
98
+ .testimonials-widget-testimonial .join-title:before,
99
+ .testimonials-widget-testimonial .join-location:before,
100
+ .testimonials-widget-testimonial .join:before {
101
+ /* join text */
102
+ content: ", "
103
+ }
104
+
105
+ .testimonials-widget-testimonial .author,
106
+ .testimonials-widget-testimonial .email,
107
+ .testimonials-widget-testimonial .title,
108
+ .testimonials-widget-testimonial .location,
109
+ .testimonials-widget-testimonial .company,
110
+ .testimonials-widget-testimonial .url {
111
+ /* testimonial title, company and url informaiton */
112
+ }
113
+
114
+ .testimonials-widget-testimonial .extra {
115
+ margin-top: .8em;
116
+ }
117
+
118
+ .testimonials-widget-testimonial .bottom_text {
119
+ margin-top: 1.4em;
120
+ }
css/testimonials-widget-ie7.css ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*csslint star-property-hack: false*/
2
+ .testimonials-widget-testimonial .open-quote {
3
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '“' );
4
+ }
5
+
6
+ .testimonials-widget-testimonial .close-quote {
7
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '”' );
8
+ }
9
+
10
+ .testimonials-widget-testimonial .join-title,
11
+ .testimonials-widget-testimonial .join-location,
12
+ .testimonials-widget-testimonial .join {
13
+ /* section between source and company information */
14
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ', ' );
15
+ }
js/jquery.bxslider.js ADDED
@@ -0,0 +1,1315 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * BxSlider v4.1.1 - Fully loaded, responsive content slider
3
+ * http://bxslider.com
4
+ *
5
+ * Copyright 2013, Steven Wanderski - http://stevenwanderski.com - http://bxcreative.com
6
+ * Written while drinking Belgian ales and listening to jazz
7
+ *
8
+ * Released under the MIT license - http://opensource.org/licenses/MIT
9
+ */
10
+
11
+ ;(function($){
12
+
13
+ var plugin = {};
14
+
15
+ var defaults = {
16
+
17
+ // GENERAL
18
+ mode: 'horizontal',
19
+ slideSelector: '',
20
+ infiniteLoop: true,
21
+ hideControlOnEnd: false,
22
+ speed: 500,
23
+ easing: null,
24
+ slideMargin: 0,
25
+ startSlide: 0,
26
+ randomStart: false,
27
+ captions: false,
28
+ ticker: false,
29
+ tickerHover: false,
30
+ adaptiveHeight: false,
31
+ adaptiveHeightSpeed: 500,
32
+ video: false,
33
+ useCSS: true,
34
+ preloadImages: 'visible',
35
+ responsive: true,
36
+
37
+ // TOUCH
38
+ touchEnabled: true,
39
+ swipeThreshold: 50,
40
+ oneToOneTouch: true,
41
+ preventDefaultSwipeX: true,
42
+ preventDefaultSwipeY: false,
43
+
44
+ // PAGER
45
+ pager: true,
46
+ pagerType: 'full',
47
+ pagerShortSeparator: ' / ',
48
+ pagerSelector: null,
49
+ buildPager: null,
50
+ pagerCustom: null,
51
+
52
+ // CONTROLS
53
+ controls: true,
54
+ nextText: 'Next',
55
+ prevText: 'Prev',
56
+ nextSelector: null,
57
+ prevSelector: null,
58
+ autoControls: false,
59
+ startText: 'Start',
60
+ stopText: 'Stop',
61
+ autoControlsCombine: false,
62
+ autoControlsSelector: null,
63
+
64
+ // AUTO
65
+ auto: false,
66
+ pause: 4000,
67
+ autoStart: true,
68
+ autoDirection: 'next',
69
+ autoHover: false,
70
+ autoDelay: 0,
71
+
72
+ // CAROUSEL
73
+ minSlides: 1,
74
+ maxSlides: 1,
75
+ moveSlides: 0,
76
+ slideWidth: 0,
77
+
78
+ // CALLBACKS
79
+ onSliderLoad: function() {},
80
+ onSlideBefore: function() {},
81
+ onSlideAfter: function() {},
82
+ onSlideNext: function() {},
83
+ onSlidePrev: function() {}
84
+ }
85
+
86
+ $.fn.bxSlider = function(options){
87
+
88
+ if(this.length == 0) return this;
89
+
90
+ // support mutltiple elements
91
+ if(this.length > 1){
92
+ this.each(function(){$(this).bxSlider(options)});
93
+ return this;
94
+ }
95
+
96
+ // create a namespace to be used throughout the plugin
97
+ var slider = {};
98
+ // set a reference to our slider element
99
+ var el = this;
100
+ plugin.el = this;
101
+
102
+ /**
103
+ * Makes slideshow responsive
104
+ */
105
+ // first get the original window dimens (thanks alot IE)
106
+ var windowWidth = $(window).width();
107
+ var windowHeight = $(window).height();
108
+
109
+
110
+
111
+ /**
112
+ * ===================================================================================
113
+ * = PRIVATE FUNCTIONS
114
+ * ===================================================================================
115
+ */
116
+
117
+ /**
118
+ * Initializes namespace settings to be used throughout plugin
119
+ */
120
+ var init = function(){
121
+ // merge user-supplied options with the defaults
122
+ slider.settings = $.extend({}, defaults, options);
123
+ // parse slideWidth setting
124
+ slider.settings.slideWidth = parseInt(slider.settings.slideWidth);
125
+ // store the original children
126
+ slider.children = el.children(slider.settings.slideSelector);
127
+ // check if actual number of slides is less than minSlides / maxSlides
128
+ if(slider.children.length < slider.settings.minSlides) slider.settings.minSlides = slider.children.length;
129
+ if(slider.children.length < slider.settings.maxSlides) slider.settings.maxSlides = slider.children.length;
130
+ // if random start, set the startSlide setting to random number
131
+ if(slider.settings.randomStart) slider.settings.startSlide = Math.floor(Math.random() * slider.children.length);
132
+ // store active slide information
133
+ slider.active = { index: slider.settings.startSlide }
134
+ // store if the slider is in carousel mode (displaying / moving multiple slides)
135
+ slider.carousel = slider.settings.minSlides > 1 || slider.settings.maxSlides > 1;
136
+ // if carousel, force preloadImages = 'all'
137
+ if(slider.carousel) slider.settings.preloadImages = 'all';
138
+ // calculate the min / max width thresholds based on min / max number of slides
139
+ // used to setup and update carousel slides dimensions
140
+ slider.minThreshold = (slider.settings.minSlides * slider.settings.slideWidth) + ((slider.settings.minSlides - 1) * slider.settings.slideMargin);
141
+ slider.maxThreshold = (slider.settings.maxSlides * slider.settings.slideWidth) + ((slider.settings.maxSlides - 1) * slider.settings.slideMargin);
142
+ // store the current state of the slider (if currently animating, working is true)
143
+ slider.working = false;
144
+ // initialize the controls object
145
+ slider.controls = {};
146
+ // initialize an auto interval
147
+ slider.interval = null;
148
+ // determine which property to use for transitions
149
+ slider.animProp = slider.settings.mode == 'vertical' ? 'top' : 'left';
150
+ // determine if hardware acceleration can be used
151
+ slider.usingCSS = slider.settings.useCSS && slider.settings.mode != 'fade' && (function(){
152
+ // create our test div element
153
+ var div = document.createElement('div');
154
+ // css transition properties
155
+ var props = ['WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
156
+ // test for each property
157
+ for(var i in props){
158
+ if(div.style[props[i]] !== undefined){
159
+ slider.cssPrefix = props[i].replace('Perspective', '').toLowerCase();
160
+ slider.animProp = '-' + slider.cssPrefix + '-transform';
161
+ return true;
162
+ }
163
+ }
164
+ return false;
165
+ }());
166
+ // if vertical mode always make maxSlides and minSlides equal
167
+ if(slider.settings.mode == 'vertical') slider.settings.maxSlides = slider.settings.minSlides;
168
+ // save original style data
169
+ el.data("origStyle", el.attr("style"));
170
+ el.children(slider.settings.slideSelector).each(function() {
171
+ $(this).data("origStyle", $(this).attr("style"));
172
+ });
173
+ // perform all DOM / CSS modifications
174
+ setup();
175
+ }
176
+
177
+ /**
178
+ * Performs all DOM and CSS modifications
179
+ */
180
+ var setup = function(){
181
+ // wrap el in a wrapper
182
+ el.wrap('<div class="bx-wrapper"><div class="bx-viewport"></div></div>');
183
+ // store a namspace reference to .bx-viewport
184
+ slider.viewport = el.parent();
185
+ // add a loading div to display while images are loading
186
+ slider.loader = $('<div class="bx-loading" />');
187
+ slider.viewport.prepend(slider.loader);
188
+ // set el to a massive width, to hold any needed slides
189
+ // also strip any margin and padding from el
190
+ el.css({
191
+ width: slider.settings.mode == 'horizontal' ? (slider.children.length * 100 + 215) + '%' : 'auto',
192
+ position: 'relative'
193
+ });
194
+ // if using CSS, add the easing property
195
+ if(slider.usingCSS && slider.settings.easing){
196
+ el.css('-' + slider.cssPrefix + '-transition-timing-function', slider.settings.easing);
197
+ // if not using CSS and no easing value was supplied, use the default JS animation easing (swing)
198
+ }else if(!slider.settings.easing){
199
+ slider.settings.easing = 'swing';
200
+ }
201
+ var slidesShowing = getNumberSlidesShowing();
202
+ // make modifications to the viewport (.bx-viewport)
203
+ slider.viewport.css({
204
+ width: '100%',
205
+ overflow: 'hidden',
206
+ position: 'relative'
207
+ });
208
+ slider.viewport.parent().css({
209
+ maxWidth: getViewportMaxWidth()
210
+ });
211
+ // make modification to the wrapper (.bx-wrapper)
212
+ if(!slider.settings.pager) {
213
+ slider.viewport.parent().css({
214
+ margin: '0 auto 0px'
215
+ });
216
+ }
217
+ // apply css to all slider children
218
+ slider.children.css({
219
+ 'float': slider.settings.mode == 'horizontal' ? 'left' : 'none',
220
+ listStyle: 'none',
221
+ position: 'relative'
222
+ });
223
+ // apply the calculated width after the float is applied to prevent scrollbar interference
224
+ slider.children.css('width', getSlideWidth());
225
+ // if slideMargin is supplied, add the css
226
+ if(slider.settings.mode == 'horizontal' && slider.settings.slideMargin > 0) slider.children.css('marginRight', slider.settings.slideMargin);
227
+ if(slider.settings.mode == 'vertical' && slider.settings.slideMargin > 0) slider.children.css('marginBottom', slider.settings.slideMargin);
228
+ // if "fade" mode, add positioning and z-index CSS
229
+ if(slider.settings.mode == 'fade'){
230
+ slider.children.css({
231
+ position: 'absolute',
232
+ zIndex: 0,
233
+ display: 'none'
234
+ });
235
+ // prepare the z-index on the showing element
236
+ slider.children.eq(slider.settings.startSlide).css({zIndex: 50, display: 'block'});
237
+ }
238
+ // create an element to contain all slider controls (pager, start / stop, etc)
239
+ slider.controls.el = $('<div class="bx-controls" />');
240
+ // if captions are requested, add them
241
+ if(slider.settings.captions) appendCaptions();
242
+ // check if startSlide is last slide
243
+ slider.active.last = slider.settings.startSlide == getPagerQty() - 1;
244
+ // if video is true, set up the fitVids plugin
245
+ if(slider.settings.video) el.fitVids();
246
+ // set the default preload selector (visible)
247
+ var preloadSelector = slider.children.eq(slider.settings.startSlide);
248
+ if (slider.settings.preloadImages == "all") preloadSelector = slider.children;
249
+ // only check for control addition if not in "ticker" mode
250
+ if(!slider.settings.ticker){
251
+ // if pager is requested, add it
252
+ if(slider.settings.pager) appendPager();
253
+ // if controls are requested, add them
254
+ if(slider.settings.controls) appendControls();
255
+ // if auto is true, and auto controls are requested, add them
256
+ if(slider.settings.auto && slider.settings.autoControls) appendControlsAuto();
257
+ // if any control option is requested, add the controls wrapper
258
+ if(slider.settings.controls || slider.settings.autoControls || slider.settings.pager) slider.viewport.after(slider.controls.el);
259
+ // if ticker mode, do not allow a pager
260
+ }else{
261
+ slider.settings.pager = false;
262
+ }
263
+ // preload all images, then perform final DOM / CSS modifications that depend on images being loaded
264
+ loadElements(preloadSelector, start);
265
+ }
266
+
267
+ var loadElements = function(selector, callback){
268
+ var total = selector.find('img, iframe').length;
269
+ if (total == 0){
270
+ callback();
271
+ return;
272
+ }
273
+ var count = 0;
274
+ selector.find('img, iframe').each(function(){
275
+ $(this).one('load', function() {
276
+ if(++count == total) callback();
277
+ }).each(function() {
278
+ if(this.complete) $(this).load();
279
+ });
280
+ });
281
+ }
282
+
283
+ /**
284
+ * Start the slider
285
+ */
286
+ var start = function(){
287
+ // if infinite loop, prepare additional slides
288
+ if(slider.settings.infiniteLoop && slider.settings.mode != 'fade' && !slider.settings.ticker){
289
+ var slice = slider.settings.mode == 'vertical' ? slider.settings.minSlides : slider.settings.maxSlides;
290
+ var sliceAppend = slider.children.slice(0, slice).clone().addClass('bx-clone');
291
+ var slicePrepend = slider.children.slice(-slice).clone().addClass('bx-clone');
292
+ el.append(sliceAppend).prepend(slicePrepend);
293
+ }
294
+ // remove the loading DOM element
295
+ slider.loader.remove();
296
+ // set the left / top position of "el"
297
+ setSlidePosition();
298
+ // if "vertical" mode, always use adaptiveHeight to prevent odd behavior
299
+ if (slider.settings.mode == 'vertical') slider.settings.adaptiveHeight = true;
300
+ // set the viewport height
301
+ slider.viewport.height(getViewportHeight());
302
+ // make sure everything is positioned just right (same as a window resize)
303
+ el.redrawSlider();
304
+ // onSliderLoad callback
305
+ slider.settings.onSliderLoad(slider.active.index);
306
+ // slider has been fully initialized
307
+ slider.initialized = true;
308
+ // bind the resize call to the window
309
+ if (slider.settings.responsive) $(window).bind('resize', resizeWindow);
310
+ // if auto is true, start the show
311
+ if (slider.settings.auto && slider.settings.autoStart) initAuto();
312
+ // if ticker is true, start the ticker
313
+ if (slider.settings.ticker) initTicker();
314
+ // if pager is requested, make the appropriate pager link active
315
+ if (slider.settings.pager) updatePagerActive(slider.settings.startSlide);
316
+ // check for any updates to the controls (like hideControlOnEnd updates)
317
+ if (slider.settings.controls) updateDirectionControls();
318
+ // if touchEnabled is true, setup the touch events
319
+ if (slider.settings.touchEnabled && !slider.settings.ticker) initTouch();
320
+ }
321
+
322
+ /**
323
+ * Returns the calculated height of the viewport, used to determine either adaptiveHeight or the maxHeight value
324
+ */
325
+ var getViewportHeight = function(){
326
+ var height = 0;
327
+ // first determine which children (slides) should be used in our height calculation
328
+ var children = $();
329
+ // if mode is not "vertical" and adaptiveHeight is false, include all children
330
+ if(slider.settings.mode != 'vertical' && !slider.settings.adaptiveHeight){
331
+ children = slider.children;
332
+ }else{
333
+ // if not carousel, return the single active child
334
+ if(!slider.carousel){
335
+ children = slider.children.eq(slider.active.index);
336
+ // if carousel, return a slice of children
337
+ }else{
338
+ // get the individual slide index
339
+ var currentIndex = slider.settings.moveSlides == 1 ? slider.active.index : slider.active.index * getMoveBy();
340
+ // add the current slide to the children
341
+ children = slider.children.eq(currentIndex);
342
+ // cycle through the remaining "showing" slides
343
+ for (i = 1; i <= slider.settings.maxSlides - 1; i++){
344
+ // if looped back to the start
345
+ if(currentIndex + i >= slider.children.length){
346
+ children = children.add(slider.children.eq(i - 1));
347
+ }else{
348
+ children = children.add(slider.children.eq(currentIndex + i));
349
+ }
350
+ }
351
+ }
352
+ }
353
+ // if "vertical" mode, calculate the sum of the heights of the children
354
+ if(slider.settings.mode == 'vertical'){
355
+ children.each(function(index) {
356
+ height += $(this).outerHeight();
357
+ });
358
+ // add user-supplied margins
359
+ if(slider.settings.slideMargin > 0){
360
+ height += slider.settings.slideMargin * (slider.settings.minSlides - 1);
361
+ }
362
+ // if not "vertical" mode, calculate the max height of the children
363
+ }else{
364
+ height = Math.max.apply(Math, children.map(function(){
365
+ return $(this).outerHeight(false);
366
+ }).get());
367
+ }
368
+ return height;
369
+ }
370
+
371
+ /**
372
+ * Returns the calculated width to be used for the outer wrapper / viewport
373
+ */
374
+ var getViewportMaxWidth = function(){
375
+ var width = '100%';
376
+ if(slider.settings.slideWidth > 0){
377
+ if(slider.settings.mode == 'horizontal'){
378
+ width = (slider.settings.maxSlides * slider.settings.slideWidth) + ((slider.settings.maxSlides - 1) * slider.settings.slideMargin);
379
+ }else{
380
+ width = slider.settings.slideWidth;
381
+ }
382
+ }
383
+ return width;
384
+ }
385
+
386
+ /**
387
+ * Returns the calculated width to be applied to each slide
388
+ */
389
+ var getSlideWidth = function(){
390
+ // start with any user-supplied slide width
391
+ var newElWidth = slider.settings.slideWidth;
392
+ // get the current viewport width
393
+ var wrapWidth = slider.viewport.width();
394
+ // if slide width was not supplied, or is larger than the viewport use the viewport width
395
+ if(slider.settings.slideWidth == 0 ||
396
+ (slider.settings.slideWidth > wrapWidth && !slider.carousel) ||
397
+ slider.settings.mode == 'vertical'){
398
+ newElWidth = wrapWidth;
399
+ // if carousel, use the thresholds to determine the width
400
+ }else if(slider.settings.maxSlides > 1 && slider.settings.mode == 'horizontal'){
401
+ if(wrapWidth > slider.maxThreshold){
402
+ // newElWidth = (wrapWidth - (slider.settings.slideMargin * (slider.settings.maxSlides - 1))) / slider.settings.maxSlides;
403
+ }else if(wrapWidth < slider.minThreshold){
404
+ newElWidth = (wrapWidth - (slider.settings.slideMargin * (slider.settings.minSlides - 1))) / slider.settings.minSlides;
405
+ }
406
+ }
407
+ return newElWidth;
408
+ }
409
+
410
+ /**
411
+ * Returns the number of slides currently visible in the viewport (includes partially visible slides)
412
+ */
413
+ var getNumberSlidesShowing = function(){
414
+ var slidesShowing = 1;
415
+ if(slider.settings.mode == 'horizontal' && slider.settings.slideWidth > 0){
416
+ // if viewport is smaller than minThreshold, return minSlides
417
+ if(slider.viewport.width() < slider.minThreshold){
418
+ slidesShowing = slider.settings.minSlides;
419
+ // if viewport is larger than minThreshold, return maxSlides
420
+ }else if(slider.viewport.width() > slider.maxThreshold){
421
+ slidesShowing = slider.settings.maxSlides;
422
+ // if viewport is between min / max thresholds, divide viewport width by first child width
423
+ }else{
424
+ var childWidth = slider.children.first().width();
425
+ slidesShowing = Math.floor(slider.viewport.width() / childWidth);
426
+ }
427
+ // if "vertical" mode, slides showing will always be minSlides
428
+ }else if(slider.settings.mode == 'vertical'){
429
+ slidesShowing = slider.settings.minSlides;
430
+ }
431
+ return slidesShowing;
432
+ }
433
+
434
+ /**
435
+ * Returns the number of pages (one full viewport of slides is one "page")
436
+ */
437
+ var getPagerQty = function(){
438
+ var pagerQty = 0;
439
+ // if moveSlides is specified by the user
440
+ if(slider.settings.moveSlides > 0){
441
+ if(slider.settings.infiniteLoop){
442
+ pagerQty = slider.children.length / getMoveBy();
443
+ }else{
444
+ // use a while loop to determine pages
445
+ var breakPoint = 0;
446
+ var counter = 0
447
+ // when breakpoint goes above children length, counter is the number of pages
448
+ while (breakPoint < slider.children.length){
449
+ ++pagerQty;
450
+ breakPoint = counter + getNumberSlidesShowing();
451
+ counter += slider.settings.moveSlides <= getNumberSlidesShowing() ? slider.settings.moveSlides : getNumberSlidesShowing();
452
+ }
453
+ }
454
+ // if moveSlides is 0 (auto) divide children length by sides showing, then round up
455
+ }else{
456
+ pagerQty = Math.ceil(slider.children.length / getNumberSlidesShowing());
457
+ }
458
+ return pagerQty;
459
+ }
460
+
461
+ /**
462
+ * Returns the number of indivual slides by which to shift the slider
463
+ */
464
+ var getMoveBy = function(){
465
+ // if moveSlides was set by the user and moveSlides is less than number of slides showing
466
+ if(slider.settings.moveSlides > 0 && slider.settings.moveSlides <= getNumberSlidesShowing()){
467
+ return slider.settings.moveSlides;
468
+ }
469
+ // if moveSlides is 0 (auto)
470
+ return getNumberSlidesShowing();
471
+ }
472
+
473
+ /**
474
+ * Sets the slider's (el) left or top position
475
+ */
476
+ var setSlidePosition = function(){
477
+ // if last slide, not infinite loop, and number of children is larger than specified maxSlides
478
+ if(slider.children.length > slider.settings.maxSlides && slider.active.last && !slider.settings.infiniteLoop){
479
+ if (slider.settings.mode == 'horizontal'){
480
+ // get the last child's position
481
+ var lastChild = slider.children.last();
482
+ var position = lastChild.position();
483
+ // set the left position
484
+ setPositionProperty(-(position.left - (slider.viewport.width() - lastChild.width())), 'reset', 0);
485
+ }else if(slider.settings.mode == 'vertical'){
486
+ // get the last showing index's position
487
+ var lastShowingIndex = slider.children.length - slider.settings.minSlides;
488
+ var position = slider.children.eq(lastShowingIndex).position();
489
+ // set the top position
490
+ setPositionProperty(-position.top, 'reset', 0);
491
+ }
492
+ // if not last slide
493
+ }else{
494
+ // get the position of the first showing slide
495
+ var position = slider.children.eq(slider.active.index * getMoveBy()).position();
496
+ // check for last slide
497
+ if (slider.active.index == getPagerQty() - 1) slider.active.last = true;
498
+ // set the repective position
499
+ if (position != undefined){
500
+ if (slider.settings.mode == 'horizontal') setPositionProperty(-position.left, 'reset', 0);
501
+ else if (slider.settings.mode == 'vertical') setPositionProperty(-position.top, 'reset', 0);
502
+ }
503
+ }
504
+ }
505
+
506
+ /**
507
+ * Sets the el's animating property position (which in turn will sometimes animate el).
508
+ * If using CSS, sets the transform property. If not using CSS, sets the top / left property.
509
+ *
510
+ * @param value (int)
511
+ * - the animating property's value
512
+ *
513
+ * @param type (string) 'slider', 'reset', 'ticker'
514
+ * - the type of instance for which the function is being
515
+ *
516
+ * @param duration (int)
517
+ * - the amount of time (in ms) the transition should occupy
518
+ *
519
+ * @param params (array) optional
520
+ * - an optional parameter containing any variables that need to be passed in
521
+ */
522
+ var setPositionProperty = function(value, type, duration, params){
523
+ // use CSS transform
524
+ if(slider.usingCSS){
525
+ // determine the translate3d value
526
+ var propValue = slider.settings.mode == 'vertical' ? 'translate3d(0, ' + value + 'px, 0)' : 'translate3d(' + value + 'px, 0, 0)';
527
+ // add the CSS transition-duration
528
+ el.css('-' + slider.cssPrefix + '-transition-duration', duration / 1000 + 's');
529
+ if(type == 'slide'){
530
+ // set the property value
531
+ el.css(slider.animProp, propValue);
532
+ // bind a callback method - executes when CSS transition completes
533
+ el.bind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function(){
534
+ // unbind the callback
535
+ el.unbind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd');
536
+ updateAfterSlideTransition();
537
+ });
538
+ }else if(type == 'reset'){
539
+ el.css(slider.animProp, propValue);
540
+ }else if(type == 'ticker'){
541
+ // make the transition use 'linear'
542
+ el.css('-' + slider.cssPrefix + '-transition-timing-function', 'linear');
543
+ el.css(slider.animProp, propValue);
544
+ // bind a callback method - executes when CSS transition completes
545
+ el.bind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function(){
546
+ // unbind the callback
547
+ el.unbind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd');
548
+ // reset the position
549
+ setPositionProperty(params['resetValue'], 'reset', 0);
550
+ // start the loop again
551
+ tickerLoop();
552
+ });
553
+ }
554
+ // use JS animate
555
+ }else{
556
+ var animateObj = {};
557
+ animateObj[slider.animProp] = value;
558
+ if(type == 'slide'){
559
+ el.animate(animateObj, duration, slider.settings.easing, function(){
560
+ updateAfterSlideTransition();
561
+ });
562
+ }else if(type == 'reset'){
563
+ el.css(slider.animProp, value)
564
+ }else if(type == 'ticker'){
565
+ el.animate(animateObj, speed, 'linear', function(){
566
+ setPositionProperty(params['resetValue'], 'reset', 0);
567
+ // run the recursive loop after animation
568
+ tickerLoop();
569
+ });
570
+ }
571
+ }
572
+ }
573
+
574
+ /**
575
+ * Populates the pager with proper amount of pages
576
+ */
577
+ var populatePager = function(){
578
+ var pagerHtml = '';
579
+ var pagerQty = getPagerQty();
580
+ // loop through each pager item
581
+ for(var i=0; i < pagerQty; i++){
582
+ var linkContent = '';
583
+ // if a buildPager function is supplied, use it to get pager link value, else use index + 1
584
+ if(slider.settings.buildPager && $.isFunction(slider.settings.buildPager)){
585
+ linkContent = slider.settings.buildPager(i);
586
+ slider.pagerEl.addClass('bx-custom-pager');
587
+ }else{
588
+ linkContent = i + 1;
589
+ slider.pagerEl.addClass('bx-default-pager');
590
+ }
591
+ // var linkContent = slider.settings.buildPager && $.isFunction(slider.settings.buildPager) ? slider.settings.buildPager(i) : i + 1;
592
+ // add the markup to the string
593
+ pagerHtml += '<div class="bx-pager-item"><a href="" data-slide-index="' + i + '" class="bx-pager-link">' + linkContent + '</a></div>';
594
+ };
595
+ // populate the pager element with pager links
596
+ slider.pagerEl.html(pagerHtml);
597
+ }
598
+
599
+ /**
600
+ * Appends the pager to the controls element
601
+ */
602
+ var appendPager = function(){
603
+ if(!slider.settings.pagerCustom){
604
+ // create the pager DOM element
605
+ slider.pagerEl = $('<div class="bx-pager" />');
606
+ // if a pager selector was supplied, populate it with the pager
607
+ if(slider.settings.pagerSelector){
608
+ $(slider.settings.pagerSelector).html(slider.pagerEl);
609
+ // if no pager selector was supplied, add it after the wrapper
610
+ }else{
611
+ slider.controls.el.addClass('bx-has-pager').append(slider.pagerEl);
612
+ }
613
+ // populate the pager
614
+ populatePager();
615
+ }else{
616
+ slider.pagerEl = $(slider.settings.pagerCustom);
617
+ }
618
+ // assign the pager click binding
619
+ slider.pagerEl.delegate('a', 'click', clickPagerBind);
620
+ }
621
+
622
+ /**
623
+ * Appends prev / next controls to the controls element
624
+ */
625
+ var appendControls = function(){
626
+ slider.controls.next = $('<a class="bx-next" href="">' + slider.settings.nextText + '</a>');
627
+ slider.controls.prev = $('<a class="bx-prev" href="">' + slider.settings.prevText + '</a>');
628
+ // bind click actions to the controls
629
+ slider.controls.next.bind('click', clickNextBind);
630
+ slider.controls.prev.bind('click', clickPrevBind);
631
+ // if nextSlector was supplied, populate it
632
+ if(slider.settings.nextSelector){
633
+ $(slider.settings.nextSelector).append(slider.controls.next);
634
+ }
635
+ // if prevSlector was supplied, populate it
636
+ if(slider.settings.prevSelector){
637
+ $(slider.settings.prevSelector).append(slider.controls.prev);
638
+ }
639
+ // if no custom selectors were supplied
640
+ if(!slider.settings.nextSelector && !slider.settings.prevSelector){
641
+ // add the controls to the DOM
642
+ slider.controls.directionEl = $('<div class="bx-controls-direction" />');
643
+ // add the control elements to the directionEl
644
+ slider.controls.directionEl.append(slider.controls.prev).append(slider.controls.next);
645
+ // slider.viewport.append(slider.controls.directionEl);
646
+ slider.controls.el.addClass('bx-has-controls-direction').append(slider.controls.directionEl);
647
+ }
648
+ }
649
+
650
+ /**
651
+ * Appends start / stop auto controls to the controls element
652
+ */
653
+ var appendControlsAuto = function(){
654
+ slider.controls.start = $('<div class="bx-controls-auto-item"><a class="bx-start" href="">' + slider.settings.startText + '</a></div>');
655
+ slider.controls.stop = $('<div class="bx-controls-auto-item"><a class="bx-stop" href="">' + slider.settings.stopText + '</a></div>');
656
+ // add the controls to the DOM
657
+ slider.controls.autoEl = $('<div class="bx-controls-auto" />');
658
+ // bind click actions to the controls
659
+ slider.controls.autoEl.delegate('.bx-start', 'click', clickStartBind);
660
+ slider.controls.autoEl.delegate('.bx-stop', 'click', clickStopBind);
661
+ // if autoControlsCombine, insert only the "start" control
662
+ if(slider.settings.autoControlsCombine){
663
+ slider.controls.autoEl.append(slider.controls.start);
664
+ // if autoControlsCombine is false, insert both controls
665
+ }else{
666
+ slider.controls.autoEl.append(slider.controls.start).append(slider.controls.stop);
667
+ }
668
+ // if auto controls selector was supplied, populate it with the controls
669
+ if(slider.settings.autoControlsSelector){
670
+ $(slider.settings.autoControlsSelector).html(slider.controls.autoEl);
671
+ // if auto controls selector was not supplied, add it after the wrapper
672
+ }else{
673
+ slider.controls.el.addClass('bx-has-controls-auto').append(slider.controls.autoEl);
674
+ }
675
+ // update the auto controls
676
+ updateAutoControls(slider.settings.autoStart ? 'stop' : 'start');
677
+ }
678
+
679
+ /**
680
+ * Appends image captions to the DOM
681
+ */
682
+ var appendCaptions = function(){
683
+ // cycle through each child
684
+ slider.children.each(function(index){
685
+ // get the image title attribute
686
+ var title = $(this).find('img:first').attr('title');
687
+ // append the caption
688
+ if (title != undefined && ('' + title).length) {
689
+ $(this).append('<div class="bx-caption"><span>' + title + '</span></div>');
690
+ }
691
+ });
692
+ }
693
+
694
+ /**
695
+ * Click next binding
696
+ *
697
+ * @param e (event)
698
+ * - DOM event object
699
+ */
700
+ var clickNextBind = function(e){
701
+ // if auto show is running, stop it
702
+ if (slider.settings.auto) el.stopAuto();
703
+ el.goToNextSlide();
704
+ e.preventDefault();
705
+ }
706
+
707
+ /**
708
+ * Click prev binding
709
+ *
710
+ * @param e (event)
711
+ * - DOM event object
712
+ */
713
+ var clickPrevBind = function(e){
714
+ // if auto show is running, stop it
715
+ if (slider.settings.auto) el.stopAuto();
716
+ el.goToPrevSlide();
717
+ e.preventDefault();
718
+ }
719
+
720
+ /**
721
+ * Click start binding
722
+ *
723
+ * @param e (event)
724
+ * - DOM event object
725
+ */
726
+ var clickStartBind = function(e){
727
+ el.startAuto();
728
+ e.preventDefault();
729
+ }
730
+
731
+ /**
732
+ * Click stop binding
733
+ *
734
+ * @param e (event)
735
+ * - DOM event object
736
+ */
737
+ var clickStopBind = function(e){
738
+ el.stopAuto();
739
+ e.preventDefault();
740
+ }
741
+
742
+ /**
743
+ * Click pager binding
744
+ *
745
+ * @param e (event)
746
+ * - DOM event object
747
+ */
748
+ var clickPagerBind = function(e){
749
+ // if auto show is running, stop it
750
+ if (slider.settings.auto) el.stopAuto();
751
+ var pagerLink = $(e.currentTarget);
752
+ var pagerIndex = parseInt(pagerLink.attr('data-slide-index'));
753
+ // if clicked pager link is not active, continue with the goToSlide call
754
+ if(pagerIndex != slider.active.index) el.goToSlide(pagerIndex);
755
+ e.preventDefault();
756
+ }
757
+
758
+ /**
759
+ * Updates the pager links with an active class
760
+ *
761
+ * @param slideIndex (int)
762
+ * - index of slide to make active
763
+ */
764
+ var updatePagerActive = function(slideIndex){
765
+ // if "short" pager type
766
+ var len = slider.children.length; // nb of children
767
+ if(slider.settings.pagerType == 'short'){
768
+ if(slider.settings.maxSlides > 1) {
769
+ len = Math.ceil(slider.children.length/slider.settings.maxSlides);
770
+ }
771
+ slider.pagerEl.html( (slideIndex + 1) + slider.settings.pagerShortSeparator + len);
772
+ return;
773
+ }
774
+ // remove all pager active classes
775
+ slider.pagerEl.find('a').removeClass('active');
776
+ // apply the active class for all pagers
777
+ slider.pagerEl.each(function(i, el) { $(el).find('a').eq(slideIndex).addClass('active'); });
778
+ }
779
+
780
+ /**
781
+ * Performs needed actions after a slide transition
782
+ */
783
+ var updateAfterSlideTransition = function(){
784
+ // if infinte loop is true
785
+ if(slider.settings.infiniteLoop){
786
+ var position = '';
787
+ // first slide
788
+ if(slider.active.index == 0){
789
+ // set the new position
790
+ position = slider.children.eq(0).position();
791
+ // carousel, last slide
792
+ }else if(slider.active.index == getPagerQty() - 1 && slider.carousel){
793
+ position = slider.children.eq((getPagerQty() - 1) * getMoveBy()).position();
794
+ // last slide
795
+ }else if(slider.active.index == slider.children.length - 1){
796
+ position = slider.children.eq(slider.children.length - 1).position();
797
+ }
798
+ if (slider.settings.mode == 'horizontal') { setPositionProperty(-position.left, 'reset', 0);; }
799
+ else if (slider.settings.mode == 'vertical') { setPositionProperty(-position.top, 'reset', 0);; }
800
+ }
801
+ // declare that the transition is complete
802
+ slider.working = false;
803
+ // onSlideAfter callback
804
+ slider.settings.onSlideAfter(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
805
+ }
806
+
807
+ /**
808
+ * Updates the auto controls state (either active, or combined switch)
809
+ *
810
+ * @param state (string) "start", "stop"
811
+ * - the new state of the auto show
812
+ */
813
+ var updateAutoControls = function(state){
814
+ // if autoControlsCombine is true, replace the current control with the new state
815
+ if(slider.settings.autoControlsCombine){
816
+ slider.controls.autoEl.html(slider.controls[state]);
817
+ // if autoControlsCombine is false, apply the "active" class to the appropriate control
818
+ }else{
819
+ slider.controls.autoEl.find('a').removeClass('active');
820
+ slider.controls.autoEl.find('a:not(.bx-' + state + ')').addClass('active');
821
+ }
822
+ }
823
+
824
+ /**
825
+ * Updates the direction controls (checks if either should be hidden)
826
+ */
827
+ var updateDirectionControls = function(){
828
+ if(getPagerQty() == 1){
829
+ slider.controls.prev.addClass('disabled');
830
+ slider.controls.next.addClass('disabled');
831
+ }else if(!slider.settings.infiniteLoop && slider.settings.hideControlOnEnd){
832
+ // if first slide
833
+ if (slider.active.index == 0){
834
+ slider.controls.prev.addClass('disabled');
835
+ slider.controls.next.removeClass('disabled');
836
+ // if last slide
837
+ }else if(slider.active.index == getPagerQty() - 1){
838
+ slider.controls.next.addClass('disabled');
839
+ slider.controls.prev.removeClass('disabled');
840
+ // if any slide in the middle
841
+ }else{
842
+ slider.controls.prev.removeClass('disabled');
843
+ slider.controls.next.removeClass('disabled');
844
+ }
845
+ }
846
+ }
847
+
848
+ /**
849
+ * Initialzes the auto process
850
+ */
851
+ var initAuto = function(){
852
+ // if autoDelay was supplied, launch the auto show using a setTimeout() call
853
+ if(slider.settings.autoDelay > 0){
854
+ var timeout = setTimeout(el.startAuto, slider.settings.autoDelay);
855
+ // if autoDelay was not supplied, start the auto show normally
856
+ }else{
857
+ el.startAuto();
858
+ }
859
+ // if autoHover is requested
860
+ if(slider.settings.autoHover){
861
+ // on el hover
862
+ el.hover(function(){
863
+ // if the auto show is currently playing (has an active interval)
864
+ if(slider.interval){
865
+ // stop the auto show and pass true agument which will prevent control update
866
+ el.stopAuto(true);
867
+ // create a new autoPaused value which will be used by the relative "mouseout" event
868
+ slider.autoPaused = true;
869
+ }
870
+ }, function(){
871
+ // if the autoPaused value was created be the prior "mouseover" event
872
+ if(slider.autoPaused){
873
+ // start the auto show and pass true agument which will prevent control update
874
+ el.startAuto(true);
875
+ // reset the autoPaused value
876
+ slider.autoPaused = null;
877
+ }
878
+ });
879
+ }
880
+ }
881
+
882
+ /**
883
+ * Initialzes the ticker process
884
+ */
885
+ var initTicker = function(){
886
+ var startPosition = 0;
887
+ // if autoDirection is "next", append a clone of the entire slider
888
+ if(slider.settings.autoDirection == 'next'){
889
+ el.append(slider.children.clone().addClass('bx-clone'));
890
+ // if autoDirection is "prev", prepend a clone of the entire slider, and set the left position
891
+ }else{
892
+ el.prepend(slider.children.clone().addClass('bx-clone'));
893
+ var position = slider.children.first().position();
894
+ startPosition = slider.settings.mode == 'horizontal' ? -position.left : -position.top;
895
+ }
896
+ setPositionProperty(startPosition, 'reset', 0);
897
+ // do not allow controls in ticker mode
898
+ slider.settings.pager = false;
899
+ slider.settings.controls = false;
900
+ slider.settings.autoControls = false;
901
+ // if autoHover is requested
902
+ if(slider.settings.tickerHover && !slider.usingCSS){
903
+ // on el hover
904
+ slider.viewport.hover(function(){
905
+ el.stop();
906
+ }, function(){
907
+ // calculate the total width of children (used to calculate the speed ratio)
908
+ var totalDimens = 0;
909
+ slider.children.each(function(index){
910
+ totalDimens += slider.settings.mode == 'horizontal' ? $(this).outerWidth(true) : $(this).outerHeight(true);
911
+ });
912
+ // calculate the speed ratio (used to determine the new speed to finish the paused animation)
913
+ var ratio = slider.settings.speed / totalDimens;
914
+ // determine which property to use
915
+ var property = slider.settings.mode == 'horizontal' ? 'left' : 'top';
916
+ // calculate the new speed
917
+ var newSpeed = ratio * (totalDimens - (Math.abs(parseInt(el.css(property)))));
918
+ tickerLoop(newSpeed);
919
+ });
920
+ }
921
+ // start the ticker loop
922
+ tickerLoop();
923
+ }
924
+
925
+ /**
926
+ * Runs a continuous loop, news ticker-style
927
+ */
928
+ var tickerLoop = function(resumeSpeed){
929
+ speed = resumeSpeed ? resumeSpeed : slider.settings.speed;
930
+ var position = {left: 0, top: 0};
931
+ var reset = {left: 0, top: 0};
932
+ // if "next" animate left position to last child, then reset left to 0
933
+ if(slider.settings.autoDirection == 'next'){
934
+ position = el.find('.bx-clone').first().position();
935
+ // if "prev" animate left position to 0, then reset left to first non-clone child
936
+ }else{
937
+ reset = slider.children.first().position();
938
+ }
939
+ var animateProperty = slider.settings.mode == 'horizontal' ? -position.left : -position.top;
940
+ var resetValue = slider.settings.mode == 'horizontal' ? -reset.left : -reset.top;
941
+ var params = {resetValue: resetValue};
942
+ setPositionProperty(animateProperty, 'ticker', speed, params);
943
+ }
944
+
945
+ /**
946
+ * Initializes touch events
947
+ */
948
+ var initTouch = function(){
949
+ // initialize object to contain all touch values
950
+ slider.touch = {
951
+ start: {x: 0, y: 0},
952
+ end: {x: 0, y: 0}
953
+ }
954
+ slider.viewport.bind('touchstart', onTouchStart);
955
+ }
956
+
957
+ /**
958
+ * Event handler for "touchstart"
959
+ *
960
+ * @param e (event)
961
+ * - DOM event object
962
+ */
963
+ var onTouchStart = function(e){
964
+ if(slider.working){
965
+ e.preventDefault();
966
+ }else{
967
+ // record the original position when touch starts
968
+ slider.touch.originalPos = el.position();
969
+ var orig = e.originalEvent;
970
+ // record the starting touch x, y coordinates
971
+ slider.touch.start.x = orig.changedTouches[0].pageX;
972
+ slider.touch.start.y = orig.changedTouches[0].pageY;
973
+ // bind a "touchmove" event to the viewport
974
+ slider.viewport.bind('touchmove', onTouchMove);
975
+ // bind a "touchend" event to the viewport
976
+ slider.viewport.bind('touchend', onTouchEnd);
977
+ }
978
+ }
979
+
980
+ /**
981
+ * Event handler for "touchmove"
982
+ *
983
+ * @param e (event)
984
+ * - DOM event object
985
+ */
986
+ var onTouchMove = function(e){
987
+ var orig = e.originalEvent;
988
+ // if scrolling on y axis, do not prevent default
989
+ var xMovement = Math.abs(orig.changedTouches[0].pageX - slider.touch.start.x);
990
+ var yMovement = Math.abs(orig.changedTouches[0].pageY - slider.touch.start.y);
991
+ // x axis swipe
992
+ if((xMovement * 3) > yMovement && slider.settings.preventDefaultSwipeX){
993
+ e.preventDefault();
994
+ // y axis swipe
995
+ }else if((yMovement * 3) > xMovement && slider.settings.preventDefaultSwipeY){
996
+ e.preventDefault();
997
+ }
998
+ if(slider.settings.mode != 'fade' && slider.settings.oneToOneTouch){
999
+ var value = 0;
1000
+ // if horizontal, drag along x axis
1001
+ if(slider.settings.mode == 'horizontal'){
1002
+ var change = orig.changedTouches[0].pageX - slider.touch.start.x;
1003
+ value = slider.touch.originalPos.left + change;
1004
+ // if vertical, drag along y axis
1005
+ }else{
1006
+ var change = orig.changedTouches[0].pageY - slider.touch.start.y;
1007
+ value = slider.touch.originalPos.top + change;
1008
+ }
1009
+ setPositionProperty(value, 'reset', 0);
1010
+ }
1011
+ }
1012
+
1013
+ /**
1014
+ * Event handler for "touchend"
1015
+ *
1016
+ * @param e (event)
1017
+ * - DOM event object
1018
+ */
1019
+ var onTouchEnd = function(e){
1020
+ slider.viewport.unbind('touchmove', onTouchMove);
1021
+ var orig = e.originalEvent;
1022
+ var value = 0;
1023
+ // record end x, y positions
1024
+ slider.touch.end.x = orig.changedTouches[0].pageX;
1025
+ slider.touch.end.y = orig.changedTouches[0].pageY;
1026
+ // if fade mode, check if absolute x distance clears the threshold
1027
+ if(slider.settings.mode == 'fade'){
1028
+ var distance = Math.abs(slider.touch.start.x - slider.touch.end.x);
1029
+ if(distance >= slider.settings.swipeThreshold){
1030
+ slider.touch.start.x > slider.touch.end.x ? el.goToNextSlide() : el.goToPrevSlide();
1031
+ el.stopAuto();
1032
+ }
1033
+ // not fade mode
1034
+ }else{
1035
+ var distance = 0;
1036
+ // calculate distance and el's animate property
1037
+ if(slider.settings.mode == 'horizontal'){
1038
+ distance = slider.touch.end.x - slider.touch.start.x;
1039
+ value = slider.touch.originalPos.left;
1040
+ }else{
1041
+ distance = slider.touch.end.y - slider.touch.start.y;
1042
+ value = slider.touch.originalPos.top;
1043
+ }
1044
+ // if not infinite loop and first / last slide, do not attempt a slide transition
1045
+ if(!slider.settings.infiniteLoop && ((slider.active.index == 0 && distance > 0) || (slider.active.last && distance < 0))){
1046
+ setPositionProperty(value, 'reset', 200);
1047
+ }else{
1048
+ // check if distance clears threshold
1049
+ if(Math.abs(distance) >= slider.settings.swipeThreshold){
1050
+ distance < 0 ? el.goToNextSlide() : el.goToPrevSlide();
1051
+ el.stopAuto();
1052
+ }else{
1053
+ // el.animate(property, 200);
1054
+ setPositionProperty(value, 'reset', 200);
1055
+ }
1056
+ }
1057
+ }
1058
+ slider.viewport.unbind('touchend', onTouchEnd);
1059
+ }
1060
+
1061
+ /**
1062
+ * Window resize event callback
1063
+ */
1064
+ var resizeWindow = function(e){
1065
+ // get the new window dimens (again, thank you IE)
1066
+ var windowWidthNew = $(window).width();
1067
+ var windowHeightNew = $(window).height();
1068
+ // make sure that it is a true window resize
1069
+ // *we must check this because our dinosaur friend IE fires a window resize event when certain DOM elements
1070
+ // are resized. Can you just die already?*
1071
+ if(windowWidth != windowWidthNew || windowHeight != windowHeightNew){
1072
+ // set the new window dimens
1073
+ windowWidth = windowWidthNew;
1074
+ windowHeight = windowHeightNew;
1075
+ // update all dynamic elements
1076
+ el.redrawSlider();
1077
+ }
1078
+ }
1079
+
1080
+ /**
1081
+ * ===================================================================================
1082
+ * = PUBLIC FUNCTIONS
1083
+ * ===================================================================================
1084
+ */
1085
+
1086
+ /**
1087
+ * Performs slide transition to the specified slide
1088
+ *
1089
+ * @param slideIndex (int)
1090
+ * - the destination slide's index (zero-based)
1091
+ *
1092
+ * @param direction (string)
1093
+ * - INTERNAL USE ONLY - the direction of travel ("prev" / "next")
1094
+ */
1095
+ el.goToSlide = function(slideIndex, direction){
1096
+ // if plugin is currently in motion, ignore request
1097
+ if(slider.working || slider.active.index == slideIndex) return;
1098
+ // declare that plugin is in motion
1099
+ slider.working = true;
1100
+ // store the old index
1101
+ slider.oldIndex = slider.active.index;
1102
+ // if slideIndex is less than zero, set active index to last child (this happens during infinite loop)
1103
+ if(slideIndex < 0){
1104
+ slider.active.index = getPagerQty() - 1;
1105
+ // if slideIndex is greater than children length, set active index to 0 (this happens during infinite loop)
1106
+ }else if(slideIndex >= getPagerQty()){
1107
+ slider.active.index = 0;
1108
+ // set active index to requested slide
1109
+ }else{
1110
+ slider.active.index = slideIndex;
1111
+ }
1112
+ // onSlideBefore, onSlideNext, onSlidePrev callbacks
1113
+ slider.settings.onSlideBefore(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1114
+ if(direction == 'next'){
1115
+ slider.settings.onSlideNext(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1116
+ }else if(direction == 'prev'){
1117
+ slider.settings.onSlidePrev(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1118
+ }
1119
+ // check if last slide
1120
+ slider.active.last = slider.active.index >= getPagerQty() - 1;
1121
+ // update the pager with active class
1122
+ if(slider.settings.pager) updatePagerActive(slider.active.index);
1123
+ // // check for direction control update
1124
+ if(slider.settings.controls) updateDirectionControls();
1125
+ // if slider is set to mode: "fade"
1126
+ if(slider.settings.mode == 'fade'){
1127
+ // if adaptiveHeight is true and next height is different from current height, animate to the new height
1128
+ if(slider.settings.adaptiveHeight && slider.viewport.height() != getViewportHeight()){
1129
+ slider.viewport.animate({height: getViewportHeight()}, slider.settings.adaptiveHeightSpeed);
1130
+ }
1131
+ // fade out the visible child and reset its z-index value
1132
+ slider.children.filter(':visible').fadeOut(slider.settings.speed).css({zIndex: 0});
1133
+ // fade in the newly requested slide
1134
+ slider.children.eq(slider.active.index).css('zIndex', 51).fadeIn(slider.settings.speed, function(){
1135
+ $(this).css('zIndex', 50);
1136
+ updateAfterSlideTransition();
1137
+ });
1138
+ // slider mode is not "fade"
1139
+ }else{
1140
+ // if adaptiveHeight is true and next height is different from current height, animate to the new height
1141
+ if(slider.settings.adaptiveHeight && slider.viewport.height() != getViewportHeight()){
1142
+ slider.viewport.animate({height: getViewportHeight()}, slider.settings.adaptiveHeightSpeed);
1143
+ }
1144
+ var moveBy = 0;
1145
+ var position = {left: 0, top: 0};
1146
+ // if carousel and not infinite loop
1147
+ if(!slider.settings.infiniteLoop && slider.carousel && slider.active.last){
1148
+ if(slider.settings.mode == 'horizontal'){
1149
+ // get the last child position
1150
+ var lastChild = slider.children.eq(slider.children.length - 1);
1151
+ position = lastChild.position();
1152
+ // calculate the position of the last slide
1153
+ moveBy = slider.viewport.width() - lastChild.outerWidth();
1154
+ }else{
1155
+ // get last showing index position
1156
+ var lastShowingIndex = slider.children.length - slider.settings.minSlides;
1157
+ position = slider.children.eq(lastShowingIndex).position();
1158
+ }
1159
+ // horizontal carousel, going previous while on first slide (infiniteLoop mode)
1160
+ }else if(slider.carousel && slider.active.last && direction == 'prev'){
1161
+ // get the last child position
1162
+ var eq = slider.settings.moveSlides == 1 ? slider.settings.maxSlides - getMoveBy() : ((getPagerQty() - 1) * getMoveBy()) - (slider.children.length - slider.settings.maxSlides);
1163
+ var lastChild = el.children('.bx-clone').eq(eq);
1164
+ position = lastChild.position();
1165
+ // if infinite loop and "Next" is clicked on the last slide
1166
+ }else if(direction == 'next' && slider.active.index == 0){
1167
+ // get the last clone position
1168
+ position = el.find('> .bx-clone').eq(slider.settings.maxSlides).position();
1169
+ slider.active.last = false;
1170
+ // normal non-zero requests
1171
+ }else if(slideIndex >= 0){
1172
+ var requestEl = slideIndex * getMoveBy();
1173
+ position = slider.children.eq(requestEl).position();
1174
+ }
1175
+
1176
+ /* If the position doesn't exist
1177
+ * (e.g. if you destroy the slider on a next click),
1178
+ * it doesn't throw an error.
1179
+ */
1180
+ if ("undefined" !== typeof(position)) {
1181
+ var value = slider.settings.mode == 'horizontal' ? -(position.left - moveBy) : -position.top;
1182
+ // plugin values to be animated
1183
+ setPositionProperty(value, 'slide', slider.settings.speed);
1184
+ }
1185
+ }
1186
+ }
1187
+
1188
+ /**
1189
+ * Transitions to the next slide in the show
1190
+ */
1191
+ el.goToNextSlide = function(){
1192
+ // if infiniteLoop is false and last page is showing, disregard call
1193
+ if (!slider.settings.infiniteLoop && slider.active.last) return;
1194
+ var pagerIndex = parseInt(slider.active.index) + 1;
1195
+ el.goToSlide(pagerIndex, 'next');
1196
+ }
1197
+
1198
+ /**
1199
+ * Transitions to the prev slide in the show
1200
+ */
1201
+ el.goToPrevSlide = function(){
1202
+ // if infiniteLoop is false and last page is showing, disregard call
1203
+ if (!slider.settings.infiniteLoop && slider.active.index == 0) return;
1204
+ var pagerIndex = parseInt(slider.active.index) - 1;
1205
+ el.goToSlide(pagerIndex, 'prev');
1206
+ }
1207
+
1208
+ /**
1209
+ * Starts the auto show
1210
+ *
1211
+ * @param preventControlUpdate (boolean)
1212
+ * - if true, auto controls state will not be updated
1213
+ */
1214
+ el.startAuto = function(preventControlUpdate){
1215
+ // if an interval already exists, disregard call
1216
+ if(slider.interval) return;
1217
+ // create an interval
1218
+ slider.interval = setInterval(function(){
1219
+ slider.settings.autoDirection == 'next' ? el.goToNextSlide() : el.goToPrevSlide();
1220
+ }, slider.settings.pause);
1221
+ // if auto controls are displayed and preventControlUpdate is not true
1222
+ if (slider.settings.autoControls && preventControlUpdate != true) updateAutoControls('stop');
1223
+ }
1224
+
1225
+ /**
1226
+ * Stops the auto show
1227
+ *
1228
+ * @param preventControlUpdate (boolean)
1229
+ * - if true, auto controls state will not be updated
1230
+ */
1231
+ el.stopAuto = function(preventControlUpdate){
1232
+ // if no interval exists, disregard call
1233
+ if(!slider.interval) return;
1234
+ // clear the interval
1235
+ clearInterval(slider.interval);
1236
+ slider.interval = null;
1237
+ // if auto controls are displayed and preventControlUpdate is not true
1238
+ if (slider.settings.autoControls && preventControlUpdate != true) updateAutoControls('start');
1239
+ }
1240
+
1241
+ /**
1242
+ * Returns current slide index (zero-based)
1243
+ */
1244
+ el.getCurrentSlide = function(){
1245
+ return slider.active.index;
1246
+ }
1247
+
1248
+ /**
1249
+ * Returns number of slides in show
1250
+ */
1251
+ el.getSlideCount = function(){
1252
+ return slider.children.length;
1253
+ }
1254
+
1255
+ /**
1256
+ * Update all dynamic slider elements
1257
+ */
1258
+ el.redrawSlider = function(){
1259
+ // resize all children in ratio to new screen size
1260
+ slider.children.add(el.find('.bx-clone')).outerWidth(getSlideWidth());
1261
+ // adjust the height
1262
+ slider.viewport.css('height', getViewportHeight());
1263
+ // update the slide position
1264
+ if(!slider.settings.ticker) setSlidePosition();
1265
+ // if active.last was true before the screen resize, we want
1266
+ // to keep it last no matter what screen size we end on
1267
+ if (slider.active.last) slider.active.index = getPagerQty() - 1;
1268
+ // if the active index (page) no longer exists due to the resize, simply set the index as last
1269
+ if (slider.active.index >= getPagerQty()) slider.active.last = true;
1270
+ // if a pager is being displayed and a custom pager is not being used, update it
1271
+ if(slider.settings.pager && !slider.settings.pagerCustom){
1272
+ populatePager();
1273
+ updatePagerActive(slider.active.index);
1274
+ }
1275
+ }
1276
+
1277
+ /**
1278
+ * Destroy the current instance of the slider (revert everything back to original state)
1279
+ */
1280
+ el.destroySlider = function(){
1281
+ // don't do anything if slider has already been destroyed
1282
+ if(!slider.initialized) return;
1283
+ slider.initialized = false;
1284
+ $('.bx-clone', this).remove();
1285
+ slider.children.each(function() {
1286
+ $(this).data("origStyle") != undefined ? $(this).attr("style", $(this).data("origStyle")) : $(this).removeAttr('style');
1287
+ });
1288
+ $(this).data("origStyle") != undefined ? this.attr("style", $(this).data("origStyle")) : $(this).removeAttr('style');
1289
+ $(this).unwrap().unwrap();
1290
+ if(slider.controls.el) slider.controls.el.remove();
1291
+ if(slider.controls.next) slider.controls.next.remove();
1292
+ if(slider.controls.prev) slider.controls.prev.remove();
1293
+ if(slider.pagerEl) slider.pagerEl.remove();
1294
+ $('.bx-caption', this).remove();
1295
+ if(slider.controls.autoEl) slider.controls.autoEl.remove();
1296
+ clearInterval(slider.interval);
1297
+ if(slider.settings.responsive) $(window).unbind('resize', resizeWindow);
1298
+ }
1299
+
1300
+ /**
1301
+ * Reload the slider (revert all DOM changes, and re-initialize)
1302
+ */
1303
+ el.reloadSlider = function(settings){
1304
+ if (settings != undefined) options = settings;
1305
+ el.destroySlider();
1306
+ init();
1307
+ }
1308
+
1309
+ init();
1310
+
1311
+ // returns the current jQuery object
1312
+ return this;
1313
+ }
1314
+
1315
+ })(jQuery);
js/jquery.easing.1.3.js ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
3
+ *
4
+ * Uses the built in easing capabilities added In jQuery 1.1
5
+ * to offer multiple easing options
6
+ *
7
+ * TERMS OF USE - jQuery Easing
8
+ *
9
+ * Open source under the BSD License.
10
+ *
11
+ * Copyright © 2008 George McGinley Smith
12
+ * All rights reserved.
13
+ *
14
+ * Redistribution and use in source and binary forms, with or without modification,
15
+ * are permitted provided that the following conditions are met:
16
+ *
17
+ * Redistributions of source code must retain the above copyright notice, this list of
18
+ * conditions and the following disclaimer.
19
+ * Redistributions in binary form must reproduce the above copyright notice, this list
20
+ * of conditions and the following disclaimer in the documentation and/or other materials
21
+ * provided with the distribution.
22
+ *
23
+ * Neither the name of the author nor the names of contributors may be used to endorse
24
+ * or promote products derived from this software without specific prior written permission.
25
+ *
26
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
27
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
28
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
31
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
32
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ // t: current time, b: begInnIng value, c: change In value, d: duration
39
+ jQuery.easing['jswing'] = jQuery.easing['swing'];
40
+
41
+ jQuery.extend( jQuery.easing,
42
+ {
43
+ def: 'easeOutQuad',
44
+ swing: function (x, t, b, c, d) {
45
+ //alert(jQuery.easing.default);
46
+ return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
47
+ },
48
+ easeInQuad: function (x, t, b, c, d) {
49
+ return c*(t/=d)*t + b;
50
+ },
51
+ easeOutQuad: function (x, t, b, c, d) {
52
+ return -c *(t/=d)*(t-2) + b;
53
+ },
54
+ easeInOutQuad: function (x, t, b, c, d) {
55
+ if ((t/=d/2) < 1) return c/2*t*t + b;
56
+ return -c/2 * ((--t)*(t-2) - 1) + b;
57
+ },
58
+ easeInCubic: function (x, t, b, c, d) {
59
+ return c*(t/=d)*t*t + b;
60
+ },
61
+ easeOutCubic: function (x, t, b, c, d) {
62
+ return c*((t=t/d-1)*t*t + 1) + b;
63
+ },
64
+ easeInOutCubic: function (x, t, b, c, d) {
65
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
66
+ return c/2*((t-=2)*t*t + 2) + b;
67
+ },
68
+ easeInQuart: function (x, t, b, c, d) {
69
+ return c*(t/=d)*t*t*t + b;
70
+ },
71
+ easeOutQuart: function (x, t, b, c, d) {
72
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
73
+ },
74
+ easeInOutQuart: function (x, t, b, c, d) {
75
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
76
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
77
+ },
78
+ easeInQuint: function (x, t, b, c, d) {
79
+ return c*(t/=d)*t*t*t*t + b;
80
+ },
81
+ easeOutQuint: function (x, t, b, c, d) {
82
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
83
+ },
84
+ easeInOutQuint: function (x, t, b, c, d) {
85
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
86
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
87
+ },
88
+ easeInSine: function (x, t, b, c, d) {
89
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
90
+ },
91
+ easeOutSine: function (x, t, b, c, d) {
92
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
93
+ },
94
+ easeInOutSine: function (x, t, b, c, d) {
95
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
96
+ },
97
+ easeInExpo: function (x, t, b, c, d) {
98
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
99
+ },
100
+ easeOutExpo: function (x, t, b, c, d) {
101
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
102
+ },
103
+ easeInOutExpo: function (x, t, b, c, d) {
104
+ if (t==0) return b;
105
+ if (t==d) return b+c;
106
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
107
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
108
+ },
109
+ easeInCirc: function (x, t, b, c, d) {
110
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
111
+ },
112
+ easeOutCirc: function (x, t, b, c, d) {
113
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
114
+ },
115
+ easeInOutCirc: function (x, t, b, c, d) {
116
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
117
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
118
+ },
119
+ easeInElastic: function (x, t, b, c, d) {
120
+ var s=1.70158;var p=0;var a=c;
121
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
122
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
123
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
124
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
125
+ },
126
+ easeOutElastic: function (x, t, b, c, d) {
127
+ var s=1.70158;var p=0;var a=c;
128
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
129
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
130
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
131
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
132
+ },
133
+ easeInOutElastic: function (x, t, b, c, d) {
134
+ var s=1.70158;var p=0;var a=c;
135
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
136
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
137
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
138
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
139
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
140
+ },
141
+ easeInBack: function (x, t, b, c, d, s) {
142
+ if (s == undefined) s = 1.70158;
143
+ return c*(t/=d)*t*((s+1)*t - s) + b;
144
+ },
145
+ easeOutBack: function (x, t, b, c, d, s) {
146
+ if (s == undefined) s = 1.70158;
147
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
148
+ },
149
+ easeInOutBack: function (x, t, b, c, d, s) {
150
+ if (s == undefined) s = 1.70158;
151
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
152
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
153
+ },
154
+ easeInBounce: function (x, t, b, c, d) {
155
+ return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
156
+ },
157
+ easeOutBounce: function (x, t, b, c, d) {
158
+ if ((t/=d) < (1/2.75)) {
159
+ return c*(7.5625*t*t) + b;
160
+ } else if (t < (2/2.75)) {
161
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
162
+ } else if (t < (2.5/2.75)) {
163
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
164
+ } else {
165
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
166
+ }
167
+ },
168
+ easeInOutBounce: function (x, t, b, c, d) {
169
+ if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
170
+ return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
171
+ }
172
+ });
173
+
174
+ /*
175
+ *
176
+ * TERMS OF USE - EASING EQUATIONS
177
+ *
178
+ * Open source under the BSD License.
179
+ *
180
+ * Copyright © 2001 Robert Penner
181
+ * All rights reserved.
182
+ *
183
+ * Redistribution and use in source and binary forms, with or without modification,
184
+ * are permitted provided that the following conditions are met:
185
+ *
186
+ * Redistributions of source code must retain the above copyright notice, this list of
187
+ * conditions and the following disclaimer.
188
+ * Redistributions in binary form must reproduce the above copyright notice, this list
189
+ * of conditions and the following disclaimer in the documentation and/or other materials
190
+ * provided with the distribution.
191
+ *
192
+ * Neither the name of the author nor the names of contributors may be used to endorse
193
+ * or promote products derived from this software without specific prior written permission.
194
+ *
195
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
196
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
197
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
198
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
199
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
200
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
201
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
202
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
203
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
204
+ *
205
+ */
js/jquery.fitvids.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*global jQuery */
2
+ /*jshint multistr:true browser:true */
3
+ /*!
4
+ * FitVids 1.0
5
+ *
6
+ * Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
7
+ * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
8
+ * Released under the WTFPL license - http://sam.zoy.org/wtfpl/
9
+ *
10
+ * Date: Thu Sept 01 18:00:00 2011 -0500
11
+ */
12
+
13
+ (function( $ ){
14
+
15
+ "use strict";
16
+
17
+ $.fn.fitVids = function( options ) {
18
+ var settings = {
19
+ customSelector: null
20
+ };
21
+
22
+ var div = document.createElement('div'),
23
+ ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];
24
+
25
+ div.className = 'fit-vids-style';
26
+ div.innerHTML = '&shy;<style> \
27
+ .fluid-width-video-wrapper { \
28
+ width: 100%; \
29
+ position: relative; \
30
+ padding: 0; \
31
+ } \
32
+ \
33
+ .fluid-width-video-wrapper iframe, \
34
+ .fluid-width-video-wrapper object, \
35
+ .fluid-width-video-wrapper embed { \
36
+ position: absolute; \
37
+ top: 0; \
38
+ left: 0; \
39
+ width: 100%; \
40
+ height: 100%; \
41
+ } \
42
+ </style>';
43
+
44
+ ref.parentNode.insertBefore(div,ref);
45
+
46
+ if ( options ) {
47
+ $.extend( settings, options );
48
+ }
49
+
50
+ return this.each(function(){
51
+ var selectors = [
52
+ "iframe[src*='player.vimeo.com']",
53
+ "iframe[src*='www.youtube.com']",
54
+ "iframe[src*='www.kickstarter.com']",
55
+ "object",
56
+ "embed"
57
+ ];
58
+
59
+ if (settings.customSelector) {
60
+ selectors.push(settings.customSelector);
61
+ }
62
+
63
+ var $allVideos = $(this).find(selectors.join(','));
64
+
65
+ $allVideos.each(function(){
66
+ var $this = $(this);
67
+ if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
68
+ var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
69
+ width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
70
+ aspectRatio = height / width;
71
+ if(!$this.attr('id')){
72
+ var videoID = 'fitvid' + Math.floor(Math.random()*999999);
73
+ $this.attr('id', videoID);
74
+ }
75
+ $this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%");
76
+ $this.removeAttr('height').removeAttr('width');
77
+ });
78
+ });
79
+ };
80
+ })( jQuery );
languages/testimonials-widget.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Testimonials Widget package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Testimonials Widget 2.14.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/testimonials-widget\n"
7
- "POT-Creation-Date: 2013-10-21 19:02:47+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,543 +12,603 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
- #: lib/class-testimonials-widget-settings.php:82
16
- #: lib/class-testimonials-widget-settings.php:700
17
  msgid "Testimonials Widget Settings"
18
  msgstr ""
19
 
20
- #: lib/class-testimonials-widget-settings.php:82 testimonials-widget.php:110
21
  msgid "Settings"
22
  msgstr ""
23
 
24
- #: lib/class-testimonials-widget-settings.php:112
25
- #: lib/class-testimonials-widget-settings.php:1319
26
  msgid "General"
27
  msgstr ""
28
 
29
- #: lib/class-testimonials-widget-settings.php:113
30
- #: lib/class-testimonials-widget-settings.php:1327
31
  msgid "Selection"
32
  msgstr ""
33
 
34
- #: lib/class-testimonials-widget-settings.php:114
35
- #: lib/class-testimonials-widget-settings.php:1335
36
  msgid "Ordering"
37
  msgstr ""
38
 
39
- #: lib/class-testimonials-widget-settings.php:115
40
- #: lib/class-testimonials-widget-settings.php:1343
41
  msgid "Widget"
42
  msgstr ""
43
 
44
- #: lib/class-testimonials-widget-settings.php:116
45
- #: lib/class-testimonials-widget-settings.php:1351
46
  msgid "Post Type"
47
  msgstr ""
48
 
49
- #: lib/class-testimonials-widget-settings.php:117
50
- #: lib/class-testimonials-widget-settings.php:1359
51
  msgid "Compatibility & Reset"
52
  msgstr ""
53
 
54
- #: lib/class-testimonials-widget-settings.php:118
55
  msgid "About Testimonials Widget"
56
  msgstr ""
57
 
58
- #: lib/class-testimonials-widget-settings.php:133
59
  msgid "Widget Title"
60
  msgstr ""
61
 
62
- #: lib/class-testimonials-widget-settings.php:134 testimonials-widget.php:560
63
- #: testimonials-widget.php:605
64
  msgid "Testimonials"
65
  msgstr ""
66
 
67
- #: lib/class-testimonials-widget-settings.php:140
68
  msgid "Title Link"
69
  msgstr ""
70
 
71
- #: lib/class-testimonials-widget-settings.php:141
72
  msgid ""
73
  "URL, path, or post ID to link widget title to. Ex: http://example.com/"
74
  "stuff, /testimonials, 123 or "
75
  msgstr ""
76
 
77
- #: lib/class-testimonials-widget-settings.php:147
78
  msgid "Character Limit"
79
  msgstr ""
80
 
81
- #: lib/class-testimonials-widget-settings.php:148
82
  msgid "Number of characters to limit non-single testimonial views to"
83
  msgstr ""
84
 
85
- #: lib/class-testimonials-widget-settings.php:154
86
- msgid "Height"
87
- msgstr ""
88
-
89
- #: lib/class-testimonials-widget-settings.php:155
90
- msgid "Testimonials height, in pixels. Overrides minimum and maximum height"
91
- msgstr ""
92
-
93
- #: lib/class-testimonials-widget-settings.php:161
94
  msgid "Rotation Speed"
95
  msgstr ""
96
 
97
- #: lib/class-testimonials-widget-settings.php:162
98
  msgid ""
99
  "Number of seconds between testimonial rotations or 0 for no rotation at all "
100
  "refresh"
101
  msgstr ""
102
 
103
- #: lib/class-testimonials-widget-settings.php:169
104
  msgid "Additional Widget Options"
105
  msgstr ""
106
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  #: lib/class-testimonials-widget-settings.php:175
108
- msgid "Keep Whitespace?"
109
  msgstr ""
110
 
111
  #: lib/class-testimonials-widget-settings.php:176
112
- msgid "Keeps testimonials looking as entered than sans auto-formatting"
113
  msgstr ""
114
 
115
  #: lib/class-testimonials-widget-settings.php:183
116
- msgid "Disable Animation?"
117
  msgstr ""
118
 
119
  #: lib/class-testimonials-widget-settings.php:184
120
- msgid ""
121
- "Disable animation between testimonial transitions. Useful when stacking "
122
- "widgets."
123
  msgstr ""
124
 
125
  #: lib/class-testimonials-widget-settings.php:192
126
- msgid "Fade Out Speed"
127
  msgstr ""
128
 
129
  #: lib/class-testimonials-widget-settings.php:193
130
- #: lib/class-testimonials-widget-settings.php:201
131
- msgid ""
132
- "Transition duration in milliseconds; higher values indicate slower "
133
- "animations, not faster ones."
134
  msgstr ""
135
 
136
  #: lib/class-testimonials-widget-settings.php:200
137
- msgid "Fade In Speed"
138
- msgstr ""
139
-
140
- #: lib/class-testimonials-widget-settings.php:208
141
- msgid "Minimum Height"
142
- msgstr ""
143
-
144
- #: lib/class-testimonials-widget-settings.php:209
145
- msgid "Set for minimum display height, in pixels"
146
- msgstr ""
147
-
148
- #: lib/class-testimonials-widget-settings.php:215
149
- msgid "Maximum Height"
150
  msgstr ""
151
 
152
- #: lib/class-testimonials-widget-settings.php:216
153
- msgid "Set for maximum display height, in pixels"
154
  msgstr ""
155
 
156
- #: lib/class-testimonials-widget-settings.php:222
157
  msgid "Testimonial Bottom Text"
158
  msgstr ""
159
 
160
- #: lib/class-testimonials-widget-settings.php:223
161
  msgid "Custom text or HTML for bottom of testimonials"
162
  msgstr ""
163
 
164
- #: lib/class-testimonials-widget-settings.php:235
165
  msgid "General Options"
166
  msgstr ""
167
 
168
- #: lib/class-testimonials-widget-settings.php:239
169
  msgid ""
170
  "Adds HTML tag markup per the <a href=\"%s\">Review schema</a> to "
171
  "testimonials. Search engines including Bing, Google, Yahoo! and Yandex rely "
172
  "on this markup to improve the display of search results."
173
  msgstr ""
174
 
175
- #: lib/class-testimonials-widget-settings.php:242
176
  msgid "Enable Review Schema?"
177
  msgstr ""
178
 
179
- #: lib/class-testimonials-widget-settings.php:250
180
  msgid "Reviewed Item?"
181
  msgstr ""
182
 
183
- #: lib/class-testimonials-widget-settings.php:251
184
  msgid "Name of thing being referenced in testimonials"
185
  msgstr ""
186
 
187
- #: lib/class-testimonials-widget-settings.php:256
188
  msgid "Reviewed Item URL?"
189
  msgstr ""
190
 
191
- #: lib/class-testimonials-widget-settings.php:257
192
  msgid "URL of thing being referenced in testimonials"
193
  msgstr ""
194
 
195
- #: lib/class-testimonials-widget-settings.php:263
196
  msgid "Hide built-in quotes?"
197
  msgstr ""
198
 
199
- #: lib/class-testimonials-widget-settings.php:264
200
  msgid "Remove open and close quote span tags surrounding testimonial content"
201
  msgstr ""
202
 
203
- #: lib/class-testimonials-widget-settings.php:270
204
  msgid "Hide \"Testimonials Not Found\"?"
205
  msgstr ""
206
 
207
- #: lib/class-testimonials-widget-settings.php:276
208
  msgid "Hide Gravatar Image?"
209
  msgstr ""
210
 
211
- #: lib/class-testimonials-widget-settings.php:282
212
  msgid "Hide Image?"
213
  msgstr ""
214
 
215
- #: lib/class-testimonials-widget-settings.php:288
216
  msgid "Hide Image in Single View?"
217
  msgstr ""
218
 
219
- #: lib/class-testimonials-widget-settings.php:295
220
  msgid "Hide Testimonial Content?"
221
  msgstr ""
222
 
223
- #: lib/class-testimonials-widget-settings.php:301
224
  msgid "Hide Author/Source?"
225
  msgstr ""
226
 
227
- #: lib/class-testimonials-widget-settings.php:304
228
  msgid "Don't display \"Post Title\" in cite"
229
  msgstr ""
230
 
231
- #: lib/class-testimonials-widget-settings.php:308
232
  msgid "Hide Email?"
233
  msgstr ""
234
 
235
- #: lib/class-testimonials-widget-settings.php:315
236
  msgid "Hide Job Title?"
237
  msgstr ""
238
 
239
- #: lib/class-testimonials-widget-settings.php:321
240
  msgid "Hide Location?"
241
  msgstr ""
242
 
243
- #: lib/class-testimonials-widget-settings.php:327
244
  msgid "Hide Company?"
245
  msgstr ""
246
 
247
- #: lib/class-testimonials-widget-settings.php:333
248
  msgid "Hide URL?"
249
  msgstr ""
250
 
251
- #: lib/class-testimonials-widget-settings.php:339
252
  msgid "URL Target"
253
  msgstr ""
254
 
255
- #: lib/class-testimonials-widget-settings.php:340
256
  msgid "Add target to all URLs; leave blank if none"
257
  msgstr ""
258
 
259
- #: lib/class-testimonials-widget-settings.php:345
260
  msgid "Enable Paging?"
261
  msgstr ""
262
 
263
- #: lib/class-testimonials-widget-settings.php:346
264
  msgid "For `[testimonialswidget_list]`"
265
  msgstr ""
266
 
267
- #: lib/class-testimonials-widget-settings.php:349
268
  msgid "Disable"
269
  msgstr ""
270
 
271
- #: lib/class-testimonials-widget-settings.php:350
272
  msgid "Enable"
273
  msgstr ""
274
 
275
- #: lib/class-testimonials-widget-settings.php:351
276
  msgid "Before testimonials"
277
  msgstr ""
278
 
279
- #: lib/class-testimonials-widget-settings.php:352
280
  msgid "After testimonials"
281
  msgstr ""
282
 
283
- #: lib/class-testimonials-widget-settings.php:359
284
  msgid "Do [shortcodes]?"
285
  msgstr ""
286
 
287
- #: lib/class-testimonials-widget-settings.php:360
288
  msgid "If unchecked, shortcodes are stripped."
289
  msgstr ""
290
 
291
- #: lib/class-testimonials-widget-settings.php:373
292
  msgid "Selection Options"
293
  msgstr ""
294
 
295
- #: lib/class-testimonials-widget-settings.php:379
296
  msgid "Category Filter"
297
  msgstr ""
298
 
299
- #: lib/class-testimonials-widget-settings.php:380
300
- msgid "Comma separated category slug-names. Ex: category-a, another-category"
301
  msgstr ""
302
 
303
- #: lib/class-testimonials-widget-settings.php:386
304
  msgid "Tags Filter"
305
  msgstr ""
306
 
307
- #: lib/class-testimonials-widget-settings.php:387
308
- msgid "Comma separated tag slug-names. Ex: tag-a, another-tag"
309
  msgstr ""
310
 
311
- #: lib/class-testimonials-widget-settings.php:393
312
  msgid "Require All Tags?"
313
  msgstr ""
314
 
315
- #: lib/class-testimonials-widget-settings.php:394
316
  msgid "Select only testimonials with all of the given tags"
317
  msgstr ""
318
 
319
- #: lib/class-testimonials-widget-settings.php:401
320
  msgid "Include IDs Filter"
321
  msgstr ""
322
 
323
- #: lib/class-testimonials-widget-settings.php:402
324
- #: lib/class-testimonials-widget-settings.php:409
325
  msgid "Comma separated testimonial IDs. Ex: 3,1,2"
326
  msgstr ""
327
 
328
- #: lib/class-testimonials-widget-settings.php:408
329
  msgid "Exclude IDs Filter"
330
  msgstr ""
331
 
332
- #: lib/class-testimonials-widget-settings.php:415
333
  msgid "Limit"
334
  msgstr ""
335
 
336
- #: lib/class-testimonials-widget-settings.php:416
337
  msgid "Number of testimonials to select per instance"
338
  msgstr ""
339
 
340
- #: lib/class-testimonials-widget-settings.php:429
341
  msgid "Ordering Options"
342
  msgstr ""
343
 
344
- #: lib/class-testimonials-widget-settings.php:435
345
  msgid "Random Order?"
346
  msgstr ""
347
 
348
- #: lib/class-testimonials-widget-settings.php:436
349
  msgid ""
350
  "If checked, ignores ORDER BY, ORDER BY meta_key, and ORDER BY Order. Widgets "
351
  "are random by default automatically"
352
  msgstr ""
353
 
354
- #: lib/class-testimonials-widget-settings.php:443
355
  msgid "ORDER BY"
356
  msgstr ""
357
 
358
- #: lib/class-testimonials-widget-settings.php:444
359
  msgid "Used when \"Random Order\" is disabled"
360
  msgstr ""
361
 
362
- #: lib/class-testimonials-widget-settings.php:447
363
  msgid "Testimonial ID"
364
  msgstr ""
365
 
366
- #: lib/class-testimonials-widget-settings.php:448
367
  msgid "Author"
368
  msgstr ""
369
 
370
- #: lib/class-testimonials-widget-settings.php:449 testimonials-widget.php:537
371
  msgid "Date"
372
  msgstr ""
373
 
374
- #: lib/class-testimonials-widget-settings.php:450
375
  msgid "Menu Order"
376
  msgstr ""
377
 
378
- #: lib/class-testimonials-widget-settings.php:451 testimonials-widget.php:529
379
  msgid "Source"
380
  msgstr ""
381
 
382
- #: lib/class-testimonials-widget-settings.php:452
383
  msgid "No order"
384
  msgstr ""
385
 
386
- #: lib/class-testimonials-widget-settings.php:460
387
  msgid "ORDER BY meta_key"
388
  msgstr ""
389
 
390
- #: lib/class-testimonials-widget-settings.php:461
391
  msgid ""
392
  "Used when \"Random Order\" is disabled and sorting by a testimonials meta "
393
  "key is needed. Overrides ORDER BY"
394
  msgstr ""
395
 
396
- #: lib/class-testimonials-widget-settings.php:464
397
  msgid "None"
398
  msgstr ""
399
 
400
- #: lib/class-testimonials-widget-settings.php:465 testimonials-widget.php:531
401
- #: testimonials-widget.php:1637
402
  msgid "Job Title"
403
  msgstr ""
404
 
405
- #: lib/class-testimonials-widget-settings.php:466 testimonials-widget.php:533
406
- #: testimonials-widget.php:1649
407
  msgid "Email"
408
  msgstr ""
409
 
410
- #: lib/class-testimonials-widget-settings.php:467 testimonials-widget.php:532
411
- #: testimonials-widget.php:1643
412
  msgid "Location"
413
  msgstr ""
414
 
415
- #: lib/class-testimonials-widget-settings.php:468 testimonials-widget.php:534
416
- #: testimonials-widget.php:1655
417
  msgid "Company"
418
  msgstr ""
419
 
420
- #: lib/class-testimonials-widget-settings.php:469 testimonials-widget.php:535
421
- #: testimonials-widget.php:1661
422
  msgid "URL"
423
  msgstr ""
424
 
425
- #: lib/class-testimonials-widget-settings.php:476
426
  msgid "ORDER BY Order"
427
  msgstr ""
428
 
429
- #: lib/class-testimonials-widget-settings.php:479
430
  msgid "Descending"
431
  msgstr ""
432
 
433
- #: lib/class-testimonials-widget-settings.php:480
434
  msgid "Ascending"
435
  msgstr ""
436
 
437
- #: lib/class-testimonials-widget-settings.php:494
438
  msgid "Allow Comments?"
439
  msgstr ""
440
 
441
- #: lib/class-testimonials-widget-settings.php:495
442
  msgid ""
443
  "Only affects the Testimonials Widget post edit page. Your theme controls the "
444
  "front-end view."
445
  msgstr ""
446
 
447
- #: lib/class-testimonials-widget-settings.php:501
448
  msgid "URL slug-name for <a href=\"%1s\">testimonials archive</a> page."
449
  msgstr ""
450
 
451
- #: lib/class-testimonials-widget-settings.php:507
452
  msgid "Archive Page URL"
453
  msgstr ""
454
 
455
- #: lib/class-testimonials-widget-settings.php:514
456
  msgid ""
457
  "URL slug-name for testimonial view pages. Shouldn't be the same as the "
458
  "Archive Page URL nor should it match a page URL slug."
459
  msgstr ""
460
 
461
- #: lib/class-testimonials-widget-settings.php:518
462
  msgid "Testimonial Page URL"
463
  msgstr ""
464
 
465
- #: lib/class-testimonials-widget-settings.php:528
466
  msgid "Compatiblity Options"
467
  msgstr ""
468
 
469
- #: lib/class-testimonials-widget-settings.php:534
470
- msgid "Include IE7 CSS?"
471
  msgstr ""
472
 
473
- #: lib/class-testimonials-widget-settings.php:535
474
- msgid "IE7 specific CSS moved to separate CSS file in version 2.13.6."
 
475
  msgstr ""
476
 
477
- #: lib/class-testimonials-widget-settings.php:547
478
- msgid "Remove `.hentry` CSS?"
 
 
 
 
 
 
479
  msgstr ""
480
 
481
  #: lib/class-testimonials-widget-settings.php:548
 
 
 
 
482
  msgid ""
483
- "Pre 2.6.4. Some themes use class `.hentry` in a manner that breaks "
484
- "Testimonials Widgets CSS"
485
  msgstr ""
486
 
487
- #: lib/class-testimonials-widget-settings.php:559
488
- msgid "Use `&lt;q&gt;` tag?"
489
  msgstr ""
490
 
491
  #: lib/class-testimonials-widget-settings.php:560
492
- msgid "Pre 2.11.0. Not HTML5 compliant"
 
 
493
  msgstr ""
494
 
495
- #: lib/class-testimonials-widget-settings.php:571
496
- msgid "Don't Use Default Taxonomies?"
497
  msgstr ""
498
 
499
- #: lib/class-testimonials-widget-settings.php:574
500
- msgid ""
501
- "If checked, use Testimonials Widget's own category and tag taxonomies instead"
502
  msgstr ""
503
 
504
- #: lib/class-testimonials-widget-settings.php:585
505
- msgid "Export Settings"
506
  msgstr ""
507
 
508
- #: lib/class-testimonials-widget-settings.php:587
 
 
 
 
509
  msgid ""
510
- "These are your current settings in a serialized format. Copy the contents to "
511
- "make a backup of your settings."
512
  msgstr ""
513
 
514
  #: lib/class-testimonials-widget-settings.php:595
515
- msgid "Import Settings"
516
  msgstr ""
517
 
518
- #: lib/class-testimonials-widget-settings.php:597
519
  msgid ""
520
- "Paste new serialized settings here to overwrite your current configuration."
 
521
  msgstr ""
522
 
523
- #: lib/class-testimonials-widget-settings.php:603
524
- msgid "Remove Plugin Data on Deletion?"
525
  msgstr ""
526
 
527
- #: lib/class-testimonials-widget-settings.php:607
 
528
  msgid ""
529
- "Delete all Testimonials Widget data and options from database on plugin "
530
- "deletion"
531
  msgstr ""
532
 
533
- #: lib/class-testimonials-widget-settings.php:613
534
- msgid "Reset to Defaults?"
535
  msgstr ""
536
 
537
- #: lib/class-testimonials-widget-settings.php:617
538
- msgid "Check this box to reset options to their defaults"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
539
  msgstr ""
540
 
541
- #: lib/class-testimonials-widget-settings.php:717
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
542
  msgid "Save Changes"
543
  msgstr ""
544
 
545
- #: lib/class-testimonials-widget-settings.php:724
546
  msgid ""
547
  "When ready, <a href=\"%1$s\">view</a> or <a href=\"%2$s\">add</a> "
548
  "testimonials."
549
  msgstr ""
550
 
551
- #: lib/class-testimonials-widget-settings.php:734
552
  msgid ""
553
  "If you like this plugin, please <a href=\"%1$s\" title=\"Donate for Good "
554
  "Karma\"><img src=\"%2$s\" border=\"0\" alt=\"Donate for Good Karma\" /></a> "
@@ -557,15 +617,15 @@ msgid ""
557
  "\"%4$s\" title=\"Support forums\">support</a>."
558
  msgstr ""
559
 
560
- #: lib/class-testimonials-widget-settings.php:745
561
  msgid "Copyright &copy;%1$s <a href=\"%2$s\">Aihrus</a>."
562
  msgstr ""
563
 
564
- #: lib/class-testimonials-widget-settings.php:1199
565
  msgid "Required"
566
  msgstr ""
567
 
568
- #: lib/class-testimonials-widget-settings.php:1305
569
  msgid ""
570
  "These Testimonials Widget Settings establish the default option values for "
571
  "shortcodes, theme functions, and widget instances. Widgets, once created no "
@@ -574,35 +634,35 @@ msgid ""
574
  "then recreate it."
575
  msgstr ""
576
 
577
- #: lib/class-testimonials-widget-settings.php:1307
578
  msgid "Shortcode option names are listed below each entry."
579
  msgstr ""
580
 
581
- #: lib/class-testimonials-widget-settings.php:1310
582
  msgid "View the <a href=\"%s\">Testimonials Widget documentation</a>."
583
  msgstr ""
584
 
585
- #: lib/class-testimonials-widget-settings.php:1320
586
  msgid "Show or hide optional fields."
587
  msgstr ""
588
 
589
- #: lib/class-testimonials-widget-settings.php:1328
590
  msgid "Options used to select testimonials."
591
  msgstr ""
592
 
593
- #: lib/class-testimonials-widget-settings.php:1336
594
  msgid "Options used to determine displayed testimonials ordering."
595
  msgstr ""
596
 
597
- #: lib/class-testimonials-widget-settings.php:1344
598
  msgid "Options related to showing testimonials in widgets."
599
  msgstr ""
600
 
601
- #: lib/class-testimonials-widget-settings.php:1352
602
  msgid "Archive and singular page URL related testimonials options."
603
  msgstr ""
604
 
605
- #: lib/class-testimonials-widget-settings.php:1360
606
  msgid "Backwards compatibility, import/export options, and reset options."
607
  msgstr ""
608
 
@@ -610,7 +670,7 @@ msgstr ""
610
  msgid "Display testimonials with multiple selection and display options"
611
  msgstr ""
612
 
613
- #. #-#-#-#-# testimonials-widget.pot (Testimonials Widget 2.14.0) #-#-#-#-#
614
  #. Plugin Name of the plugin/theme
615
  #: lib/class-testimonials-widget-widget.php:37
616
  msgid "Testimonials Widget"
@@ -624,149 +684,155 @@ msgstr ""
624
  msgid "This widget's unique CSS class for styling"
625
  msgstr ""
626
 
627
- #: lib/class-testimonials-widget-widget.php:207
628
  msgid "Expand/Collapse"
629
  msgstr ""
630
 
631
- #: testimonials-widget.php:315
632
  msgid ""
633
  "If your Testimonials Widget display has gone to funky town, please <a href="
634
  "\"%s\">read the FAQ</a> about possible CSS fixes."
635
  msgstr ""
636
 
637
- #: testimonials-widget.php:324
638
  msgid ""
639
- "Please donate $2 towards development and support of this Testimonials Widget "
640
  "plugin. %s"
641
  msgstr ""
642
 
643
- #: testimonials-widget.php:527
644
  msgid "ID"
645
  msgstr ""
646
 
647
- #: testimonials-widget.php:528
648
  msgid "Image"
649
  msgstr ""
650
 
651
- #: testimonials-widget.php:530
652
  msgid "Shortcodes"
653
  msgstr ""
654
 
655
- #: testimonials-widget.php:536
656
  msgid "Published by"
657
  msgstr ""
658
 
659
- #: testimonials-widget.php:542 testimonials-widget.php:545
660
  msgid "Category"
661
  msgstr ""
662
 
663
- #: testimonials-widget.php:543 testimonials-widget.php:546
664
  msgid "Tags"
665
  msgstr ""
666
 
667
- #: testimonials-widget.php:557
668
  msgid "Add New"
669
  msgstr ""
670
 
671
- #: testimonials-widget.php:558 testimonials-widget.php:561
672
  msgid "Add New Testimonial"
673
  msgstr ""
674
 
675
- #: testimonials-widget.php:559
676
  msgid "Edit Testimonial"
677
  msgstr ""
678
 
679
- #: testimonials-widget.php:562 testimonials-widget.php:909
680
  msgid "No testimonials found"
681
  msgstr ""
682
 
683
- #: testimonials-widget.php:563
684
  msgid "No testimonials found in Trash"
685
  msgstr ""
686
 
687
- #: testimonials-widget.php:565
688
  msgid "Search Testimonials"
689
  msgstr ""
690
 
691
- #: testimonials-widget.php:566 testimonials-widget.php:1749
692
  msgid "Testimonial"
693
  msgstr ""
694
 
695
- #: testimonials-widget.php:567
696
  msgid "View Testimonial"
697
  msgstr ""
698
 
699
- #: testimonials-widget.php:1038
700
  msgid "…"
701
  msgstr ""
702
 
703
- #: testimonials-widget.php:1370
704
  msgid "&laquo;"
705
  msgstr ""
706
 
707
- #: testimonials-widget.php:1379
708
  msgid "&raquo;"
709
  msgstr ""
710
 
711
- #: testimonials-widget.php:1673
712
  msgid "Testimonial Data"
713
  msgstr ""
714
 
715
- #: testimonials-widget.php:1698
716
  msgid "Enter title here"
717
  msgstr ""
718
 
719
- #: testimonials-widget.php:1699
720
  msgid "Enter testimonial source here"
721
  msgstr ""
722
 
723
- #: testimonials-widget.php:1724
724
  msgid "Testimonial updated. <a href=\"%s\">View testimonial</a>"
725
  msgstr ""
726
 
727
- #: testimonials-widget.php:1725
728
  msgid "Custom field updated."
729
  msgstr ""
730
 
731
- #: testimonials-widget.php:1726
732
  msgid "Custom field deleted."
733
  msgstr ""
734
 
735
- #: testimonials-widget.php:1727
736
  msgid "Testimonial updated."
737
  msgstr ""
738
 
739
  #. translators: %s: date and time of the revision
740
- #: testimonials-widget.php:1729
741
  msgid "Testimonial restored to revision from %s"
742
  msgstr ""
743
 
744
- #: testimonials-widget.php:1730
745
  msgid "Testimonial published. <a href=\"%s\">View testimonial</a>"
746
  msgstr ""
747
 
748
- #: testimonials-widget.php:1731
749
  msgid "Testimonial saved."
750
  msgstr ""
751
 
752
- #: testimonials-widget.php:1732
753
  msgid ""
754
  "Testimonial submitted. <a target=\"_blank\" href=\"%s\">Preview testimonial</"
755
  "a>"
756
  msgstr ""
757
 
758
- #: testimonials-widget.php:1733
759
  msgid ""
760
  "Testimonial scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href="
761
  "\"%2$s\">Preview testimonial</a>"
762
  msgstr ""
763
 
764
- #: testimonials-widget.php:1734
765
  msgid ""
766
  "Testimonial draft updated. <a target=\"_blank\" href=\"%s\">Preview "
767
  "testimonial</a>"
768
  msgstr ""
769
 
 
 
 
 
 
 
770
  #. Plugin URI of the plugin/theme
771
  msgid "http://wordpress.org/extend/plugins/testimonials-widget/"
772
  msgstr ""
2
  # This file is distributed under the same license as the Testimonials Widget package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Testimonials Widget 2.15.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/testimonials-widget\n"
7
+ "POT-Creation-Date: 2013-10-28 03:42:49+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: lib/class-testimonials-widget-settings.php:84
16
+ #: lib/class-testimonials-widget-settings.php:768
17
  msgid "Testimonials Widget Settings"
18
  msgstr ""
19
 
20
+ #: lib/class-testimonials-widget-settings.php:84 testimonials-widget.php:111
21
  msgid "Settings"
22
  msgstr ""
23
 
24
+ #: lib/class-testimonials-widget-settings.php:114
25
+ #: lib/class-testimonials-widget-settings.php:1405
26
  msgid "General"
27
  msgstr ""
28
 
29
+ #: lib/class-testimonials-widget-settings.php:115
30
+ #: lib/class-testimonials-widget-settings.php:1413
31
  msgid "Selection"
32
  msgstr ""
33
 
34
+ #: lib/class-testimonials-widget-settings.php:116
35
+ #: lib/class-testimonials-widget-settings.php:1421
36
  msgid "Ordering"
37
  msgstr ""
38
 
39
+ #: lib/class-testimonials-widget-settings.php:117
40
+ #: lib/class-testimonials-widget-settings.php:1429
41
  msgid "Widget"
42
  msgstr ""
43
 
44
+ #: lib/class-testimonials-widget-settings.php:118
45
+ #: lib/class-testimonials-widget-settings.php:1437
46
  msgid "Post Type"
47
  msgstr ""
48
 
49
+ #: lib/class-testimonials-widget-settings.php:119
50
+ #: lib/class-testimonials-widget-settings.php:1445
51
  msgid "Compatibility & Reset"
52
  msgstr ""
53
 
54
+ #: lib/class-testimonials-widget-settings.php:120
55
  msgid "About Testimonials Widget"
56
  msgstr ""
57
 
58
+ #: lib/class-testimonials-widget-settings.php:135
59
  msgid "Widget Title"
60
  msgstr ""
61
 
62
+ #: lib/class-testimonials-widget-settings.php:136 testimonials-widget.php:568
63
+ #: testimonials-widget.php:613
64
  msgid "Testimonials"
65
  msgstr ""
66
 
67
+ #: lib/class-testimonials-widget-settings.php:142
68
  msgid "Title Link"
69
  msgstr ""
70
 
71
+ #: lib/class-testimonials-widget-settings.php:143
72
  msgid ""
73
  "URL, path, or post ID to link widget title to. Ex: http://example.com/"
74
  "stuff, /testimonials, 123 or "
75
  msgstr ""
76
 
77
+ #: lib/class-testimonials-widget-settings.php:149
78
  msgid "Character Limit"
79
  msgstr ""
80
 
81
+ #: lib/class-testimonials-widget-settings.php:150
82
  msgid "Number of characters to limit non-single testimonial views to"
83
  msgstr ""
84
 
85
+ #: lib/class-testimonials-widget-settings.php:156
 
 
 
 
 
 
 
 
86
  msgid "Rotation Speed"
87
  msgstr ""
88
 
89
+ #: lib/class-testimonials-widget-settings.php:157
90
  msgid ""
91
  "Number of seconds between testimonial rotations or 0 for no rotation at all "
92
  "refresh"
93
  msgstr ""
94
 
95
+ #: lib/class-testimonials-widget-settings.php:164
96
  msgid "Additional Widget Options"
97
  msgstr ""
98
 
99
+ #: lib/class-testimonials-widget-settings.php:170
100
+ msgid "Transition Mode?"
101
+ msgstr ""
102
+
103
+ #: lib/class-testimonials-widget-settings.php:171
104
+ msgid "Type of transition between slides"
105
+ msgstr ""
106
+
107
+ #: lib/class-testimonials-widget-settings.php:174
108
+ msgid "Fade"
109
+ msgstr ""
110
+
111
  #: lib/class-testimonials-widget-settings.php:175
112
+ msgid "Horizontal"
113
  msgstr ""
114
 
115
  #: lib/class-testimonials-widget-settings.php:176
116
+ msgid "Vertical"
117
  msgstr ""
118
 
119
  #: lib/class-testimonials-widget-settings.php:183
120
+ msgid "Show Play/Pause?"
121
  msgstr ""
122
 
123
  #: lib/class-testimonials-widget-settings.php:184
124
+ msgid "Display start and stop buttons underneath the testimonial slider."
 
 
125
  msgstr ""
126
 
127
  #: lib/class-testimonials-widget-settings.php:192
128
+ msgid "Enable Video?"
129
  msgstr ""
130
 
131
  #: lib/class-testimonials-widget-settings.php:193
132
+ msgid "Only enable when displaying video content."
 
 
 
133
  msgstr ""
134
 
135
  #: lib/class-testimonials-widget-settings.php:200
136
+ msgid "Keep Whitespace?"
 
 
 
 
 
 
 
 
 
 
 
 
137
  msgstr ""
138
 
139
+ #: lib/class-testimonials-widget-settings.php:201
140
+ msgid "Keeps testimonials looking as entered than sans auto-formatting"
141
  msgstr ""
142
 
143
+ #: lib/class-testimonials-widget-settings.php:208
144
  msgid "Testimonial Bottom Text"
145
  msgstr ""
146
 
147
+ #: lib/class-testimonials-widget-settings.php:209
148
  msgid "Custom text or HTML for bottom of testimonials"
149
  msgstr ""
150
 
151
+ #: lib/class-testimonials-widget-settings.php:221
152
  msgid "General Options"
153
  msgstr ""
154
 
155
+ #: lib/class-testimonials-widget-settings.php:225
156
  msgid ""
157
  "Adds HTML tag markup per the <a href=\"%s\">Review schema</a> to "
158
  "testimonials. Search engines including Bing, Google, Yahoo! and Yandex rely "
159
  "on this markup to improve the display of search results."
160
  msgstr ""
161
 
162
+ #: lib/class-testimonials-widget-settings.php:228
163
  msgid "Enable Review Schema?"
164
  msgstr ""
165
 
166
+ #: lib/class-testimonials-widget-settings.php:236
167
  msgid "Reviewed Item?"
168
  msgstr ""
169
 
170
+ #: lib/class-testimonials-widget-settings.php:237
171
  msgid "Name of thing being referenced in testimonials"
172
  msgstr ""
173
 
174
+ #: lib/class-testimonials-widget-settings.php:243
175
  msgid "Reviewed Item URL?"
176
  msgstr ""
177
 
178
+ #: lib/class-testimonials-widget-settings.php:244
179
  msgid "URL of thing being referenced in testimonials"
180
  msgstr ""
181
 
182
+ #: lib/class-testimonials-widget-settings.php:251
183
  msgid "Hide built-in quotes?"
184
  msgstr ""
185
 
186
+ #: lib/class-testimonials-widget-settings.php:252
187
  msgid "Remove open and close quote span tags surrounding testimonial content"
188
  msgstr ""
189
 
190
+ #: lib/class-testimonials-widget-settings.php:258
191
  msgid "Hide \"Testimonials Not Found\"?"
192
  msgstr ""
193
 
194
+ #: lib/class-testimonials-widget-settings.php:264
195
  msgid "Hide Gravatar Image?"
196
  msgstr ""
197
 
198
+ #: lib/class-testimonials-widget-settings.php:270
199
  msgid "Hide Image?"
200
  msgstr ""
201
 
202
+ #: lib/class-testimonials-widget-settings.php:276
203
  msgid "Hide Image in Single View?"
204
  msgstr ""
205
 
206
+ #: lib/class-testimonials-widget-settings.php:283
207
  msgid "Hide Testimonial Content?"
208
  msgstr ""
209
 
210
+ #: lib/class-testimonials-widget-settings.php:289
211
  msgid "Hide Author/Source?"
212
  msgstr ""
213
 
214
+ #: lib/class-testimonials-widget-settings.php:292
215
  msgid "Don't display \"Post Title\" in cite"
216
  msgstr ""
217
 
218
+ #: lib/class-testimonials-widget-settings.php:296
219
  msgid "Hide Email?"
220
  msgstr ""
221
 
222
+ #: lib/class-testimonials-widget-settings.php:303
223
  msgid "Hide Job Title?"
224
  msgstr ""
225
 
226
+ #: lib/class-testimonials-widget-settings.php:309
227
  msgid "Hide Location?"
228
  msgstr ""
229
 
230
+ #: lib/class-testimonials-widget-settings.php:315
231
  msgid "Hide Company?"
232
  msgstr ""
233
 
234
+ #: lib/class-testimonials-widget-settings.php:321
235
  msgid "Hide URL?"
236
  msgstr ""
237
 
238
+ #: lib/class-testimonials-widget-settings.php:327
239
  msgid "URL Target"
240
  msgstr ""
241
 
242
+ #: lib/class-testimonials-widget-settings.php:328
243
  msgid "Add target to all URLs; leave blank if none"
244
  msgstr ""
245
 
246
+ #: lib/class-testimonials-widget-settings.php:333
247
  msgid "Enable Paging?"
248
  msgstr ""
249
 
250
+ #: lib/class-testimonials-widget-settings.php:334
251
  msgid "For `[testimonialswidget_list]`"
252
  msgstr ""
253
 
254
+ #: lib/class-testimonials-widget-settings.php:337
255
  msgid "Disable"
256
  msgstr ""
257
 
258
+ #: lib/class-testimonials-widget-settings.php:338
259
  msgid "Enable"
260
  msgstr ""
261
 
262
+ #: lib/class-testimonials-widget-settings.php:339
263
  msgid "Before testimonials"
264
  msgstr ""
265
 
266
+ #: lib/class-testimonials-widget-settings.php:340
267
  msgid "After testimonials"
268
  msgstr ""
269
 
270
+ #: lib/class-testimonials-widget-settings.php:347
271
  msgid "Do [shortcodes]?"
272
  msgstr ""
273
 
274
+ #: lib/class-testimonials-widget-settings.php:348
275
  msgid "If unchecked, shortcodes are stripped."
276
  msgstr ""
277
 
278
+ #: lib/class-testimonials-widget-settings.php:361
279
  msgid "Selection Options"
280
  msgstr ""
281
 
282
+ #: lib/class-testimonials-widget-settings.php:367
283
  msgid "Category Filter"
284
  msgstr ""
285
 
286
+ #: lib/class-testimonials-widget-settings.php:368
287
+ msgid "Comma separated category names. Ex: Category A, Another category"
288
  msgstr ""
289
 
290
+ #: lib/class-testimonials-widget-settings.php:375
291
  msgid "Tags Filter"
292
  msgstr ""
293
 
294
+ #: lib/class-testimonials-widget-settings.php:376
295
+ msgid "Comma separated tag names. Ex: Tag A, Another tag"
296
  msgstr ""
297
 
298
+ #: lib/class-testimonials-widget-settings.php:383
299
  msgid "Require All Tags?"
300
  msgstr ""
301
 
302
+ #: lib/class-testimonials-widget-settings.php:384
303
  msgid "Select only testimonials with all of the given tags"
304
  msgstr ""
305
 
306
+ #: lib/class-testimonials-widget-settings.php:391
307
  msgid "Include IDs Filter"
308
  msgstr ""
309
 
310
+ #: lib/class-testimonials-widget-settings.php:392
311
+ #: lib/class-testimonials-widget-settings.php:399
312
  msgid "Comma separated testimonial IDs. Ex: 3,1,2"
313
  msgstr ""
314
 
315
+ #: lib/class-testimonials-widget-settings.php:398
316
  msgid "Exclude IDs Filter"
317
  msgstr ""
318
 
319
+ #: lib/class-testimonials-widget-settings.php:405
320
  msgid "Limit"
321
  msgstr ""
322
 
323
+ #: lib/class-testimonials-widget-settings.php:406
324
  msgid "Number of testimonials to select per instance"
325
  msgstr ""
326
 
327
+ #: lib/class-testimonials-widget-settings.php:419
328
  msgid "Ordering Options"
329
  msgstr ""
330
 
331
+ #: lib/class-testimonials-widget-settings.php:425
332
  msgid "Random Order?"
333
  msgstr ""
334
 
335
+ #: lib/class-testimonials-widget-settings.php:426
336
  msgid ""
337
  "If checked, ignores ORDER BY, ORDER BY meta_key, and ORDER BY Order. Widgets "
338
  "are random by default automatically"
339
  msgstr ""
340
 
341
+ #: lib/class-testimonials-widget-settings.php:433
342
  msgid "ORDER BY"
343
  msgstr ""
344
 
345
+ #: lib/class-testimonials-widget-settings.php:434
346
  msgid "Used when \"Random Order\" is disabled"
347
  msgstr ""
348
 
349
+ #: lib/class-testimonials-widget-settings.php:437
350
  msgid "Testimonial ID"
351
  msgstr ""
352
 
353
+ #: lib/class-testimonials-widget-settings.php:438
354
  msgid "Author"
355
  msgstr ""
356
 
357
+ #: lib/class-testimonials-widget-settings.php:439 testimonials-widget.php:545
358
  msgid "Date"
359
  msgstr ""
360
 
361
+ #: lib/class-testimonials-widget-settings.php:440
362
  msgid "Menu Order"
363
  msgstr ""
364
 
365
+ #: lib/class-testimonials-widget-settings.php:441 testimonials-widget.php:537
366
  msgid "Source"
367
  msgstr ""
368
 
369
+ #: lib/class-testimonials-widget-settings.php:442
370
  msgid "No order"
371
  msgstr ""
372
 
373
+ #: lib/class-testimonials-widget-settings.php:450
374
  msgid "ORDER BY meta_key"
375
  msgstr ""
376
 
377
+ #: lib/class-testimonials-widget-settings.php:451
378
  msgid ""
379
  "Used when \"Random Order\" is disabled and sorting by a testimonials meta "
380
  "key is needed. Overrides ORDER BY"
381
  msgstr ""
382
 
383
+ #: lib/class-testimonials-widget-settings.php:454
384
  msgid "None"
385
  msgstr ""
386
 
387
+ #: lib/class-testimonials-widget-settings.php:455 testimonials-widget.php:539
388
+ #: testimonials-widget.php:1715
389
  msgid "Job Title"
390
  msgstr ""
391
 
392
+ #: lib/class-testimonials-widget-settings.php:456 testimonials-widget.php:541
393
+ #: testimonials-widget.php:1727
394
  msgid "Email"
395
  msgstr ""
396
 
397
+ #: lib/class-testimonials-widget-settings.php:457 testimonials-widget.php:540
398
+ #: testimonials-widget.php:1721
399
  msgid "Location"
400
  msgstr ""
401
 
402
+ #: lib/class-testimonials-widget-settings.php:458 testimonials-widget.php:542
403
+ #: testimonials-widget.php:1733
404
  msgid "Company"
405
  msgstr ""
406
 
407
+ #: lib/class-testimonials-widget-settings.php:459 testimonials-widget.php:543
408
+ #: testimonials-widget.php:1739
409
  msgid "URL"
410
  msgstr ""
411
 
412
+ #: lib/class-testimonials-widget-settings.php:466
413
  msgid "ORDER BY Order"
414
  msgstr ""
415
 
416
+ #: lib/class-testimonials-widget-settings.php:469
417
  msgid "Descending"
418
  msgstr ""
419
 
420
+ #: lib/class-testimonials-widget-settings.php:470
421
  msgid "Ascending"
422
  msgstr ""
423
 
424
+ #: lib/class-testimonials-widget-settings.php:484
425
  msgid "Allow Comments?"
426
  msgstr ""
427
 
428
+ #: lib/class-testimonials-widget-settings.php:485
429
  msgid ""
430
  "Only affects the Testimonials Widget post edit page. Your theme controls the "
431
  "front-end view."
432
  msgstr ""
433
 
434
+ #: lib/class-testimonials-widget-settings.php:491
435
  msgid "URL slug-name for <a href=\"%1s\">testimonials archive</a> page."
436
  msgstr ""
437
 
438
+ #: lib/class-testimonials-widget-settings.php:497
439
  msgid "Archive Page URL"
440
  msgstr ""
441
 
442
+ #: lib/class-testimonials-widget-settings.php:504
443
  msgid ""
444
  "URL slug-name for testimonial view pages. Shouldn't be the same as the "
445
  "Archive Page URL nor should it match a page URL slug."
446
  msgstr ""
447
 
448
+ #: lib/class-testimonials-widget-settings.php:508
449
  msgid "Testimonial Page URL"
450
  msgstr ""
451
 
452
+ #: lib/class-testimonials-widget-settings.php:518
453
  msgid "Compatiblity Options"
454
  msgstr ""
455
 
456
+ #: lib/class-testimonials-widget-settings.php:524
457
+ msgid "Don't Use Default Taxonomies?"
458
  msgstr ""
459
 
460
+ #: lib/class-testimonials-widget-settings.php:527
461
+ msgid ""
462
+ "If checked, use Testimonials Widget's own category and tag taxonomies instead"
463
  msgstr ""
464
 
465
+ #: lib/class-testimonials-widget-settings.php:538
466
+ msgid "Export Settings"
467
+ msgstr ""
468
+
469
+ #: lib/class-testimonials-widget-settings.php:540
470
+ msgid ""
471
+ "These are your current settings in a serialized format. Copy the contents to "
472
+ "make a backup of your settings."
473
  msgstr ""
474
 
475
  #: lib/class-testimonials-widget-settings.php:548
476
+ msgid "Import Settings"
477
+ msgstr ""
478
+
479
+ #: lib/class-testimonials-widget-settings.php:550
480
  msgid ""
481
+ "Paste new serialized settings here to overwrite your current configuration."
 
482
  msgstr ""
483
 
484
+ #: lib/class-testimonials-widget-settings.php:556
485
+ msgid "Remove Plugin Data on Deletion?"
486
  msgstr ""
487
 
488
  #: lib/class-testimonials-widget-settings.php:560
489
+ msgid ""
490
+ "Delete all Testimonials Widget data and options from database on plugin "
491
+ "deletion"
492
  msgstr ""
493
 
494
+ #: lib/class-testimonials-widget-settings.php:566
495
+ msgid "Reset to Defaults?"
496
  msgstr ""
497
 
498
+ #: lib/class-testimonials-widget-settings.php:570
499
+ msgid "Check this box to reset options to their defaults"
 
500
  msgstr ""
501
 
502
+ #: lib/class-testimonials-widget-settings.php:576
503
+ msgid "Version Based Options"
504
  msgstr ""
505
 
506
+ #: lib/class-testimonials-widget-settings.php:582
507
+ msgid "Use bxSlider?"
508
+ msgstr ""
509
+
510
+ #: lib/class-testimonials-widget-settings.php:583
511
  msgid ""
512
+ "Pre 2.15.0, Testimonials Widgets used custom JavaScript for transitions."
 
513
  msgstr ""
514
 
515
  #: lib/class-testimonials-widget-settings.php:595
516
+ msgid "Disable Animation?"
517
  msgstr ""
518
 
519
+ #: lib/class-testimonials-widget-settings.php:596
520
  msgid ""
521
+ "Pre 2.15.0, Disable animation between testimonial transitions. Useful when "
522
+ "stacking widgets."
523
  msgstr ""
524
 
525
+ #: lib/class-testimonials-widget-settings.php:604
526
+ msgid "Fade Out Speed"
527
  msgstr ""
528
 
529
+ #: lib/class-testimonials-widget-settings.php:605
530
+ #: lib/class-testimonials-widget-settings.php:613
531
  msgid ""
532
+ "Pre 2.15.0, Transition duration in milliseconds; higher values indicate "
533
+ "slower animations, not faster ones."
534
  msgstr ""
535
 
536
+ #: lib/class-testimonials-widget-settings.php:612
537
+ msgid "Fade In Speed"
538
  msgstr ""
539
 
540
+ #: lib/class-testimonials-widget-settings.php:620
541
+ msgid "Height"
542
+ msgstr ""
543
+
544
+ #: lib/class-testimonials-widget-settings.php:621
545
+ msgid ""
546
+ "Pre 2.15.0, Testimonials height, in pixels. Overrides minimum and maximum "
547
+ "height"
548
+ msgstr ""
549
+
550
+ #: lib/class-testimonials-widget-settings.php:627
551
+ msgid "Minimum Height"
552
+ msgstr ""
553
+
554
+ #: lib/class-testimonials-widget-settings.php:628
555
+ msgid "Pre 2.15.0, Set for minimum display height, in pixels"
556
  msgstr ""
557
 
558
+ #: lib/class-testimonials-widget-settings.php:634
559
+ msgid "Maximum Height"
560
+ msgstr ""
561
+
562
+ #: lib/class-testimonials-widget-settings.php:635
563
+ msgid "Pre 2.15.0, Set for maximum display height, in pixels"
564
+ msgstr ""
565
+
566
+ #: lib/class-testimonials-widget-settings.php:641
567
+ msgid "Always Load CSS?"
568
+ msgstr ""
569
+
570
+ #: lib/class-testimonials-widget-settings.php:642
571
+ msgid ""
572
+ "Pre 2.14.0, Testimonials Widgets CSS was always loaded, whether needed or not"
573
+ msgstr ""
574
+
575
+ #: lib/class-testimonials-widget-settings.php:653
576
+ msgid "Include IE7 CSS?"
577
+ msgstr ""
578
+
579
+ #: lib/class-testimonials-widget-settings.php:654
580
+ msgid "IE7 specific CSS moved to separate CSS file in version 2.13.6."
581
+ msgstr ""
582
+
583
+ #: lib/class-testimonials-widget-settings.php:666
584
+ msgid "Use `&lt;q&gt;` tag?"
585
+ msgstr ""
586
+
587
+ #: lib/class-testimonials-widget-settings.php:667
588
+ msgid "Pre 2.11.0, not HTML5 compliant"
589
+ msgstr ""
590
+
591
+ #: lib/class-testimonials-widget-settings.php:678
592
+ msgid "Remove `.hentry` CSS?"
593
+ msgstr ""
594
+
595
+ #: lib/class-testimonials-widget-settings.php:679
596
+ msgid ""
597
+ "Pre 2.6.4, some themes use class `.hentry` in a manner that breaks "
598
+ "Testimonials Widgets CSS"
599
+ msgstr ""
600
+
601
+ #: lib/class-testimonials-widget-settings.php:785
602
  msgid "Save Changes"
603
  msgstr ""
604
 
605
+ #: lib/class-testimonials-widget-settings.php:792
606
  msgid ""
607
  "When ready, <a href=\"%1$s\">view</a> or <a href=\"%2$s\">add</a> "
608
  "testimonials."
609
  msgstr ""
610
 
611
+ #: lib/class-testimonials-widget-settings.php:802
612
  msgid ""
613
  "If you like this plugin, please <a href=\"%1$s\" title=\"Donate for Good "
614
  "Karma\"><img src=\"%2$s\" border=\"0\" alt=\"Donate for Good Karma\" /></a> "
617
  "\"%4$s\" title=\"Support forums\">support</a>."
618
  msgstr ""
619
 
620
+ #: lib/class-testimonials-widget-settings.php:813
621
  msgid "Copyright &copy;%1$s <a href=\"%2$s\">Aihrus</a>."
622
  msgstr ""
623
 
624
+ #: lib/class-testimonials-widget-settings.php:1274
625
  msgid "Required"
626
  msgstr ""
627
 
628
+ #: lib/class-testimonials-widget-settings.php:1391
629
  msgid ""
630
  "These Testimonials Widget Settings establish the default option values for "
631
  "shortcodes, theme functions, and widget instances. Widgets, once created no "
634
  "then recreate it."
635
  msgstr ""
636
 
637
+ #: lib/class-testimonials-widget-settings.php:1393
638
  msgid "Shortcode option names are listed below each entry."
639
  msgstr ""
640
 
641
+ #: lib/class-testimonials-widget-settings.php:1396
642
  msgid "View the <a href=\"%s\">Testimonials Widget documentation</a>."
643
  msgstr ""
644
 
645
+ #: lib/class-testimonials-widget-settings.php:1406
646
  msgid "Show or hide optional fields."
647
  msgstr ""
648
 
649
+ #: lib/class-testimonials-widget-settings.php:1414
650
  msgid "Options used to select testimonials."
651
  msgstr ""
652
 
653
+ #: lib/class-testimonials-widget-settings.php:1422
654
  msgid "Options used to determine displayed testimonials ordering."
655
  msgstr ""
656
 
657
+ #: lib/class-testimonials-widget-settings.php:1430
658
  msgid "Options related to showing testimonials in widgets."
659
  msgstr ""
660
 
661
+ #: lib/class-testimonials-widget-settings.php:1438
662
  msgid "Archive and singular page URL related testimonials options."
663
  msgstr ""
664
 
665
+ #: lib/class-testimonials-widget-settings.php:1446
666
  msgid "Backwards compatibility, import/export options, and reset options."
667
  msgstr ""
668
 
670
  msgid "Display testimonials with multiple selection and display options"
671
  msgstr ""
672
 
673
+ #. #-#-#-#-# testimonials-widget.pot (Testimonials Widget 2.15.0) #-#-#-#-#
674
  #. Plugin Name of the plugin/theme
675
  #: lib/class-testimonials-widget-widget.php:37
676
  msgid "Testimonials Widget"
684
  msgid "This widget's unique CSS class for styling"
685
  msgstr ""
686
 
687
+ #: lib/class-testimonials-widget-widget.php:212
688
  msgid "Expand/Collapse"
689
  msgstr ""
690
 
691
+ #: testimonials-widget.php:320
692
  msgid ""
693
  "If your Testimonials Widget display has gone to funky town, please <a href="
694
  "\"%s\">read the FAQ</a> about possible CSS fixes."
695
  msgstr ""
696
 
697
+ #: testimonials-widget.php:329
698
  msgid ""
699
+ "Please donate $5 towards development and support of this Testimonials Widget "
700
  "plugin. %s"
701
  msgstr ""
702
 
703
+ #: testimonials-widget.php:535
704
  msgid "ID"
705
  msgstr ""
706
 
707
+ #: testimonials-widget.php:536
708
  msgid "Image"
709
  msgstr ""
710
 
711
+ #: testimonials-widget.php:538
712
  msgid "Shortcodes"
713
  msgstr ""
714
 
715
+ #: testimonials-widget.php:544
716
  msgid "Published by"
717
  msgstr ""
718
 
719
+ #: testimonials-widget.php:550 testimonials-widget.php:553
720
  msgid "Category"
721
  msgstr ""
722
 
723
+ #: testimonials-widget.php:551 testimonials-widget.php:554
724
  msgid "Tags"
725
  msgstr ""
726
 
727
+ #: testimonials-widget.php:565
728
  msgid "Add New"
729
  msgstr ""
730
 
731
+ #: testimonials-widget.php:566 testimonials-widget.php:569
732
  msgid "Add New Testimonial"
733
  msgstr ""
734
 
735
+ #: testimonials-widget.php:567
736
  msgid "Edit Testimonial"
737
  msgstr ""
738
 
739
+ #: testimonials-widget.php:570 testimonials-widget.php:971
740
  msgid "No testimonials found"
741
  msgstr ""
742
 
743
+ #: testimonials-widget.php:571
744
  msgid "No testimonials found in Trash"
745
  msgstr ""
746
 
747
+ #: testimonials-widget.php:573
748
  msgid "Search Testimonials"
749
  msgstr ""
750
 
751
+ #: testimonials-widget.php:574 testimonials-widget.php:1827
752
  msgid "Testimonial"
753
  msgstr ""
754
 
755
+ #: testimonials-widget.php:575
756
  msgid "View Testimonial"
757
  msgstr ""
758
 
759
+ #: testimonials-widget.php:1116
760
  msgid "…"
761
  msgstr ""
762
 
763
+ #: testimonials-widget.php:1448
764
  msgid "&laquo;"
765
  msgstr ""
766
 
767
+ #: testimonials-widget.php:1457
768
  msgid "&raquo;"
769
  msgstr ""
770
 
771
+ #: testimonials-widget.php:1751
772
  msgid "Testimonial Data"
773
  msgstr ""
774
 
775
+ #: testimonials-widget.php:1776
776
  msgid "Enter title here"
777
  msgstr ""
778
 
779
+ #: testimonials-widget.php:1777
780
  msgid "Enter testimonial source here"
781
  msgstr ""
782
 
783
+ #: testimonials-widget.php:1802
784
  msgid "Testimonial updated. <a href=\"%s\">View testimonial</a>"
785
  msgstr ""
786
 
787
+ #: testimonials-widget.php:1803
788
  msgid "Custom field updated."
789
  msgstr ""
790
 
791
+ #: testimonials-widget.php:1804
792
  msgid "Custom field deleted."
793
  msgstr ""
794
 
795
+ #: testimonials-widget.php:1805
796
  msgid "Testimonial updated."
797
  msgstr ""
798
 
799
  #. translators: %s: date and time of the revision
800
+ #: testimonials-widget.php:1807
801
  msgid "Testimonial restored to revision from %s"
802
  msgstr ""
803
 
804
+ #: testimonials-widget.php:1808
805
  msgid "Testimonial published. <a href=\"%s\">View testimonial</a>"
806
  msgstr ""
807
 
808
+ #: testimonials-widget.php:1809
809
  msgid "Testimonial saved."
810
  msgstr ""
811
 
812
+ #: testimonials-widget.php:1810
813
  msgid ""
814
  "Testimonial submitted. <a target=\"_blank\" href=\"%s\">Preview testimonial</"
815
  "a>"
816
  msgstr ""
817
 
818
+ #: testimonials-widget.php:1811
819
  msgid ""
820
  "Testimonial scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href="
821
  "\"%2$s\">Preview testimonial</a>"
822
  msgstr ""
823
 
824
+ #: testimonials-widget.php:1812
825
  msgid ""
826
  "Testimonial draft updated. <a target=\"_blank\" href=\"%s\">Preview "
827
  "testimonial</a>"
828
  msgstr ""
829
 
830
+ #: testimonials-widget.php:2118
831
+ msgid ""
832
+ "If your Testimonials Widget display has gone to funky town, please <a href="
833
+ "\"%s\">read the FAQ</a> about possible fixes."
834
+ msgstr ""
835
+
836
  #. Plugin URI of the plugin/theme
837
  msgid "http://wordpress.org/extend/plugins/testimonials-widget/"
838
  msgstr ""
lib/class-testimonials-widget-settings.php CHANGED
@@ -38,16 +38,18 @@ class Testimonials_Widget_Settings {
38
  'id' => 'default_field',
39
  'section' => 'general',
40
  'std' => '', // default key or value
 
41
  'title' => '',
42
  'type' => 'text', // textarea, checkbox, radio, select, hidden, heading, password, expand_begin, expand_end
43
  'validate' => '', // required, term, slug, slugs, ids, order, single paramater PHP functions
44
  'widget' => 1, // show in widget options, 0 off
45
  );
46
 
47
- public static $defaults = array();
48
- public static $sections = array();
49
- public static $settings = array();
50
- public static $version = null;
 
51
 
52
 
53
  public function __construct() {
@@ -149,13 +151,6 @@ class Testimonials_Widget_Settings {
149
  'validate' => 'absint',
150
  );
151
 
152
- self::$settings['height'] = array(
153
- 'section' => 'widget',
154
- 'title' => esc_html__( 'Height', 'testimonials-widget' ),
155
- 'desc' => esc_html__( 'Testimonials height, in pixels. Overrides minimum and maximum height', 'testimonials-widget' ),
156
- 'validate' => 'min1',
157
- );
158
-
159
  self::$settings['refresh_interval'] = array(
160
  'section' => 'widget',
161
  'title' => esc_html__( 'Rotation Speed', 'testimonials-widget' ),
@@ -170,51 +165,42 @@ class Testimonials_Widget_Settings {
170
  'type' => 'expand_begin',
171
  );
172
 
173
- self::$settings['keep_whitespace'] = array(
174
  'section' => 'widget',
175
- 'title' => esc_html__( 'Keep Whitespace?', 'testimonials-widget' ),
176
- 'desc' => esc_html__( 'Keeps testimonials looking as entered than sans auto-formatting', 'testimonials-widget' ),
177
- 'type' => 'checkbox',
178
- 'validate' => 'is_true',
 
 
 
 
 
179
  );
180
 
181
- self::$settings['disable_animation'] = array(
182
  'section' => 'widget',
183
- 'title' => esc_html__( 'Disable Animation?', 'testimonials-widget' ),
184
- 'desc' => esc_html__( 'Disable animation between testimonial transitions. Useful when stacking widgets.', 'testimonials-widget' ),
185
  'type' => 'checkbox',
186
  'validate' => 'is_true',
187
  'std' => 1,
188
  );
189
 
190
- self::$settings['fade_out_speed'] = array(
191
- 'section' => 'widget',
192
- 'title' => esc_html__( 'Fade Out Speed', 'testimonials-widget' ),
193
- 'desc' => esc_html__( 'Transition duration in milliseconds; higher values indicate slower animations, not faster ones.', 'testimonials-widget' ),
194
- 'std' => 1250,
195
- 'validate' => 'absint',
196
- );
197
-
198
- self::$settings['fade_in_speed'] = array(
199
  'section' => 'widget',
200
- 'title' => esc_html__( 'Fade In Speed', 'testimonials-widget' ),
201
- 'desc' => esc_html__( 'Transition duration in milliseconds; higher values indicate slower animations, not faster ones.', 'testimonials-widget' ),
202
- 'std' => 500,
203
- 'validate' => 'absint',
204
- );
205
-
206
- self::$settings['min_height'] = array(
207
- 'section' => 'widget',
208
- 'title' => esc_html__( 'Minimum Height', 'testimonials-widget' ),
209
- 'desc' => esc_html__( 'Set for minimum display height, in pixels', 'testimonials-widget' ),
210
- 'validate' => 'min1',
211
  );
212
 
213
- self::$settings['max_height'] = array(
214
  'section' => 'widget',
215
- 'title' => esc_html__( 'Maximum Height', 'testimonials-widget' ),
216
- 'desc' => esc_html__( 'Set for maximum display height, in pixels', 'testimonials-widget' ),
217
- 'validate' => 'min1',
 
218
  );
219
 
220
  self::$settings['bottom_text'] = array(
@@ -250,6 +236,7 @@ class Testimonials_Widget_Settings {
250
  'title' => esc_html__( 'Reviewed Item?', 'testimonials-widget' ),
251
  'desc' => esc_html__( 'Name of thing being referenced in testimonials', 'testimonials-widget' ),
252
  'std' => get_option( 'blogname' ),
 
253
  );
254
 
255
  self::$settings['item_reviewed_url'] = array(
@@ -257,6 +244,7 @@ class Testimonials_Widget_Settings {
257
  'desc' => esc_html__( 'URL of thing being referenced in testimonials', 'testimonials-widget' ),
258
  'std' => network_site_url(),
259
  'validate' => 'url',
 
260
  );
261
 
262
  self::$settings['disable_quotes'] = array(
@@ -377,15 +365,17 @@ class Testimonials_Widget_Settings {
377
  self::$settings['category'] = array(
378
  'section' => 'selection',
379
  'title' => esc_html__( 'Category Filter', 'testimonials-widget' ),
380
- 'desc' => esc_html__( 'Comma separated category slug-names. Ex: category-a, another-category', 'testimonials-widget' ),
381
- 'validate' => 'slugs',
 
382
  );
383
 
384
  self::$settings['tags'] = array(
385
  'section' => 'selection',
386
  'title' => esc_html__( 'Tags Filter', 'testimonials-widget' ),
387
- 'desc' => esc_html__( 'Comma separated tag slug-names. Ex: tag-a, another-tag', 'testimonials-widget' ),
388
- 'validate' => 'slugs',
 
389
  );
390
 
391
  self::$settings['tags_all'] = array(
@@ -529,43 +519,6 @@ class Testimonials_Widget_Settings {
529
  'type' => 'expand_begin',
530
  );
531
 
532
- self::$settings['include_ie7_css'] = array(
533
- 'section' => 'reset',
534
- 'title' => esc_html__( 'Include IE7 CSS?', 'testimonials-widget' ),
535
- 'desc' => esc_html__( 'IE7 specific CSS moved to separate CSS file in version 2.13.6.', 'testimonials-widget' ),
536
- 'type' => 'checkbox',
537
- 'validate' => 'is_true',
538
- 'backwards' => array(
539
- 'version' => '2.13.6',
540
- 'std' => 1,
541
- ),
542
- 'widget' => 1,
543
- );
544
-
545
- self::$settings['remove_hentry'] = array(
546
- 'section' => 'reset',
547
- 'title' => esc_html__( 'Remove `.hentry` CSS?', 'testimonials-widget' ),
548
- 'desc' => esc_html__( 'Pre 2.6.4. Some themes use class `.hentry` in a manner that breaks Testimonials Widgets CSS', 'testimonials-widget' ),
549
- 'type' => 'checkbox',
550
- 'validate' => 'is_true',
551
- 'backwards' => array(
552
- 'version' => '2.6.4',
553
- 'std' => 1,
554
- ),
555
- );
556
-
557
- self::$settings['use_quote_tag'] = array(
558
- 'section' => 'reset',
559
- 'title' => esc_html__( 'Use `&lt;q&gt;` tag?', 'testimonials-widget' ),
560
- 'desc' => esc_html__( 'Pre 2.11.0. Not HTML5 compliant', 'testimonials-widget' ),
561
- 'type' => 'checkbox',
562
- 'validate' => 'is_true',
563
- 'backwards' => array(
564
- 'version' => '2.11.0',
565
- 'std' => 1,
566
- ),
567
- );
568
-
569
  self::$settings['use_cpt_taxonomy'] = array(
570
  'section' => 'reset',
571
  'title' => esc_html__( 'Don\'t Use Default Taxonomies?', 'testimonials-widget' ),
@@ -618,6 +571,120 @@ class Testimonials_Widget_Settings {
618
  'widget' => 0,
619
  );
620
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
621
  self::$settings['reset_expand_end'] = array(
622
  'section' => 'reset',
623
  'type' => 'expand_end',
@@ -679,13 +746,14 @@ class Testimonials_Widget_Settings {
679
  return;
680
 
681
  $field_args = array(
682
- 'type' => $type,
683
- 'id' => $id,
684
- 'desc' => $desc,
685
- 'std' => $std,
686
  'choices' => $choices,
687
- 'label_for' => $id,
688
  'class' => $class,
 
 
 
 
 
 
689
  );
690
 
691
  self::$defaults[$id] = $std;
@@ -804,6 +872,11 @@ class Testimonials_Widget_Settings {
804
  }
805
 
806
 
 
 
 
 
 
807
  public static function display_setting( $args = array(), $do_echo = true, $input = null ) {
808
  $content = '';
809
 
@@ -914,7 +987,12 @@ class Testimonials_Widget_Settings {
914
  break;
915
 
916
  case 'text':
917
- $content .= '<input class="regular-text' . $field_class . '" type="text" id="' . $id . '" name="' . self::ID . '[' . $id . ']" placeholder="' . $std . '" value="' . $options[$id] . '" />';
 
 
 
 
 
918
 
919
  if ( ! empty( $desc ) )
920
  $content .= '<br /><span class="description">' . $desc . '</span>';
@@ -979,10 +1057,7 @@ class Testimonials_Widget_Settings {
979
 
980
 
981
  public function styles() {
982
- if ( ! is_ssl() )
983
- wp_enqueue_style( 'jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );
984
- else
985
- wp_enqueue_style( 'jquery-style', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );
986
  }
987
 
988
 
@@ -1211,7 +1286,10 @@ class Testimonials_Widget_Settings {
1211
 
1212
  case 'term':
1213
  $input[ $id ] = self::validate_term( $input[ $id ], $default );
1214
- $input[ $id ] = strtolower( $input[ $id ] );
 
 
 
1215
  break;
1216
 
1217
  case 'url':
@@ -1269,6 +1347,14 @@ class Testimonials_Widget_Settings {
1269
  }
1270
 
1271
 
 
 
 
 
 
 
 
 
1272
  public static function validate_url( $input, $default ) {
1273
  if ( filter_var( $input, FILTER_VALIDATE_URL ) )
1274
  return $input;
@@ -1365,6 +1451,44 @@ class Testimonials_Widget_Settings {
1365
  }
1366
 
1367
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1368
  }
1369
 
1370
 
38
  'id' => 'default_field',
39
  'section' => 'general',
40
  'std' => '', // default key or value
41
+ 'suggest' => false, // attempt for auto-suggest on inputs
42
  'title' => '',
43
  'type' => 'text', // textarea, checkbox, radio, select, hidden, heading, password, expand_begin, expand_end
44
  'validate' => '', // required, term, slug, slugs, ids, order, single paramater PHP functions
45
  'widget' => 1, // show in widget options, 0 off
46
  );
47
 
48
+ public static $defaults = array();
49
+ public static $sections = array();
50
+ public static $settings = array();
51
+ public static $suggest_id = 0;
52
+ public static $version = null;
53
 
54
 
55
  public function __construct() {
151
  'validate' => 'absint',
152
  );
153
 
 
 
 
 
 
 
 
154
  self::$settings['refresh_interval'] = array(
155
  'section' => 'widget',
156
  'title' => esc_html__( 'Rotation Speed', 'testimonials-widget' ),
165
  'type' => 'expand_begin',
166
  );
167
 
168
+ self::$settings['transition_mode'] = array(
169
  'section' => 'widget',
170
+ 'title' => esc_html__( 'Transition Mode?', 'testimonials-widget' ),
171
+ 'desc' => esc_html__( 'Type of transition between slides', 'testimonials-widget' ),
172
+ 'type' => 'select',
173
+ 'choices' => array(
174
+ 'fade' => esc_html__( 'Fade', 'testimonials-widget' ),
175
+ 'horizontal' => esc_html__( 'Horizontal', 'testimonials-widget' ),
176
+ 'vertical' => esc_html__( 'Vertical', 'testimonials-widget' ),
177
+ ),
178
+ 'std' => 'fade',
179
  );
180
 
181
+ self::$settings['show_start_stop'] = array(
182
  'section' => 'widget',
183
+ 'title' => esc_html__( 'Show Play/Pause?', 'testimonials-widget' ),
184
+ 'desc' => esc_html__( 'Display start and stop buttons underneath the testimonial slider.', 'testimonials-widget' ),
185
  'type' => 'checkbox',
186
  'validate' => 'is_true',
187
  'std' => 1,
188
  );
189
 
190
+ self::$settings['enable_video'] = array(
 
 
 
 
 
 
 
 
191
  'section' => 'widget',
192
+ 'title' => esc_html__( 'Enable Video?', 'testimonials-widget' ),
193
+ 'desc' => esc_html__( 'Only enable when displaying video content.', 'testimonials-widget' ),
194
+ 'type' => 'checkbox',
195
+ 'validate' => 'is_true',
 
 
 
 
 
 
 
196
  );
197
 
198
+ self::$settings['keep_whitespace'] = array(
199
  'section' => 'widget',
200
+ 'title' => esc_html__( 'Keep Whitespace?', 'testimonials-widget' ),
201
+ 'desc' => esc_html__( 'Keeps testimonials looking as entered than sans auto-formatting', 'testimonials-widget' ),
202
+ 'type' => 'checkbox',
203
+ 'validate' => 'is_true',
204
  );
205
 
206
  self::$settings['bottom_text'] = array(
236
  'title' => esc_html__( 'Reviewed Item?', 'testimonials-widget' ),
237
  'desc' => esc_html__( 'Name of thing being referenced in testimonials', 'testimonials-widget' ),
238
  'std' => get_option( 'blogname' ),
239
+ 'widget' => 0,
240
  );
241
 
242
  self::$settings['item_reviewed_url'] = array(
244
  'desc' => esc_html__( 'URL of thing being referenced in testimonials', 'testimonials-widget' ),
245
  'std' => network_site_url(),
246
  'validate' => 'url',
247
+ 'widget' => 0,
248
  );
249
 
250
  self::$settings['disable_quotes'] = array(
365
  self::$settings['category'] = array(
366
  'section' => 'selection',
367
  'title' => esc_html__( 'Category Filter', 'testimonials-widget' ),
368
+ 'desc' => esc_html__( 'Comma separated category names. Ex: Category A, Another category', 'testimonials-widget' ),
369
+ 'validate' => 'terms',
370
+ 'suggest' => true,
371
  );
372
 
373
  self::$settings['tags'] = array(
374
  'section' => 'selection',
375
  'title' => esc_html__( 'Tags Filter', 'testimonials-widget' ),
376
+ 'desc' => esc_html__( 'Comma separated tag names. Ex: Tag A, Another tag', 'testimonials-widget' ),
377
+ 'validate' => 'terms',
378
+ 'suggest' => true,
379
  );
380
 
381
  self::$settings['tags_all'] = array(
519
  'type' => 'expand_begin',
520
  );
521
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
522
  self::$settings['use_cpt_taxonomy'] = array(
523
  'section' => 'reset',
524
  'title' => esc_html__( 'Don\'t Use Default Taxonomies?', 'testimonials-widget' ),
571
  'widget' => 0,
572
  );
573
 
574
+ self::$settings['version_options_heading'] = array(
575
+ 'section' => 'reset',
576
+ 'desc' => esc_html__( 'Version Based Options', 'testimonials-widget' ),
577
+ 'type' => 'heading',
578
+ );
579
+
580
+ self::$settings['use_bxslider'] = array(
581
+ 'section' => 'reset',
582
+ 'title' => esc_html__( 'Use bxSlider?', 'testimonials-widget' ),
583
+ 'desc' => esc_html__( 'Pre 2.15.0, Testimonials Widgets used custom JavaScript for transitions.', 'testimonials-widget' ),
584
+ 'type' => 'checkbox',
585
+ 'validate' => 'is_true',
586
+ 'backwards' => array(
587
+ 'version' => '2.15.0',
588
+ 'std' => 0,
589
+ ),
590
+ 'std' => 1,
591
+ );
592
+
593
+ self::$settings['disable_animation'] = array(
594
+ 'section' => 'reset',
595
+ 'title' => esc_html__( 'Disable Animation?', 'testimonials-widget' ),
596
+ 'desc' => esc_html__( 'Pre 2.15.0, Disable animation between testimonial transitions. Useful when stacking widgets.', 'testimonials-widget' ),
597
+ 'type' => 'checkbox',
598
+ 'validate' => 'is_true',
599
+ 'std' => 1,
600
+ );
601
+
602
+ self::$settings['fade_out_speed'] = array(
603
+ 'section' => 'reset',
604
+ 'title' => esc_html__( 'Fade Out Speed', 'testimonials-widget' ),
605
+ 'desc' => esc_html__( 'Pre 2.15.0, Transition duration in milliseconds; higher values indicate slower animations, not faster ones.', 'testimonials-widget' ),
606
+ 'std' => 1250,
607
+ 'validate' => 'absint',
608
+ );
609
+
610
+ self::$settings['fade_in_speed'] = array(
611
+ 'section' => 'reset',
612
+ 'title' => esc_html__( 'Fade In Speed', 'testimonials-widget' ),
613
+ 'desc' => esc_html__( 'Pre 2.15.0, Transition duration in milliseconds; higher values indicate slower animations, not faster ones.', 'testimonials-widget' ),
614
+ 'std' => 500,
615
+ 'validate' => 'absint',
616
+ );
617
+
618
+ self::$settings['height'] = array(
619
+ 'section' => 'reset',
620
+ 'title' => esc_html__( 'Height', 'testimonials-widget' ),
621
+ 'desc' => esc_html__( 'Pre 2.15.0, Testimonials height, in pixels. Overrides minimum and maximum height', 'testimonials-widget' ),
622
+ 'validate' => 'min1',
623
+ );
624
+
625
+ self::$settings['min_height'] = array(
626
+ 'section' => 'reset',
627
+ 'title' => esc_html__( 'Minimum Height', 'testimonials-widget' ),
628
+ 'desc' => esc_html__( 'Pre 2.15.0, Set for minimum display height, in pixels', 'testimonials-widget' ),
629
+ 'validate' => 'min1',
630
+ );
631
+
632
+ self::$settings['max_height'] = array(
633
+ 'section' => 'reset',
634
+ 'title' => esc_html__( 'Maximum Height', 'testimonials-widget' ),
635
+ 'desc' => esc_html__( 'Pre 2.15.0, Set for maximum display height, in pixels', 'testimonials-widget' ),
636
+ 'validate' => 'min1',
637
+ );
638
+
639
+ self::$settings['force_css_loading'] = array(
640
+ 'section' => 'reset',
641
+ 'title' => esc_html__( 'Always Load CSS?', 'testimonials-widget' ),
642
+ 'desc' => esc_html__( 'Pre 2.14.0, Testimonials Widgets CSS was always loaded, whether needed or not', 'testimonials-widget' ),
643
+ 'type' => 'checkbox',
644
+ 'validate' => 'is_true',
645
+ 'backwards' => array(
646
+ 'version' => '2.14.0',
647
+ 'std' => 1,
648
+ ),
649
+ );
650
+
651
+ self::$settings['include_ie7_css'] = array(
652
+ 'section' => 'reset',
653
+ 'title' => esc_html__( 'Include IE7 CSS?', 'testimonials-widget' ),
654
+ 'desc' => esc_html__( 'IE7 specific CSS moved to separate CSS file in version 2.13.6.', 'testimonials-widget' ),
655
+ 'type' => 'checkbox',
656
+ 'validate' => 'is_true',
657
+ 'backwards' => array(
658
+ 'version' => '2.13.6',
659
+ 'std' => 1,
660
+ ),
661
+ 'widget' => 1,
662
+ );
663
+
664
+ self::$settings['use_quote_tag'] = array(
665
+ 'section' => 'reset',
666
+ 'title' => esc_html__( 'Use `&lt;q&gt;` tag?', 'testimonials-widget' ),
667
+ 'desc' => esc_html__( 'Pre 2.11.0, not HTML5 compliant', 'testimonials-widget' ),
668
+ 'type' => 'checkbox',
669
+ 'validate' => 'is_true',
670
+ 'backwards' => array(
671
+ 'version' => '2.11.0',
672
+ 'std' => 1,
673
+ ),
674
+ );
675
+
676
+ self::$settings['remove_hentry'] = array(
677
+ 'section' => 'reset',
678
+ 'title' => esc_html__( 'Remove `.hentry` CSS?', 'testimonials-widget' ),
679
+ 'desc' => esc_html__( 'Pre 2.6.4, some themes use class `.hentry` in a manner that breaks Testimonials Widgets CSS', 'testimonials-widget' ),
680
+ 'type' => 'checkbox',
681
+ 'validate' => 'is_true',
682
+ 'backwards' => array(
683
+ 'version' => '2.6.4',
684
+ 'std' => 1,
685
+ ),
686
+ );
687
+
688
  self::$settings['reset_expand_end'] = array(
689
  'section' => 'reset',
690
  'type' => 'expand_end',
746
  return;
747
 
748
  $field_args = array(
 
 
 
 
749
  'choices' => $choices,
 
750
  'class' => $class,
751
+ 'desc' => $desc,
752
+ 'id' => $id,
753
+ 'label_for' => $id,
754
+ 'std' => $std,
755
+ 'suggest' => $suggest,
756
+ 'type' => $type,
757
  );
758
 
759
  self::$defaults[$id] = $std;
872
  }
873
 
874
 
875
+ /**
876
+ *
877
+ *
878
+ * @SuppressWarnings(PHPMD.UnusedLocalVariable)
879
+ */
880
  public static function display_setting( $args = array(), $do_echo = true, $input = null ) {
881
  $content = '';
882
 
987
  break;
988
 
989
  case 'text':
990
+ $suggest_id = 'suggest_' . self::$suggest_id++;
991
+
992
+ $content .= '<input class="regular-text' . $field_class . ' ' . $suggest_id . '" type="text" id="' . $id . '" name="' . self::ID . '[' . $id . ']" placeholder="' . $std . '" value="' . $options[$id] . '" />';
993
+
994
+ if ( $suggest )
995
+ $content .= self::get_suggest( $id, $suggest_id );
996
 
997
  if ( ! empty( $desc ) )
998
  $content .= '<br /><span class="description">' . $desc . '</span>';
1057
 
1058
 
1059
  public function styles() {
1060
+ wp_enqueue_style( 'jquery-style', '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );
 
 
 
1061
  }
1062
 
1063
 
1286
 
1287
  case 'term':
1288
  $input[ $id ] = self::validate_term( $input[ $id ], $default );
1289
+ break;
1290
+
1291
+ case 'terms':
1292
+ $input[ $id ] = self::validate_terms( $input[ $id ], $default );
1293
  break;
1294
 
1295
  case 'url':
1347
  }
1348
 
1349
 
1350
+ public static function validate_terms( $input, $default ) {
1351
+ if ( preg_match( '#^(([\w- ]+)(,\s?)?)+$#', $input ) )
1352
+ return preg_replace( '#,\s*$#', '', $input );
1353
+
1354
+ return $default;
1355
+ }
1356
+
1357
+
1358
  public static function validate_url( $input, $default ) {
1359
  if ( filter_var( $input, FILTER_VALIDATE_URL ) )
1360
  return $input;
1451
  }
1452
 
1453
 
1454
+ public static function get_suggest( $id, $suggest_id ) {
1455
+ wp_enqueue_script( 'suggest' );
1456
+
1457
+ $use_cpt_taxonomy = tw_get_option( 'use_cpt_taxonomy', false );
1458
+
1459
+ switch ( $id ) {
1460
+ case 'category':
1461
+ if ( ! $use_cpt_taxonomy )
1462
+ $taxonomy = 'category';
1463
+ else
1464
+ $taxonomy = self::$cpt_category;
1465
+
1466
+ break;
1467
+
1468
+ case 'tags':
1469
+ if ( ! $use_cpt_taxonomy )
1470
+ $taxonomy = 'post_tag';
1471
+ else
1472
+ $taxonomy = self::$cpt_tags;
1473
+
1474
+ break;
1475
+ }
1476
+
1477
+ $ajax_url = site_url() . '/wp-admin/admin-ajax.php';
1478
+ $suggest_js = "suggest( '{$ajax_url}?action=ajax-tag-search&tax={$taxonomy}', { delay: 500, minchars: 2, multiple: true, multipleSep: ', ' } )";
1479
+
1480
+ $scripts = <<<EOD
1481
+ <script type="text/javascript">
1482
+ jQuery(document).ready( function() {
1483
+ jQuery( '.{$suggest_id}' ).{$suggest_js};
1484
+ });
1485
+ </script>
1486
+ EOD;
1487
+
1488
+ return $scripts;
1489
+ }
1490
+
1491
+
1492
  }
1493
 
1494
 
lib/class-testimonials-widget-widget.php CHANGED
@@ -188,6 +188,11 @@ class Testimonials_Widget_Widget extends WP_Widget {
188
  }
189
 
190
 
 
 
 
 
 
191
  public function display_setting( $args = array(), $options ) {
192
  extract( $args );
193
 
@@ -286,7 +291,11 @@ class Testimonials_Widget_Widget extends WP_Widget {
286
  case 'text':
287
  echo '<label for="' . $this->get_field_id( $id ) . '">' . $title . '</label>';
288
 
289
- echo '<input class="widefat' . $field_class . '" type="text" id="' . $this->get_field_id( $id ) . '" name="' . $this->get_field_name( $id ) . '" placeholder="' . $std . '" value="' . esc_attr( $options[$id] ) . '" />';
 
 
 
 
290
  break;
291
 
292
  default:
188
  }
189
 
190
 
191
+ /**
192
+ *
193
+ *
194
+ * @SuppressWarnings(PHPMD.UnusedLocalVariable)
195
+ */
196
  public function display_setting( $args = array(), $options ) {
197
  extract( $args );
198
 
291
  case 'text':
292
  echo '<label for="' . $this->get_field_id( $id ) . '">' . $title . '</label>';
293
 
294
+ $suggest_id = 'suggest_' . Testimonials_Widget_Settings::$suggest_id++;
295
+ echo '<input class="widefat' . $field_class . ' ' . $suggest_id . '" type="text" id="' . $this->get_field_id( $id ) . '" name="' . $this->get_field_name( $id ) . '" placeholder="' . $std . '" value="' . esc_attr( $options[$id] ) . '" />';
296
+
297
+ if ( $suggest )
298
+ echo Testimonials_Widget_Settings::get_suggest( $id, $suggest_id );
299
  break;
300
 
301
  default:
readme.txt CHANGED
@@ -3,9 +3,9 @@
3
  Contributors: comprock
4
  Donate link: http://aihr.us/about-aihrus/donate/
5
  Tags: client, customer, portfolio, quotations, quote, quotes, random, recommendation, reference, review, reviews, testimonial, testimonials, testimony, wpml
6
- Requires at least: 3.4
7
- Tested up to: 3.6.1
8
- Stable tag: 2.14.0
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -21,6 +21,19 @@ Testimonials Widget plugin allows you to display random or selected portfolio, q
21
 
22
  **View a [Live Testimonials Widget Demo](http://aihr.us/good-work-deserves-good-words-testimonials-widget-examples/)**
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  More than one Testimonials Widget instance can be displayed at a time pulls from the `testimonials-widget` custom post type. Additionally, with shortcodes and theme functions, you can display a short or long list or rotation of testimonials. Each Testimonial Widget has its own CSS identifier for custom styling.
25
 
26
  Widgets display content sans `wpautop` formatting. This means no forced paragraph breaks unless the content specifically contains them. You can enable `wpautop` via the "Keep whitespace?" option.
@@ -43,57 +56,25 @@ The single testimonial view supports image, source, title, location, email, comp
43
  * Single testimonial view includes image, source, title, location, email, company and URL details
44
  * Testimonials archive view
45
  * Use custom taxonomy or WordPress's own for categories and tags
 
 
 
46
 
47
- = Testimonials Widget Premium Plugin Features =
48
 
49
- Testimonials Widget Premium adds onto the best WordPress testimonials plugin there is, [Testimonials Widget](http://wordpress.org/extend/plugins/testimonials-widget/). Testimonials Widget Premium offers [caching, excerpts, filters, read more links](http://aihr.us/downloads/testimonials-widget-premium-wordpress-plugin/), more selection options, and advanced capabilities like using custom post types as testimonials. Additionally, testimonials can be rated and users can submit their own testimonials via a front-end form shortcode or widget.
50
 
51
- * "Read more" link column on testimonial posts admin page
52
- * Admin mode only anti-spam debug help text
53
- * Akismet anti-spam checking
54
  * Alternate destinations for "Read more" links
55
- * Alternating `.even` and `.odd` CSS classes for styling testimonial list entries
56
- * Automatically change to the next testimonial, per the sort order, whenever a user navigates to another page.
57
- * Built-in update notification
58
  * CSS or HTML table based testimonials submissions form layout
59
- * Cache per page when you use custom testimonials instance per page
60
  * Caching of testimonials queries and content to decrease server load time improve page loading speed by 1/10 to 1/2 a second
61
- * Clear cache when WP Super Cache, FlexiCache, Hyper Cache, DB Cache Reloaded Fix does
62
- * Deactivates self if no active or incorrect version of Testimonials Widget plugin
63
- * Default post author, category, and status options for user testimonial submissions
64
- * Deletes old and related testimonial cache entries automatically
65
- * Disable caching for widget, shortcode or theme functions
66
- * Disable donate and purchase related text and links
67
  * Displays ratings to grant testimonials more power!
68
- * Email notification for user submitted testimonials
69
  * Excerpts for widget view, with read more link to complete testimonial
70
- * Fields for rating, item reviewed, and item URL per testimonial
71
- * Filters for caching and more link control, text replacement, and more
72
- * Form "Testimonial" header text is customizable to "Specials" or other terms
73
  * Front-end entry form for user supplied testimonials. **[Live form demo](http://aihr.us/about-aihrus/testimonials/add-testimonial/)**
74
- * Math-based CAPTCHA
75
- * Multiple anti-spam traps
76
- * Multiple user-entry forms on same page are allowed
77
- * Override Review schema author name
78
- * Plugin version tracking to ensure compatibility
79
- * Premium tab on settings screen for site-wide option defaults
80
- * Prevent duplicate testimonials when using multiple testimonial instances
81
- * Read more links for testimonials exceeding the character limit
82
- * Require minimumal testimonial rating for display
83
- * Review microdata format per schema.org
84
- * Right Now Dashboard widget displays "Pending Testimonials" counts
85
  * Select only testimonials with excerpts, images or of arbitrary maximum and minimum length
86
- * Select post, page and other custom post types for content rotations slider
87
- * Settings and URL based cache clearing
88
- * Shortcodes and theme functions for testimonials count and testimonial link list
89
- * Shortcodes, theme functions, and widget user testimonial submission form
90
- * Show excerpts with list and single views
91
- * Show unique testimonials on page with multiple testimonial instances
92
- * Simple, single rating per testimonials (more capabilities to come in future releases)
93
- * Testimonial links listing with image, source, title, location, company, and URL fields
94
- * Upload images by browsing or URL
95
- * WP Admin > Testmonials > Clear Cache menu link
96
- * WPML compatible
97
 
98
  = Premium Shortcodes =
99
 
@@ -103,11 +84,12 @@ Testimonials Widget Premium adds onto the best WordPress testimonials plugin the
103
 
104
  [Buy Testimonials Widget Premium](http://aihr.us/downloads/testimonials-widget-premium-wordpress-plugin/) plugin for WordPress.
105
 
106
- = Additional Testimonials Widget Features =
107
 
108
  * Adjustable animation speed
109
  * Archive Page URL and Testimonial Page URL are prevented from being the same or matching existing pages.
110
  * Auto-migration from pre-2.0.0 custom table to new Testimonials Widget custom post type
 
111
  * Automatic linking of email and URL fields via source or company fields
112
  * Clickable widget titles
113
  * Commenting on testimonial single-view pages
@@ -203,9 +185,9 @@ Further, global settings are the baseline for shortcodes. If you want to alter t
203
 
204
  **Selection**
205
 
206
- * Category Filter - Comma separated category slug-names
207
  * `category` - default none; category=product or category="category-a, another-category"
208
- * Tags Filter - Comma separated tag slug-names
209
  * `tags` - default none; tags=fire or tags="tag-a, another-tag"
210
  * Require All Tags - Select only testimonials with all of the given tags
211
  * `tags_all` - default OR; tags_all=true
@@ -237,23 +219,17 @@ Further, global settings are the baseline for shortcodes. If you want to alter t
237
  * Character Limit - Number of characters to limit testimonial views to
238
  * `char_limit` - default none; char_limit=200
239
  * Widget - default 500
240
- * Height - Testimonials height, in pixels. Overrides minimum and maximum height
241
- * `height` - default none; height=300
242
  * Rotation speed - Seconds between testimonial rotations or 0 for no rotation at all
243
  * `refresh_interval` - default 5; refresh_interval=0
 
 
 
 
 
 
244
  * Keep Whitespace? - Keeps testimonials looking as entered than sans auto-formatting
245
  * `keep_whitespace` - default none; keep_whitespace=true
246
  * The citation has no whitespace adaptations. It's straight text, except for email or URL links. The presentation is handled strictly by CSS.
247
- * Disable Animation? - Disable animation between testimonial transitions. Useful when stacking.
248
- * `disable_animation` - default false; disable_animation=true
249
- * Fade Out Speed - Transition duration in milliseconds; higher values indicate slower animations, not faster ones.
250
- * `fade_out_speed` - default 1250; fade_out_speed=400
251
- * Fade In Speed - Transition duration in milliseconds; higher values indicate slower animations, not faster ones.
252
- * `fade_in_speed` - default 500; fade_in_speed=800
253
- * Minimum Height - Set for minimum display height, in pixels
254
- * `min_height` - default none; min_height=100
255
- * Maximum Height - Set for maximum display height, in pixels
256
- * `max_height` - default none; max_height=250
257
  * Testimonial Bottom Text - Custom text or HTML for bottom of testimonials
258
  * `bottom_text` - default none; bottom_text="`&lt;h3&gt;&lt;a href="http://example.com"&gt;All testimonials&lt;/a&gt;&lt;/h3&gt;`"
259
 
@@ -267,17 +243,34 @@ Further, global settings are the baseline for shortcodes. If you want to alter t
267
 
268
  **Compatibility & Reset**
269
 
270
- * Include IE7 CSS? - IE7 specific CSS moved to separate CSS file in version 2.13.6.
271
- * Remove `.hentry` CSS? – Some themes use class `.hentry` in a manner that breaks Testimonials Widgets CSS
272
- * `remove_hentry` - default none; remove_hentry=true
273
- * Use `<q>` tag? – Pre 2.11.0. Not HTML5 compliant
274
- * `use_quote_tag` - default none; use_quote_tag=true
275
  * Don't Use Default Taxonomies? – If checked, use Testimonials Widget's own category and tag taxonomies instead
276
  * Export Settings – These are your current settings in a serialized format. Copy the contents to make a backup of your settings.
277
  * Import Settings – Paste new serialized settings here to overwrite your current configuration.
278
  * Remove Plugin Data on Deletion? - Delete all Testimonials Widget data and options from database on plugin deletion
279
  * Reset to Defaults? – Check this box to reset options to their defaults
280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  = Shortcode Examples =
282
 
283
  **[testimonialswidget_list]**
@@ -380,9 +373,12 @@ If you want to contribute and I hope you do, visit the [Testimonials Widget Gith
380
 
381
  1. [How do I change my widget's rotation speed or other options?](https://aihrus.zendesk.com/entries/27714083-How-do-I-change-my-widget-s-rotation-speed-or-other-options-)
382
  1. [Debug common theme and plugin conflicts](https://aihrus.zendesk.com/entries/25119302-How-do-you-debug-common-issues-)
383
- 1. [Change or debug CSS](https://aihrus.zendesk.com/entries/24910733-How-to-Correct-Testimonials-Widget-CSS-Issues)
384
  1. [Pagination is broken](https://aihrus.zendesk.com/entries/23693513-My-testimonials-list-paging-doesn-t-work)
385
  1. [Test Review schema output](http://www.google.com/webmasters/tools/richsnippets)
 
 
 
386
 
387
  = Still Stuck? =
388
 
@@ -419,6 +415,10 @@ See [Changelog](https://github.com/michael-cannon/testimonials-widget/blob/maste
419
 
420
  == Upgrade Notice ==
421
 
 
 
 
 
422
  = 2.14.0 =
423
 
424
  * **60 modifications** See [Changelog](https://github.com/michael-cannon/testimonials-widget/blob/master/CHANGELOG.md)
3
  Contributors: comprock
4
  Donate link: http://aihr.us/about-aihrus/donate/
5
  Tags: client, customer, portfolio, quotations, quote, quotes, random, recommendation, reference, review, reviews, testimonial, testimonials, testimony, wpml
6
+ Requires at least: 3.6
7
+ Tested up to: 3.8.0
8
+ Stable tag: 2.15.0
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
21
 
22
  **View a [Live Testimonials Widget Demo](http://aihr.us/good-work-deserves-good-words-testimonials-widget-examples/)**
23
 
24
+ = Awesome Content Slider Capabilities! =
25
+
26
+ * Slide Images - responsive image slideshow
27
+ * Slide Videos - video slideshow
28
+ * Slide Text - useful for rotating testimonials
29
+ * Slide Mixed Content: slideshow having video slides, images slides, and text slides. Each individual slide can also have mixed content.
30
+ * Shortcode compatible - slide content that is rendered using shortcodes. i.e. stock Worpdress Galleries and Gravity Forms
31
+ * Widget ready
32
+ * Shortcode ready
33
+ * Random display
34
+ * Fade and slide transitions
35
+ * Filter slideshow content by WordPress' built in categories, tags, or post-ID
36
+
37
  More than one Testimonials Widget instance can be displayed at a time pulls from the `testimonials-widget` custom post type. Additionally, with shortcodes and theme functions, you can display a short or long list or rotation of testimonials. Each Testimonial Widget has its own CSS identifier for custom styling.
38
 
39
  Widgets display content sans `wpautop` formatting. This means no forced paragraph breaks unless the content specifically contains them. You can enable `wpautop` via the "Keep whitespace?" option.
56
  * Single testimonial view includes image, source, title, location, email, company and URL details
57
  * Testimonials archive view
58
  * Use custom taxonomy or WordPress's own for categories and tags
59
+ * Use's [bxSlider](http://bxslider.com) for transitions
60
+
61
+ = Testimonials Widget Premium =
62
 
63
+ Testimonials Widget Premium adds onto the best WordPress testimonials plugin there is, [Testimonials Widget](http://wordpress.org/extend/plugins/testimonials-widget/). Testimonials Widget Premium offers [caching, excerpts, filters, read more links](http://aihr.us/downloads/testimonials-widget-premium-wordpress-plugin/), more selection options, and advanced capabilities like using custom post types as testimonials. Additionally, testimonials support ratings and users can submit their own testimonials via a front-end form shortcode or widget.
64
 
65
+ = Primary Premium Features =
66
 
67
+ * Akismet, math-based CAPTCHA, and more anti-spam traps
 
 
68
  * Alternate destinations for "Read more" links
69
+ * Auto rotate testimonials by page
 
 
70
  * CSS or HTML table based testimonials submissions form layout
 
71
  * Caching of testimonials queries and content to decrease server load time improve page loading speed by 1/10 to 1/2 a second
72
+ * Carousel mode for rotating multiple testimonials at the same time
 
 
 
 
 
73
  * Displays ratings to grant testimonials more power!
 
74
  * Excerpts for widget view, with read more link to complete testimonial
 
 
 
75
  * Front-end entry form for user supplied testimonials. **[Live form demo](http://aihr.us/about-aihrus/testimonials/add-testimonial/)**
 
 
 
 
 
 
 
 
 
 
 
76
  * Select only testimonials with excerpts, images or of arbitrary maximum and minimum length
77
+ * Show unique testimonials when displaying multiple testimonial instances
 
 
 
 
 
 
 
 
 
 
78
 
79
  = Premium Shortcodes =
80
 
84
 
85
  [Buy Testimonials Widget Premium](http://aihr.us/downloads/testimonials-widget-premium-wordpress-plugin/) plugin for WordPress.
86
 
87
+ = Additional Features =
88
 
89
  * Adjustable animation speed
90
  * Archive Page URL and Testimonial Page URL are prevented from being the same or matching existing pages.
91
  * Auto-migration from pre-2.0.0 custom table to new Testimonials Widget custom post type
92
+ * Auto-suggest for category and tag options
93
  * Automatic linking of email and URL fields via source or company fields
94
  * Clickable widget titles
95
  * Commenting on testimonial single-view pages
185
 
186
  **Selection**
187
 
188
+ * Category Filter - Comma separated category names
189
  * `category` - default none; category=product or category="category-a, another-category"
190
+ * Tags Filter - Comma separated tag names
191
  * `tags` - default none; tags=fire or tags="tag-a, another-tag"
192
  * Require All Tags - Select only testimonials with all of the given tags
193
  * `tags_all` - default OR; tags_all=true
219
  * Character Limit - Number of characters to limit testimonial views to
220
  * `char_limit` - default none; char_limit=200
221
  * Widget - default 500
 
 
222
  * Rotation speed - Seconds between testimonial rotations or 0 for no rotation at all
223
  * `refresh_interval` - default 5; refresh_interval=0
224
+ * Transition Mode? - Type of transition between slides
225
+ * `transition_mode` - default fade; transition_mode=horizontal|vertical|fade
226
+ * Show Play/Pause? - Display start and stop buttons underneath the testimonial slider.
227
+ * `show_start_stop` - default true; show_start_stop=false
228
+ * Enable Video? - Only enable when displaying video content.
229
+ * `enable_video` - default false; enable_video=true
230
  * Keep Whitespace? - Keeps testimonials looking as entered than sans auto-formatting
231
  * `keep_whitespace` - default none; keep_whitespace=true
232
  * The citation has no whitespace adaptations. It's straight text, except for email or URL links. The presentation is handled strictly by CSS.
 
 
 
 
 
 
 
 
 
 
233
  * Testimonial Bottom Text - Custom text or HTML for bottom of testimonials
234
  * `bottom_text` - default none; bottom_text="`&lt;h3&gt;&lt;a href="http://example.com"&gt;All testimonials&lt;/a&gt;&lt;/h3&gt;`"
235
 
243
 
244
  **Compatibility & Reset**
245
 
 
 
 
 
 
246
  * Don't Use Default Taxonomies? – If checked, use Testimonials Widget's own category and tag taxonomies instead
247
  * Export Settings – These are your current settings in a serialized format. Copy the contents to make a backup of your settings.
248
  * Import Settings – Paste new serialized settings here to overwrite your current configuration.
249
  * Remove Plugin Data on Deletion? - Delete all Testimonials Widget data and options from database on plugin deletion
250
  * Reset to Defaults? – Check this box to reset options to their defaults
251
 
252
+ **Version Based Options**
253
+
254
+ * Use bxSlider? - Pre 2.15.0, Testimonials Widgets used custom JavaScript for transitions.
255
+ * Disable Animation? - Disable animation between testimonial transitions. Useful when stacking.
256
+ * `disable_animation` - default false; disable_animation=true
257
+ * Fade Out Speed - Transition duration in milliseconds; higher values indicate slower animations, not faster ones.
258
+ * `fade_out_speed` - default 1250; fade_out_speed=400
259
+ * Fade In Speed - Transition duration in milliseconds; higher values indicate slower animations, not faster ones.
260
+ * `fade_in_speed` - default 500; fade_in_speed=800
261
+ * Height - Testimonials height, in pixels. Overrides minimum and maximum height
262
+ * `height` - default none; height=300
263
+ * Minimum Height - Set for minimum display height, in pixels
264
+ * `min_height` - default none; min_height=100
265
+ * Maximum Height - Set for maximum display height, in pixels
266
+ * `max_height` - default none; max_height=250
267
+ * Always Load CSS? - Pre 2.14.0. Testimonials Widgets CSS was always loaded, whether needed or not
268
+ * Include IE7 CSS? - IE7 specific CSS moved to separate CSS file in version 2.13.6.
269
+ * Use `<q>` tag? – Pre 2.11.0. Not HTML5 compliant
270
+ * `use_quote_tag` - default none; use_quote_tag=true
271
+ * Remove `.hentry` CSS? – Some themes use class `.hentry` in a manner that breaks Testimonials Widgets CSS
272
+ * `remove_hentry` - default none; remove_hentry=true
273
+
274
  = Shortcode Examples =
275
 
276
  **[testimonialswidget_list]**
373
 
374
  1. [How do I change my widget's rotation speed or other options?](https://aihrus.zendesk.com/entries/27714083-How-do-I-change-my-widget-s-rotation-speed-or-other-options-)
375
  1. [Debug common theme and plugin conflicts](https://aihrus.zendesk.com/entries/25119302-How-do-you-debug-common-issues-)
376
+ 1. [Change or debug CSS](https://aihrus.zendesk.com/entries/24910733-How-to-Correct-Testimonials-Widget-CSS-Issues) AKA "What's up with these quotes?"
377
  1. [Pagination is broken](https://aihrus.zendesk.com/entries/23693513-My-testimonials-list-paging-doesn-t-work)
378
  1. [Test Review schema output](http://www.google.com/webmasters/tools/richsnippets)
379
+ 1. [Customize bxSlider](http://bxslider.com/examples)
380
+
381
+ * [Major Change for 2.15.0](https://aihrus.zendesk.com/entries/28402246-Major-Change-for-2-15-0)
382
 
383
  = Still Stuck? =
384
 
415
 
416
  == Upgrade Notice ==
417
 
418
+ = 2.15.0 =
419
+
420
+ * If upgrading, bxSlider will not be enabled by default. You must enable it in your widget and global settings. CSS customizations must be reviewed to have the `.active` and `.display-none` classes removed. The main `.testimonials-widget-testimonial` class also need the `display: none;` and `clear: left;` removed.
421
+
422
  = 2.14.0 =
423
 
424
  * **60 modifications** See [Changelog](https://github.com/michael-cannon/testimonials-widget/blob/master/CHANGELOG.md)
testimonials-widget.css CHANGED
@@ -1,21 +1,7 @@
1
  .testimonials-widget-testimonials {
2
- /* testimonials wrapper */
3
  }
4
 
5
  .testimonials-widget-testimonial {
6
- clear: left;
7
- display: none;
8
- margin: 0 0 1.4em;
9
- }
10
-
11
- .testimonials-widget-testimonials .active {
12
- /* active testimonials */
13
- display: block;
14
- }
15
-
16
- .testimonials-widget-testimonials .display-none {
17
- /* staged testimonials */
18
- display: none;
19
  }
20
 
21
  .testimonials-widget-testimonials .paging {
@@ -42,7 +28,7 @@
42
 
43
  .testimonials-widget-testimonial.list,
44
  .testimonials-widget-testimonial.single {
45
- display: block;
46
  }
47
 
48
  .testimonials-widget-testimonial .image {
@@ -118,3 +104,11 @@
118
  .testimonials-widget-testimonial .bottom_text {
119
  margin-top: 1.4em;
120
  }
 
 
 
 
 
 
 
 
1
  .testimonials-widget-testimonials {
 
2
  }
3
 
4
  .testimonials-widget-testimonial {
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  }
6
 
7
  .testimonials-widget-testimonials .paging {
28
 
29
  .testimonials-widget-testimonial.list,
30
  .testimonials-widget-testimonial.single {
31
+ clear: left;
32
  }
33
 
34
  .testimonials-widget-testimonial .image {
104
  .testimonials-widget-testimonial .bottom_text {
105
  margin-top: 1.4em;
106
  }
107
+
108
+ .bx-wrapper .bx-viewport {
109
+ -moz-box-shadow: none;
110
+ -webkit-box-shadow: none;
111
+ box-shadow: none;
112
+ border: none;
113
+ background: initial;
114
+ }
testimonials-widget.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Testimonials Widget
4
  * Plugin URI: http://wordpress.org/extend/plugins/testimonials-widget/
5
  * Description: Testimonials Widget plugin allows you to display random or selected portfolio, quotes, reviews, showcases, or text with images on your WordPress blog.
6
- * Version: 2.14.0
7
  * Author: Michael Cannon
8
  * Author URI: http://aihr.us/about-aihrus/michael-cannon-resume/
9
  * License: GPLv2 or later
@@ -25,10 +25,11 @@
25
  */
26
  class Testimonials_Widget {
27
  const ID = 'testimonials-widget-testimonials';
 
28
  const OLD_NAME = 'testimonialswidget';
29
  const PLUGIN_FILE = 'testimonials-widget/testimonials-widget.php';
30
  const PT = 'testimonials-widget';
31
- const VERSION = '2.14.0';
32
 
33
  private static $base = null;
34
  private static $found_posts = 0;
@@ -130,6 +131,10 @@ EOD;
130
  self::$cpt_category = self::PT . '-category';
131
  self::$cpt_tags = self::PT . '-post_tag';
132
  self::init_post_type();
 
 
 
 
133
  }
134
 
135
 
@@ -321,7 +326,7 @@ EOD;
321
 
322
  public function admin_notices_donate() {
323
  $content = '<div class="updated fade"><p>';
324
- $content .= sprintf( esc_html__( 'Please donate $2 towards development and support of this Testimonials Widget plugin. %s', 'testimonials-widget' ), self::$donate_button );
325
  $content .= '</p></div>';
326
 
327
  echo $content;
@@ -334,6 +339,9 @@ EOD;
334
  if ( $prior_version < '2.12.0' )
335
  add_action( 'admin_notices', array( $this, 'admin_notices_2_12_0' ) );
336
 
 
 
 
337
  if ( $prior_version < self::VERSION )
338
  do_action( 'testimonials_widget_update' );
339
 
@@ -720,6 +728,18 @@ EOD;
720
 
721
  wp_enqueue_script( 'jquery' );
722
 
 
 
 
 
 
 
 
 
 
 
 
 
723
  do_action( 'testimonials_widget_scripts', $atts );
724
  }
725
 
@@ -728,55 +748,64 @@ EOD;
728
  if ( is_admin() )
729
  return;
730
 
731
- wp_register_style( __CLASS__, plugins_url( 'testimonials-widget.css', __FILE__ ) );
732
- wp_enqueue_style( __CLASS__ );
 
 
733
 
734
- $include_ie7_css = tw_get_option( 'include_ie7_css' );
735
- if ( $include_ie7_css ) {
736
- wp_register_style( __CLASS__ . '-ie7', plugins_url( 'testimonials-widget-ie7.css', __FILE__ ) );
737
- wp_enqueue_style( __CLASS__ . '-ie7' );
 
 
 
 
 
738
  }
739
 
 
 
740
  do_action( 'testimonials_widget_styles' );
741
  }
742
 
743
 
744
  public static function get_testimonials_html_css( $atts, $widget_number = null ) {
745
- $css = array();
 
746
 
747
  switch ( $atts['type'] ) {
748
  case 'testimonialswidget_widget':
749
- // display attributes
750
- $height = $atts['height'];
751
- $max_height = $atts['max_height'];
752
- $min_height = $atts['min_height'];
753
-
754
- if ( $height ) {
755
- $max_height = $height;
756
- $min_height = $height;
757
- }
758
-
759
- $css = array();
760
- $id_base = self::ID . $widget_number;
761
 
762
- if ( $min_height ) {
763
- $css[] = <<<EOF
764
  <style>
765
  .$id_base {
766
  min-height: {$min_height}px;
767
  }
768
  </style>
769
  EOF;
770
- }
771
 
772
- if ( $max_height ) {
773
- $css[] = <<<EOF
774
  <style>
775
  .$id_base {
776
  max-height: {$max_height}px;
777
  }
778
  </style>
779
  EOF;
 
780
  }
781
  break;
782
  }
@@ -791,33 +820,66 @@ EOF;
791
  $scripts = array();
792
  $scripts_internal = array();
793
 
 
 
 
794
  switch ( $atts['type'] ) {
795
  case 'testimonialswidget_widget':
796
- // display attributes
797
- $refresh_interval = $atts['refresh_interval'];
 
798
 
799
- $id_base = self::ID . $widget_number;
800
- $scripts = array();
801
- $tw_padding = 'tw_padding' . $widget_number;
802
- $tw_wrapper = 'tw_wrapper' . $widget_number;
803
 
804
- $disable_animation = $atts['disable_animation'];
805
- $fade_in_speed = $atts['fade_in_speed'];
806
- $fade_out_speed = $atts['fade_out_speed'];
807
- $height = $atts['height'];
808
- $max_height = $atts['max_height'];
809
- $min_height = $atts['min_height'];
810
 
811
- $enable_animation = 1;
812
- if ( $disable_animation || $height || $max_height || $min_height )
813
- $enable_animation = 0;
 
814
 
815
- $javascript = '';
816
- if ( 1 < count( $testimonials ) ) {
817
- $javascript .= '<script type="text/javascript">' . "\n";
818
 
819
- if ( $refresh_interval ) {
820
  $javascript .= <<<EOF
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
821
  function nextTestimonial{$widget_number}() {
822
  if ( ! jQuery('.{$id_base}').first().hasClass('hovered') ) {
823
  var active = jQuery('.{$id_base} .active');
@@ -849,9 +911,9 @@ jQuery(document).ready(function() {
849
  });
850
 
851
  EOF;
852
- }
853
 
854
- $javascript .= <<<EOF
855
  if ( {$enable_animation} ) {
856
  var {$tw_wrapper} = jQuery('.{$id_base}');
857
  var {$tw_padding} = 0;
@@ -864,9 +926,10 @@ if ( {$enable_animation} ) {
864
  {$tw_wrapper}.height( {$tw_wrapper}.height() );
865
  });
866
  }
867
- </script>
868
  EOF;
 
869
 
 
870
  $scripts[ $id_base ] = $javascript;
871
  }
872
  break;
@@ -889,19 +952,18 @@ EOF;
889
  $paging_after = ( 'after' === strtolower( $atts['paging'] ) );
890
  $target = $atts['target'];
891
 
892
- $html = '';
893
- $id = self::ID;
894
 
895
  if ( is_null( $widget_number ) ) {
896
- $html .= '<div class="' . $id;
897
 
898
  if ( $is_list )
899
- $html .= ' listing';
900
 
901
- $html .= '">';
902
  } else {
903
- $id_base = $id . $widget_number;
904
- $html .= '<div class="' . $id . ' ' . $id_base . '">';
905
  }
906
 
907
  if ( empty( $testimonials ) && ! $hide_not_found ) {
@@ -910,24 +972,36 @@ EOF;
910
  );
911
  }
912
 
 
913
  if ( $paging || $paging_before )
914
- $html .= self::get_testimonials_paging( $atts );
915
 
916
  $is_first = true;
917
 
 
918
  foreach ( $testimonials as $testimonial ) {
919
  $content = self::get_testimonial_html( $testimonial, $atts, $is_list, $is_first, $widget_number );
920
  if ( $target )
921
  $content = links_add_target( $content, $target );
922
  $content = apply_filters( 'testimonials_widget_testimonial_html', $content, $testimonial, $atts, $is_list, $is_first, $widget_number );
923
- $html .= $content;
924
  $is_first = false;
 
 
925
  }
926
 
 
927
  if ( $paging || $paging_after )
928
- $html .= self::get_testimonials_paging( $atts, false );
929
 
930
- $html .= '</div>';
 
 
 
 
 
 
 
 
931
 
932
  return $html;
933
  }
@@ -942,16 +1016,18 @@ EOF;
942
  $do_schema = $atts['enable_schema'];
943
  $keep_whitespace = $atts['keep_whitespace'];
944
  $remove_hentry = $atts['remove_hentry'];
 
945
 
946
  $class = 'testimonials-widget-testimonial';
947
- if ( is_single() && empty( $widget_number ) ) {
948
  $class .= ' single';
949
- } elseif ( $is_list ) {
950
  $class .= ' list';
951
- } elseif ( $is_first ) {
952
- $class .= ' active';
953
- } elseif ( ! $is_first ) {
954
- $class .= ' display-none';
 
955
  }
956
 
957
  if ( $keep_whitespace )
@@ -1009,10 +1085,12 @@ EOF;
1009
  $bottom_text .= '</div>';
1010
  }
1011
 
1012
- $div_close = '</div>';
1013
  if ( $do_schema && $do_content )
1014
  $div_close .= '</div>';
1015
 
 
 
1016
  $html = $div_open
1017
  . $image
1018
  . $quote
@@ -1057,7 +1135,7 @@ EOF;
1057
  $content = apply_filters( 'testimonials_widget_content', $content, $widget_number, $testimonial, $atts );
1058
  $content = make_clickable( $content );
1059
 
1060
- if ( empty( $use_quote_tag ) ) {
1061
  $quote = '<blockquote>';
1062
  $quote .= $content;
1063
  $quote .= '</blockquote>';
@@ -1155,7 +1233,7 @@ EOF;
1155
  $cite = apply_filters( 'testimonials_widget_cite_html', $cite, $testimonial, $atts );
1156
 
1157
  if ( ! empty( $cite ) ) {
1158
- if ( empty( $use_quote_tag ) ) {
1159
  $temp = '<div class="credit">';
1160
  $temp .= $cite;
1161
  $temp .= '</div>';
@@ -1173,7 +1251,7 @@ EOF;
1173
  // Original PHP code as myTruncate2 by Chirp Internet: www.chirp.com.au
1174
  public static function testimonials_truncate( $string, $char_limit = false, $pad = '…', $force_pad = false ) {
1175
  if ( empty( $force_pad ) ) {
1176
- if ( empty( $char_limit ) )
1177
  return $string;
1178
 
1179
  // return with no change if string is shorter than $char_limit
@@ -1181,7 +1259,7 @@ EOF;
1181
  return $string;
1182
  }
1183
 
1184
- if ( ! empty( $char_limit ) )
1185
  return self::truncate( $string, $char_limit, $pad, $force_pad );
1186
 
1187
  return $string . $pad;
@@ -1299,7 +1377,7 @@ EOF;
1299
  $output .= $indicator;
1300
 
1301
  // Close any open tags
1302
- while ( !empty( $tag_stack ) )
1303
  $output .= '</'.array_pop( $tag_stack ).'>';
1304
 
1305
  return $output;
@@ -1358,7 +1436,7 @@ EOF;
1358
 
1359
  $html .= '">';
1360
 
1361
- if ( ! empty( $atts['paged'] ) )
1362
  $paged = $atts['paged'];
1363
  else
1364
  $paged = 1;
@@ -1448,7 +1526,7 @@ EOF;
1448
  $args['post_status'][] = 'draft';
1449
  }
1450
 
1451
- if ( $paging && ! empty( $atts['paged'] ) && is_singular() )
1452
  $args['paged'] = $atts['paged'];
1453
 
1454
  if ( ! $random && $meta_key ) {
@@ -1993,7 +2071,7 @@ EOF;
1993
  );
1994
 
1995
  require_once ABSPATH . 'wp-admin/includes/image.php';
1996
-
1997
  $image_id = wp_insert_attachment( $attachment, $filename, $post_id );
1998
  $metadata = wp_generate_attachment_metadata( $image_id, $filename );
1999
 
@@ -2035,6 +2113,15 @@ EOF;
2035
  }
2036
 
2037
 
 
 
 
 
 
 
 
 
 
2038
  }
2039
 
2040
 
3
  * Plugin Name: Testimonials Widget
4
  * Plugin URI: http://wordpress.org/extend/plugins/testimonials-widget/
5
  * Description: Testimonials Widget plugin allows you to display random or selected portfolio, quotes, reviews, showcases, or text with images on your WordPress blog.
6
+ * Version: 2.15.0
7
  * Author: Michael Cannon
8
  * Author URI: http://aihr.us/about-aihrus/michael-cannon-resume/
9
  * License: GPLv2 or later
25
  */
26
  class Testimonials_Widget {
27
  const ID = 'testimonials-widget-testimonials';
28
+ const JS_KEY = 'tw_slider_';
29
  const OLD_NAME = 'testimonialswidget';
30
  const PLUGIN_FILE = 'testimonials-widget/testimonials-widget.php';
31
  const PT = 'testimonials-widget';
32
+ const VERSION = '2.15.0';
33
 
34
  private static $base = null;
35
  private static $found_posts = 0;
131
  self::$cpt_category = self::PT . '-category';
132
  self::$cpt_tags = self::PT . '-post_tag';
133
  self::init_post_type();
134
+
135
+ $force_css_loading = tw_get_option( 'force_css_loading' );
136
+ if ( $force_css_loading )
137
+ self::styles();
138
  }
139
 
140
 
326
 
327
  public function admin_notices_donate() {
328
  $content = '<div class="updated fade"><p>';
329
+ $content .= sprintf( esc_html__( 'Please donate $5 towards development and support of this Testimonials Widget plugin. %s', 'testimonials-widget' ), self::$donate_button );
330
  $content .= '</p></div>';
331
 
332
  echo $content;
339
  if ( $prior_version < '2.12.0' )
340
  add_action( 'admin_notices', array( $this, 'admin_notices_2_12_0' ) );
341
 
342
+ if ( $prior_version < '2.15.0' )
343
+ add_action( 'admin_notices', array( $this, 'admin_notices_2_15_0' ) );
344
+
345
  if ( $prior_version < self::VERSION )
346
  do_action( 'testimonials_widget_update' );
347
 
728
 
729
  wp_enqueue_script( 'jquery' );
730
 
731
+ $use_bxslider = $atts['use_bxslider'];
732
+ if ( $use_bxslider ) {
733
+ $enable_video = $atts['enable_video'];
734
+ if ( $enable_video ) {
735
+ wp_register_script( 'jquery.fitvids', plugins_url( 'js/jquery.fitvids.js', __FILE__ ), array( 'jquery' ), '1.0' );
736
+ wp_enqueue_script( 'jquery.fitvids' );
737
+ }
738
+
739
+ wp_register_script( 'jquery.bxslider', plugins_url( 'js/jquery.bxslider.js', __FILE__ ), array( 'jquery' ), '4.1.1' );
740
+ wp_enqueue_script( 'jquery.bxslider' );
741
+ }
742
+
743
  do_action( 'testimonials_widget_scripts', $atts );
744
  }
745
 
748
  if ( is_admin() )
749
  return;
750
 
751
+ $use_bxslider = tw_get_option( 'use_bxslider' );
752
+ if ( $use_bxslider ) {
753
+ wp_register_style( 'jquery.bxslider', plugins_url( 'css/jquery.bxslider.css', __FILE__ ) );
754
+ wp_enqueue_style( 'jquery.bxslider' );
755
 
756
+ wp_register_style( __CLASS__, plugins_url( 'testimonials-widget.css', __FILE__ ) );
757
+ } else {
758
+ wp_register_style( __CLASS__, plugins_url( 'css/testimonials-widget-2.14.0.css', __FILE__ ) );
759
+
760
+ $include_ie7_css = tw_get_option( 'include_ie7_css' );
761
+ if ( $include_ie7_css ) {
762
+ wp_register_style( __CLASS__ . '-ie7', plugins_url( 'css/testimonials-widget-ie7.css', __FILE__ ) );
763
+ wp_enqueue_style( __CLASS__ . '-ie7' );
764
+ }
765
  }
766
 
767
+ wp_enqueue_style( __CLASS__ );
768
+
769
  do_action( 'testimonials_widget_styles' );
770
  }
771
 
772
 
773
  public static function get_testimonials_html_css( $atts, $widget_number = null ) {
774
+ $css = array();
775
+ $id_base = self::ID . $widget_number;
776
 
777
  switch ( $atts['type'] ) {
778
  case 'testimonialswidget_widget':
779
+ $use_bxslider = $atts['use_bxslider'];
780
+ if ( ! $use_bxslider ) {
781
+ $height = $atts['height'];
782
+ $max_height = $atts['max_height'];
783
+ $min_height = $atts['min_height'];
784
+
785
+ if ( $height ) {
786
+ $max_height = $height;
787
+ $min_height = $height;
788
+ }
 
 
789
 
790
+ if ( $min_height ) {
791
+ $css[] = <<<EOF
792
  <style>
793
  .$id_base {
794
  min-height: {$min_height}px;
795
  }
796
  </style>
797
  EOF;
798
+ }
799
 
800
+ if ( $max_height ) {
801
+ $css[] = <<<EOF
802
  <style>
803
  .$id_base {
804
  max-height: {$max_height}px;
805
  }
806
  </style>
807
  EOF;
808
+ }
809
  }
810
  break;
811
  }
820
  $scripts = array();
821
  $scripts_internal = array();
822
 
823
+ $id = self::ID;
824
+ $id_base = $id . $widget_number;
825
+
826
  switch ( $atts['type'] ) {
827
  case 'testimonialswidget_widget':
828
+ $javascript = '';
829
+ if ( 1 < count( $testimonials ) ) {
830
+ $refresh_interval = $atts['refresh_interval'];
831
 
832
+ $javascript .= '<script type="text/javascript">' . "\n";
 
 
 
833
 
834
+ $use_bxslider = $atts['use_bxslider'];
835
+ if ( $use_bxslider ) {
836
+ $enable_video = $atts['enable_video'];
837
+ $show_start_stop = $atts['show_start_stop'];
838
+ $transition_mode = $atts['transition_mode'];
 
839
 
840
+ $auto = $refresh_interval ? 'true' : 'false';
841
+ $pager = ! $refresh_interval ? 'pager: true' : 'pager: false';
842
+ $pause = $refresh_interval * 1000;
843
+ $video = $enable_video ? "video: true,\nuseCSS: false" : 'video: false';
844
 
845
+ $autoControls = $show_start_stop ? 'autoControls: true,' : '';
 
 
846
 
847
+ $slider_var = self::JS_KEY . $widget_number;
848
  $javascript .= <<<EOF
849
+ var {$slider_var} = null;
850
+
851
+ jQuery(document).ready(function() {
852
+ {$slider_var} = jQuery('.{$id_base}').bxSlider({
853
+ auto: {$auto},
854
+ {$autoControls}
855
+ autoHover: true,
856
+ controls: false,
857
+ mode: '{$transition_mode}',
858
+ {$pager},
859
+ pause: {$pause},
860
+ {$video},
861
+ slideMargin: 2
862
+ });
863
+ });
864
+
865
+ EOF;
866
+ } else {
867
+ $tw_padding = 'tw_padding' . $widget_number;
868
+ $tw_wrapper = 'tw_wrapper' . $widget_number;
869
+
870
+ $disable_animation = $atts['disable_animation'];
871
+ $fade_in_speed = $atts['fade_in_speed'];
872
+ $fade_out_speed = $atts['fade_out_speed'];
873
+ $height = $atts['height'];
874
+ $max_height = $atts['max_height'];
875
+ $min_height = $atts['min_height'];
876
+
877
+ $enable_animation = 1;
878
+ if ( $disable_animation || $height || $max_height || $min_height )
879
+ $enable_animation = 0;
880
+
881
+ if ( $refresh_interval ) {
882
+ $javascript .= <<<EOF
883
  function nextTestimonial{$widget_number}() {
884
  if ( ! jQuery('.{$id_base}').first().hasClass('hovered') ) {
885
  var active = jQuery('.{$id_base} .active');
911
  });
912
 
913
  EOF;
914
+ }
915
 
916
+ $javascript .= <<<EOF
917
  if ( {$enable_animation} ) {
918
  var {$tw_wrapper} = jQuery('.{$id_base}');
919
  var {$tw_padding} = 0;
926
  {$tw_wrapper}.height( {$tw_wrapper}.height() );
927
  });
928
  }
 
929
  EOF;
930
+ }
931
 
932
+ $javascript .= "\n" . '</script>';
933
  $scripts[ $id_base ] = $javascript;
934
  }
935
  break;
952
  $paging_after = ( 'after' === strtolower( $atts['paging'] ) );
953
  $target = $atts['target'];
954
 
955
+ $id = self::ID;
 
956
 
957
  if ( is_null( $widget_number ) ) {
958
+ $div_open = '<div class="' . $id;
959
 
960
  if ( $is_list )
961
+ $div_open .= ' listing';
962
 
963
+ $div_open .= '">';
964
  } else {
965
+ $id_base = $id . $widget_number;
966
+ $div_open = '<div class="' . $id . ' ' . $id_base . '">';
967
  }
968
 
969
  if ( empty( $testimonials ) && ! $hide_not_found ) {
972
  );
973
  }
974
 
975
+ $pre_paging = '';
976
  if ( $paging || $paging_before )
977
+ $pre_paging = self::get_testimonials_paging( $atts );
978
 
979
  $is_first = true;
980
 
981
+ $testimonial_content = '';
982
  foreach ( $testimonials as $testimonial ) {
983
  $content = self::get_testimonial_html( $testimonial, $atts, $is_list, $is_first, $widget_number );
984
  if ( $target )
985
  $content = links_add_target( $content, $target );
986
  $content = apply_filters( 'testimonials_widget_testimonial_html', $content, $testimonial, $atts, $is_list, $is_first, $widget_number );
 
987
  $is_first = false;
988
+
989
+ $testimonial_content .= $content;
990
  }
991
 
992
+ $post_paging = '';
993
  if ( $paging || $paging_after )
994
+ $post_paging = self::get_testimonials_paging( $atts, false );
995
 
996
+ $div_close = '</div>';
997
+
998
+ $html = $div_open
999
+ . $pre_paging
1000
+ . $testimonial_content
1001
+ . $post_paging
1002
+ . $div_close;
1003
+
1004
+ $html = apply_filters( 'testimonials_widget_get_testimonials_html', $html, $testimonials, $atts, $is_list, $widget_number, $div_open, $pre_paging, $testimonial_content, $post_paging, $div_close );
1005
 
1006
  return $html;
1007
  }
1016
  $do_schema = $atts['enable_schema'];
1017
  $keep_whitespace = $atts['keep_whitespace'];
1018
  $remove_hentry = $atts['remove_hentry'];
1019
+ $use_bxslider = $atts['use_bxslider'];
1020
 
1021
  $class = 'testimonials-widget-testimonial';
1022
+ if ( is_single() && empty( $widget_number ) )
1023
  $class .= ' single';
1024
+ elseif ( $is_list )
1025
  $class .= ' list';
1026
+ elseif ( ! $use_bxslider ) {
1027
+ if ( $is_first )
1028
+ $class .= ' active';
1029
+ elseif ( ! $is_first )
1030
+ $class .= ' display-none';
1031
  }
1032
 
1033
  if ( $keep_whitespace )
1085
  $bottom_text .= '</div>';
1086
  }
1087
 
1088
+ $div_close = '';
1089
  if ( $do_schema && $do_content )
1090
  $div_close .= '</div>';
1091
 
1092
+ $div_close .= '</div>';
1093
+
1094
  $html = $div_open
1095
  . $image
1096
  . $quote
1135
  $content = apply_filters( 'testimonials_widget_content', $content, $widget_number, $testimonial, $atts );
1136
  $content = make_clickable( $content );
1137
 
1138
+ if ( ! $use_quote_tag ) {
1139
  $quote = '<blockquote>';
1140
  $quote .= $content;
1141
  $quote .= '</blockquote>';
1233
  $cite = apply_filters( 'testimonials_widget_cite_html', $cite, $testimonial, $atts );
1234
 
1235
  if ( ! empty( $cite ) ) {
1236
+ if ( ! $use_quote_tag ) {
1237
  $temp = '<div class="credit">';
1238
  $temp .= $cite;
1239
  $temp .= '</div>';
1251
  // Original PHP code as myTruncate2 by Chirp Internet: www.chirp.com.au
1252
  public static function testimonials_truncate( $string, $char_limit = false, $pad = '…', $force_pad = false ) {
1253
  if ( empty( $force_pad ) ) {
1254
+ if ( ! $char_limit )
1255
  return $string;
1256
 
1257
  // return with no change if string is shorter than $char_limit
1259
  return $string;
1260
  }
1261
 
1262
+ if ( $char_limit )
1263
  return self::truncate( $string, $char_limit, $pad, $force_pad );
1264
 
1265
  return $string . $pad;
1377
  $output .= $indicator;
1378
 
1379
  // Close any open tags
1380
+ while ( ! empty( $tag_stack ) )
1381
  $output .= '</'.array_pop( $tag_stack ).'>';
1382
 
1383
  return $output;
1436
 
1437
  $html .= '">';
1438
 
1439
+ if ( $atts['paged'] )
1440
  $paged = $atts['paged'];
1441
  else
1442
  $paged = 1;
1526
  $args['post_status'][] = 'draft';
1527
  }
1528
 
1529
+ if ( $paging && $atts['paged'] && is_singular() )
1530
  $args['paged'] = $atts['paged'];
1531
 
1532
  if ( ! $random && $meta_key ) {
2071
  );
2072
 
2073
  require_once ABSPATH . 'wp-admin/includes/image.php';
2074
+
2075
  $image_id = wp_insert_attachment( $attachment, $filename, $post_id );
2076
  $metadata = wp_generate_attachment_metadata( $image_id, $filename );
2077
 
2113
  }
2114
 
2115
 
2116
+ public function admin_notices_2_15_0() {
2117
+ $content = '<div class="updated fade"><p>';
2118
+ $content .= sprintf( __( 'If your Testimonials Widget display has gone to funky town, please <a href="%s">read the FAQ</a> about possible fixes.', 'testimonials-widget' ), esc_url( 'https://aihrus.zendesk.com/entries/28402246-Major-Change-for-2-15-0' ) );
2119
+ $content .= '</p></div>';
2120
+
2121
+ echo $content;
2122
+ }
2123
+
2124
+
2125
  }
2126
 
2127