Version Description
- Fix: Number of slides per slideshow limited to WordPress 'blog pages show at most' setting (reported by and thanks to: Kenny)
- Fix: Add warning when BMP file is added to slider (reported by and thanks to MadBong)
- Fix: Allow images smaller than default thumbnail size to be added to slider (reported by and thanks to: MadBong)
Download this release
Release Info
Developer | matchalabs |
Plugin | MetaSlider |
Version | 1.2.1 |
Comparing to | |
See all releases |
Code changes from version 1.1 to 1.2.1
- assets/ml-slider-admin.css +19 -0
- assets/ml-slider.js +51 -18
- ml-slider.php +213 -97
- readme.txt +46 -16
assets/ml-slider-admin.css
CHANGED
@@ -1,3 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
.ml-slider tr.slide textarea {
|
2 |
width: 100%;
|
3 |
height: 75px;
|
1 |
+
.ml-slider .unsaved {
|
2 |
+
float: right;
|
3 |
+
background: #ff3019; /* Old browsers */
|
4 |
+
background: -moz-linear-gradient(top, #ff3019 0%, #cf0404 100%); /* FF3.6+ */
|
5 |
+
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff3019), color-stop(100%,#cf0404)); /* Chrome,Safari4+ */
|
6 |
+
background: -webkit-linear-gradient(top, #ff3019 0%,#cf0404 100%); /* Chrome10+,Safari5.1+ */
|
7 |
+
background: -o-linear-gradient(top, #ff3019 0%,#cf0404 100%); /* Opera 11.10+ */
|
8 |
+
background: -ms-linear-gradient(top, #ff3019 0%,#cf0404 100%); /* IE10+ */
|
9 |
+
background: linear-gradient(to bottom, #ff3019 0%,#cf0404 100%); /* W3C */
|
10 |
+
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff3019', endColorstr='#cf0404',GradientType=0 ); /* IE6-9 */
|
11 |
+
color: white;
|
12 |
+
padding: 1px 9px;
|
13 |
+
border-radius: 3px;
|
14 |
+
margin-top: 2px;
|
15 |
+
font-weight: bold;
|
16 |
+
font-size: 1em !important;
|
17 |
+
text-rendering: optimizeLegibility;
|
18 |
+
margin: 2px 10px;
|
19 |
+
}
|
20 |
.ml-slider tr.slide textarea {
|
21 |
width: 100%;
|
22 |
height: 75px;
|
assets/ml-slider.js
CHANGED
@@ -41,7 +41,8 @@
|
|
41 |
*/
|
42 |
$(".ml-slider table.sortable").tableDnD({
|
43 |
onDrop: function() {
|
44 |
-
updateSlideOrder()
|
|
|
45 |
}
|
46 |
});
|
47 |
|
@@ -70,34 +71,61 @@
|
|
70 |
}
|
71 |
|
72 |
// Create the media frame.
|
73 |
-
|
74 |
file_frame = wp.media.frames.file_frame = wp.media({
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
});
|
81 |
|
82 |
// When an image is selected, run a callback.
|
83 |
file_frame.on( 'select', function() {
|
84 |
-
|
85 |
|
86 |
-
|
87 |
-
"<div style='position: absolute'>" +
|
88 |
-
"<a class='delete-slide confirm' href='?page=ml-slider&id=438'>x</a> " +
|
89 |
-
"</div>" +
|
90 |
-
"<img src='" + attachment.sizes.thumbnail.url + "' width='150px'></td><td> " +
|
91 |
-
"<textarea name='attachment[" + attachment.id + "][post_excerpt]' placeholder='Caption'>" + attachment.caption + "</textarea>" +
|
92 |
-
"<input type='text' name='attachment[" + attachment.id + "][url]' placeholder='URL'>" +
|
93 |
-
"<input type='hidden' class='menu_order' name='attachment[" + attachment.id + "][menu_order]' value='100'>" +
|
94 |
-
"</td></tr>";
|
95 |
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
|
98 |
// reindex the slides
|
99 |
updateSlideOrder();
|
100 |
|
|
|
101 |
$(".ml-slider table.sortable").tableDnD({
|
102 |
onDrop: function() {
|
103 |
updateSlideOrder()
|
@@ -107,5 +135,10 @@
|
|
107 |
|
108 |
file_frame.open();
|
109 |
});
|
|
|
|
|
|
|
|
|
|
|
110 |
});
|
111 |
}(jQuery));
|
41 |
*/
|
42 |
$(".ml-slider table.sortable").tableDnD({
|
43 |
onDrop: function() {
|
44 |
+
updateSlideOrder();
|
45 |
+
$('.ml-slider .unsaved').fadeIn();
|
46 |
}
|
47 |
});
|
48 |
|
71 |
}
|
72 |
|
73 |
// Create the media frame.
|
|
|
74 |
file_frame = wp.media.frames.file_frame = wp.media({
|
75 |
+
title: jQuery( this ).data( 'uploader_title' ),
|
76 |
+
button: {
|
77 |
+
text: jQuery( this ).data( 'uploader_button_text' ),
|
78 |
+
},
|
79 |
+
multiple: 'add'
|
80 |
});
|
81 |
|
82 |
// When an image is selected, run a callback.
|
83 |
file_frame.on( 'select', function() {
|
84 |
+
var selection = file_frame.state().get('selection');
|
85 |
|
86 |
+
selection.map( function( attachment ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
|
88 |
+
attachment = attachment.toJSON();
|
89 |
+
|
90 |
+
if (attachment.subtype == 'bmp') {
|
91 |
+
alert('Warning: BML images not allowed');
|
92 |
+
return;
|
93 |
+
}
|
94 |
+
|
95 |
+
var url = attachment.url;
|
96 |
+
|
97 |
+
if (typeof(attachment.sizes.thumbnail) != 'undefined') {
|
98 |
+
url = attachment.sizes.thumbnail.url;
|
99 |
+
}
|
100 |
+
|
101 |
+
var tableRow = "<tr class='slide'><td>" +
|
102 |
+
"<div style='position: absolute'>" +
|
103 |
+
"<a class='delete-slide remove-slide' href='#'>x</a> " +
|
104 |
+
"</div>" +
|
105 |
+
"<img src='" + url + "' width='150px'></td><td> " +
|
106 |
+
"<textarea name='attachment[" + attachment.id + "][post_excerpt]' placeholder='Caption'>" + attachment.caption + "</textarea>" +
|
107 |
+
"<input type='text' name='attachment[" + attachment.id + "][url]' placeholder='URL'>" +
|
108 |
+
"<input type='hidden' class='menu_order' name='attachment[" + attachment.id + "][menu_order]' value='100'>" +
|
109 |
+
"</td></tr>";
|
110 |
+
|
111 |
+
// add slide to existing slides table
|
112 |
+
jQuery(".ml-slider .slides tbody").append(tableRow);
|
113 |
+
|
114 |
+
// display the unsaved changes warning
|
115 |
+
$('.ml-slider .unsaved').show();
|
116 |
+
});
|
117 |
+
|
118 |
+
// the slides haven't been assigned to the slider yet, so just remove the row if the delete
|
119 |
+
// button is clicked
|
120 |
+
jQuery(".remove-slide").live('click', function(e){
|
121 |
+
e.preventDefault();
|
122 |
+
$(this).closest('tr').remove();
|
123 |
+
});
|
124 |
|
125 |
// reindex the slides
|
126 |
updateSlideOrder();
|
127 |
|
128 |
+
// ensure the rows are sortable
|
129 |
$(".ml-slider table.sortable").tableDnD({
|
130 |
onDrop: function() {
|
131 |
updateSlideOrder()
|
135 |
|
136 |
file_frame.open();
|
137 |
});
|
138 |
+
|
139 |
+
// show the unsaved changes when the form is changed
|
140 |
+
$('.ml-slider form').live('change', function() {
|
141 |
+
$('.ml-slider .unsaved').fadeIn();
|
142 |
+
});
|
143 |
});
|
144 |
}(jQuery));
|
ml-slider.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: ML Slider
|
4 |
* Plugin URI: http://www.ml-slider.com
|
5 |
* Description: 4 sliders in 1! Choose from Nivo Slider, Flex Slider, Coin Slider or Responsive Slides.
|
6 |
-
* Version: 1.1
|
7 |
* Author: Matcha Labs
|
8 |
* Author URI: http://www.matchalabs.com
|
9 |
* License: GPL
|
@@ -14,7 +14,7 @@
|
|
14 |
* GNU General Public License for more details.
|
15 |
*/
|
16 |
|
17 |
-
define( 'MLSLIDER_VERSION', '1.1' );
|
18 |
define( 'MLSLIDER_BASE_URL', plugin_dir_url( __FILE__ ) );
|
19 |
define( 'MLSLIDER_ASSETS_URL', MLSLIDER_BASE_URL . 'assets/' );
|
20 |
|
@@ -234,6 +234,7 @@ class MLSlider {
|
|
234 |
'order' => 'ASC',
|
235 |
'post_type' => 'attachment',
|
236 |
'post_status' => 'inherit',
|
|
|
237 |
'tax_query' => array(
|
238 |
array(
|
239 |
'taxonomy' => 'ml-slider',
|
@@ -254,9 +255,9 @@ class MLSlider {
|
|
254 |
'id' => $query->post->ID,
|
255 |
'type' => 'image',
|
256 |
'url' => get_post_meta($query->post->ID, 'ml-slider_url', true),
|
257 |
-
'caption' => $query->post->post_excerpt,
|
258 |
'src' => $image_attributes[0],
|
259 |
-
'alt' => get_post_meta($query->post->ID, '_wp_attachment_image_alt', true),
|
260 |
'menu_order' => $query->post->menu_order
|
261 |
);
|
262 |
}
|
@@ -325,7 +326,6 @@ class MLSlider {
|
|
325 |
* Update slider settings
|
326 |
*/
|
327 |
private function handle_update_slider_settings() {
|
328 |
-
// update options
|
329 |
if (isset($_POST['settings'])) {
|
330 |
$old_settings = get_post_meta($this->get_slider(), 'ml-slider_settings', true);
|
331 |
$new_settings = $_POST['settings'];
|
@@ -353,7 +353,6 @@ class MLSlider {
|
|
353 |
* Update slider title
|
354 |
*/
|
355 |
private function handle_update_slider_title() {
|
356 |
-
// update title
|
357 |
if (isset($_POST['title'])) {
|
358 |
$slide = array(
|
359 |
'ID' => $this->get_slider(),
|
@@ -371,7 +370,6 @@ class MLSlider {
|
|
371 |
* @return bool true if the slide was untagged
|
372 |
*/
|
373 |
private function handle_delete_slide() {
|
374 |
-
// delete slide
|
375 |
if (isset($_GET['deleteSlide'])) {
|
376 |
$slideToUntagFromCurrentSlider = $_GET['deleteSlide'];
|
377 |
|
@@ -402,7 +400,7 @@ class MLSlider {
|
|
402 |
$term = get_term_by('name', $this->get_slider(), 'ml-slider');
|
403 |
|
404 |
// tag this slide to the taxonomy term
|
405 |
-
wp_set_post_terms($id, $term->term_id, 'ml-slider',
|
406 |
|
407 |
// update the slide
|
408 |
wp_update_post(array(
|
@@ -435,7 +433,6 @@ class MLSlider {
|
|
435 |
* Delete a slider
|
436 |
*/
|
437 |
private function handle_delete_slider() {
|
438 |
-
// delete slider
|
439 |
if (isset($_GET['delete'])) {
|
440 |
$slide = array(
|
441 |
'ID' => intVal($_GET['delete']),
|
@@ -476,14 +473,198 @@ class MLSlider {
|
|
476 |
}
|
477 |
|
478 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
479 |
/**
|
480 |
* Return coin slider markup
|
481 |
*
|
482 |
* @return string coin slider markup.
|
483 |
*/
|
484 |
-
|
485 |
-
$identifier = 'ml-slider-' . rand();
|
486 |
-
|
487 |
$retVal = "<div id='" . $identifier . "' class='coin-slider'>";
|
488 |
|
489 |
foreach ($this->get_slides() as $slide) {
|
@@ -496,35 +677,15 @@ class MLSlider {
|
|
496 |
|
497 |
$retVal .= "</div>";
|
498 |
|
499 |
-
$retVal .= "<script type='text/javascript'>";
|
500 |
-
$retVal .= "\njQuery(document).ready(function($) {";
|
501 |
-
$retVal .= "\n $('#" . $identifier . "').coinslider({";
|
502 |
-
$retVal .= "\n effect: '{$this->get_setting('effect')}',";
|
503 |
-
$retVal .= "\n width: '{$this->get_setting('width')}',";
|
504 |
-
$retVal .= "\n height: '{$this->get_setting('height')}',";
|
505 |
-
$retVal .= "\n spw: '{$this->get_setting('spw')}',";
|
506 |
-
$retVal .= "\n sph: '{$this->get_setting('sph')}',";
|
507 |
-
$retVal .= "\n delay: '{$this->get_setting('delay')}',";
|
508 |
-
$retVal .= "\n sDelay: '{$this->get_setting('sDelay')}',";
|
509 |
-
$retVal .= "\n opacity: '{$this->get_setting('opacity')}',";
|
510 |
-
$retVal .= "\n titleSpeed: '{$this->get_setting('titleSpeed')}',";
|
511 |
-
$retVal .= "\n navigation: {$this->get_setting('navigation')},";
|
512 |
-
$retVal .= "\n hoverPause: {$this->get_setting('hoverPause')}";
|
513 |
-
$retVal .= "\n });";
|
514 |
-
$retVal .= "\n});";
|
515 |
-
$retVal .= "</script>";
|
516 |
-
|
517 |
return $retVal;
|
518 |
}
|
519 |
-
|
520 |
/**
|
521 |
* Return flexslider markup
|
522 |
*
|
523 |
* @return string flex slider markup.
|
524 |
*/
|
525 |
-
|
526 |
-
$identifier = 'ml-slider-' . rand();
|
527 |
-
|
528 |
$retVal = "<div id='" . $identifier . "' class='flexslider'><ul class='slides'>";
|
529 |
|
530 |
foreach ($this->get_slides() as $slide) {
|
@@ -537,24 +698,7 @@ class MLSlider {
|
|
537 |
}
|
538 |
|
539 |
$retVal .= "</ul></div>";
|
540 |
-
|
541 |
-
$retVal .= "<script type='text/javascript'>";
|
542 |
-
$retVal .= "\njQuery(document).ready(function($) {";
|
543 |
-
$retVal .= "\n $('#" . $identifier . "').flexslider({";
|
544 |
-
$retVal .= "\n animation: '{$this->get_setting('effect')}',";
|
545 |
-
$retVal .= "\n direction: '{$this->get_setting('direction')}',";
|
546 |
-
$retVal .= "\n reverse: {$this->get_setting('reverse')},";
|
547 |
-
$retVal .= "\n slideshowSpeed: {$this->get_setting('delay')},";
|
548 |
-
$retVal .= "\n pauseOnHover: {$this->get_setting('hoverPause')},";
|
549 |
-
$retVal .= "\n animationSpeed: {$this->get_setting('animationSpeed')},";
|
550 |
-
$retVal .= "\n controlNav: {$this->get_setting('navigation')},";
|
551 |
-
$retVal .= "\n directionNav: {$this->get_setting('links')},";
|
552 |
-
$retVal .= "\n prevText: '{$this->get_setting('prevText')}',";
|
553 |
-
$retVal .= "\n nextText: '{$this->get_setting('nextText')}',";
|
554 |
-
$retVal .= "\n });";
|
555 |
-
$retVal .= "\n});";
|
556 |
-
$retVal .= "</script>";
|
557 |
-
|
558 |
return $retVal;
|
559 |
}
|
560 |
|
@@ -563,9 +707,7 @@ class MLSlider {
|
|
563 |
*
|
564 |
* @return string responsive slider markup.
|
565 |
*/
|
566 |
-
|
567 |
-
$identifier = 'ml-slider-' . rand();
|
568 |
-
|
569 |
$retVal = "<ul id='" . $identifier . "' class='rslides'>";
|
570 |
|
571 |
foreach ($this->get_slides() as $slide) {
|
@@ -578,21 +720,6 @@ class MLSlider {
|
|
578 |
|
579 |
$retVal .= "</ul>";
|
580 |
|
581 |
-
$retVal .= "<script type='text/javascript'>";
|
582 |
-
$retVal .= "\njQuery(document).ready(function($) {";
|
583 |
-
$retVal .= "\n $('#" . $identifier . "').responsiveSlides({";
|
584 |
-
$retVal .= "\n timeout: {$this->get_setting('delay')},";
|
585 |
-
$retVal .= "\n pause: {$this->get_setting('hoverPause')},";
|
586 |
-
$retVal .= "\n pauseControls: {$this->get_setting('hoverPause')},";
|
587 |
-
$retVal .= "\n speed: {$this->get_setting('animationSpeed')},";
|
588 |
-
$retVal .= "\n pager: {$this->get_setting('navigation')},";
|
589 |
-
$retVal .= "\n nav: {$this->get_setting('links')},";
|
590 |
-
$retVal .= "\n prevText: '{$this->get_setting('prevText')}',";
|
591 |
-
$retVal .= "\n nextText: '{$this->get_setting('nextText')}',";
|
592 |
-
$retVal .= "\n });";
|
593 |
-
$retVal .= "\n});";
|
594 |
-
$retVal .= "</script>";
|
595 |
-
|
596 |
return $retVal;
|
597 |
}
|
598 |
|
@@ -601,9 +728,7 @@ class MLSlider {
|
|
601 |
*
|
602 |
* @return string nivo slider markup.
|
603 |
*/
|
604 |
-
|
605 |
-
$identifier = 'ml-slider-' . rand();
|
606 |
-
|
607 |
$retVal = "<div class='slider-wrapper theme-{$this->get_setting('theme')}'>";
|
608 |
$retVal .= "<div class='ribbon'></div>";
|
609 |
$retVal .= "<div id='" . $identifier . "' class='nivoSlider'>";
|
@@ -616,24 +741,6 @@ class MLSlider {
|
|
616 |
|
617 |
$retVal .= "</div></div>";
|
618 |
|
619 |
-
$retVal .= "<script type='text/javascript'>";
|
620 |
-
$retVal .= "\njQuery(document).ready(function($) {";
|
621 |
-
$retVal .= "\n $('#" . $identifier . "').nivoSlider({";
|
622 |
-
$retVal .= "\n effect: '{$this->get_setting('effect')}',";
|
623 |
-
$retVal .= "\n slices: {$this->get_setting('slices')},";
|
624 |
-
$retVal .= "\n pauseTime: {$this->get_setting('delay')},";
|
625 |
-
$retVal .= "\n animSpeed: {$this->get_setting('animationSpeed')},";
|
626 |
-
$retVal .= "\n pauseOnHover: {$this->get_setting('hoverPause')},";
|
627 |
-
$retVal .= "\n boxCols: {$this->get_setting('spw')},";
|
628 |
-
$retVal .= "\n boxRows: {$this->get_setting('sph')},";
|
629 |
-
$retVal .= "\n controlNav: {$this->get_setting('navigation')},";
|
630 |
-
$retVal .= "\n directionNav: {$this->get_setting('links')},";
|
631 |
-
$retVal .= "\n prevText: '{$this->get_setting('prevText')}',";
|
632 |
-
$retVal .= "\n nextText: '{$this->get_setting('nextText')}',";
|
633 |
-
$retVal .= "\n });";
|
634 |
-
$retVal .= "\n});";
|
635 |
-
$retVal .= "</script>";
|
636 |
-
|
637 |
return $retVal;
|
638 |
}
|
639 |
|
@@ -661,6 +768,8 @@ class MLSlider {
|
|
661 |
|
662 |
$this->set_slider($id);
|
663 |
|
|
|
|
|
664 |
// coinslider
|
665 |
if ($this->get_setting('type') == 'coin') {
|
666 |
if ($this->get_setting('printJs') == 'true') {
|
@@ -671,7 +780,8 @@ class MLSlider {
|
|
671 |
wp_enqueue_style('ml-slider_coin_slider_css', plugins_url('ml-slider/assets/coinslider/coin-slider-styles.css'));
|
672 |
}
|
673 |
|
674 |
-
$retVal = $this->get_coin_slider();
|
|
|
675 |
}
|
676 |
|
677 |
// flex
|
@@ -684,7 +794,8 @@ class MLSlider {
|
|
684 |
wp_enqueue_style('ml-slider_flex_slider_css', plugins_url('ml-slider/assets/flexslider/flexslider.css'));
|
685 |
}
|
686 |
|
687 |
-
$retVal = $this->get_flex_slider();
|
|
|
688 |
}
|
689 |
|
690 |
// responsive
|
@@ -697,7 +808,8 @@ class MLSlider {
|
|
697 |
wp_enqueue_style('ml-slider_responsive_slides_css', plugins_url('ml-slider/assets/responsiveslides/responsiveslides.css'));
|
698 |
}
|
699 |
|
700 |
-
$retVal = $this->get_responsive_slider();
|
|
|
701 |
}
|
702 |
|
703 |
// nivo
|
@@ -711,7 +823,8 @@ class MLSlider {
|
|
711 |
wp_enqueue_style('ml-slider_nivo_slider_theme_' . $this->get_setting('theme'), plugins_url('ml-slider/assets/nivoslider/themes/' . $this->get_setting('theme') . '/' . $this->get_setting('theme') . '.css'));
|
712 |
}
|
713 |
|
714 |
-
$retVal = $this->get_nivo_slider();
|
|
|
715 |
}
|
716 |
|
717 |
return "<div class='ml-slider ml-slider-{$this->get_setting('type')} {$this->get_setting('cssClass')}'>" . $retVal . "</div>";
|
@@ -745,7 +858,7 @@ class MLSlider {
|
|
745 |
}
|
746 |
?>
|
747 |
|
748 |
-
<a href="?page=ml-slider&add=true" id="create_new_tab" class="nav-tab">+</a>
|
749 |
</h2>
|
750 |
|
751 |
<?php
|
@@ -791,7 +904,10 @@ class MLSlider {
|
|
791 |
<thead>
|
792 |
<tr>
|
793 |
<th colspan="2">Settings</th>
|
794 |
-
<th
|
|
|
|
|
|
|
795 |
</tr>
|
796 |
</thead>
|
797 |
<tbody>
|
3 |
* Plugin Name: ML Slider
|
4 |
* Plugin URI: http://www.ml-slider.com
|
5 |
* Description: 4 sliders in 1! Choose from Nivo Slider, Flex Slider, Coin Slider or Responsive Slides.
|
6 |
+
* Version: 1.2.1
|
7 |
* Author: Matcha Labs
|
8 |
* Author URI: http://www.matchalabs.com
|
9 |
* License: GPL
|
14 |
* GNU General Public License for more details.
|
15 |
*/
|
16 |
|
17 |
+
define( 'MLSLIDER_VERSION', '1.2.1' );
|
18 |
define( 'MLSLIDER_BASE_URL', plugin_dir_url( __FILE__ ) );
|
19 |
define( 'MLSLIDER_ASSETS_URL', MLSLIDER_BASE_URL . 'assets/' );
|
20 |
|
234 |
'order' => 'ASC',
|
235 |
'post_type' => 'attachment',
|
236 |
'post_status' => 'inherit',
|
237 |
+
'posts_per_page' => -1,
|
238 |
'tax_query' => array(
|
239 |
array(
|
240 |
'taxonomy' => 'ml-slider',
|
255 |
'id' => $query->post->ID,
|
256 |
'type' => 'image',
|
257 |
'url' => get_post_meta($query->post->ID, 'ml-slider_url', true),
|
258 |
+
'caption' => htmlentities($query->post->post_excerpt, ENT_QUOTES),
|
259 |
'src' => $image_attributes[0],
|
260 |
+
'alt' => htmlentities(get_post_meta($query->post->ID, '_wp_attachment_image_alt', true),ENT_QUOTES),
|
261 |
'menu_order' => $query->post->menu_order
|
262 |
);
|
263 |
}
|
326 |
* Update slider settings
|
327 |
*/
|
328 |
private function handle_update_slider_settings() {
|
|
|
329 |
if (isset($_POST['settings'])) {
|
330 |
$old_settings = get_post_meta($this->get_slider(), 'ml-slider_settings', true);
|
331 |
$new_settings = $_POST['settings'];
|
353 |
* Update slider title
|
354 |
*/
|
355 |
private function handle_update_slider_title() {
|
|
|
356 |
if (isset($_POST['title'])) {
|
357 |
$slide = array(
|
358 |
'ID' => $this->get_slider(),
|
370 |
* @return bool true if the slide was untagged
|
371 |
*/
|
372 |
private function handle_delete_slide() {
|
|
|
373 |
if (isset($_GET['deleteSlide'])) {
|
374 |
$slideToUntagFromCurrentSlider = $_GET['deleteSlide'];
|
375 |
|
400 |
$term = get_term_by('name', $this->get_slider(), 'ml-slider');
|
401 |
|
402 |
// tag this slide to the taxonomy term
|
403 |
+
wp_set_post_terms($id, $term->term_id, 'ml-slider', true);
|
404 |
|
405 |
// update the slide
|
406 |
wp_update_post(array(
|
433 |
* Delete a slider
|
434 |
*/
|
435 |
private function handle_delete_slider() {
|
|
|
436 |
if (isset($_GET['delete'])) {
|
437 |
$slide = array(
|
438 |
'ID' => intVal($_GET['delete']),
|
473 |
}
|
474 |
|
475 |
|
476 |
+
|
477 |
+
/**
|
478 |
+
* Get the slider libary parameters
|
479 |
+
*
|
480 |
+
* @return string javascript options
|
481 |
+
*/
|
482 |
+
private function get_params() {
|
483 |
+
$params = array(
|
484 |
+
'width' => array(
|
485 |
+
'map' => array(
|
486 |
+
'coin' => 'width'
|
487 |
+
),
|
488 |
+
'default' => 565
|
489 |
+
),
|
490 |
+
'height' => array(
|
491 |
+
'map' => array(
|
492 |
+
'coin' => 'height'
|
493 |
+
),
|
494 |
+
'default' => 290
|
495 |
+
),
|
496 |
+
'spw' => array(
|
497 |
+
'map' => array(
|
498 |
+
'coin' => 'spw',
|
499 |
+
'nivo' => 'boxCols'
|
500 |
+
),
|
501 |
+
'default' => 7
|
502 |
+
),
|
503 |
+
'sph' => array(
|
504 |
+
'map' => array(
|
505 |
+
'coin' => 'sph',
|
506 |
+
'nivo' => 'boxRows'
|
507 |
+
),
|
508 |
+
'default' => 5
|
509 |
+
),
|
510 |
+
'delay' => array(
|
511 |
+
'map' => array(
|
512 |
+
'coin' => 'delay',
|
513 |
+
'nivo' => 'pauseTime',
|
514 |
+
'flex' => 'slideshowSpeed',
|
515 |
+
'responsive' => 'timeout'
|
516 |
+
),
|
517 |
+
'default' => 3000
|
518 |
+
),
|
519 |
+
'sDelay' => array(
|
520 |
+
'map' => array(
|
521 |
+
'coin' => 'sDelay'
|
522 |
+
),
|
523 |
+
'default' => 30
|
524 |
+
),
|
525 |
+
'opacity' => array(
|
526 |
+
'map' => array(
|
527 |
+
'coin' => 'opacity'
|
528 |
+
),
|
529 |
+
'default' => 0.7
|
530 |
+
),
|
531 |
+
'effect' => array(
|
532 |
+
'map' => array(
|
533 |
+
'coin' => 'effect',
|
534 |
+
'nivo' => 'effect',
|
535 |
+
'flex' => 'animation'
|
536 |
+
),
|
537 |
+
'default' => 'random'
|
538 |
+
),
|
539 |
+
'navigation' => array(
|
540 |
+
'map' => array(
|
541 |
+
'coin' => 'navigation',
|
542 |
+
'nivo' => 'controlNav',
|
543 |
+
'flex' => 'controlNav',
|
544 |
+
'responsive' => 'pager'
|
545 |
+
),
|
546 |
+
'default' => true
|
547 |
+
),
|
548 |
+
'links' => array(
|
549 |
+
'map' => array(
|
550 |
+
'nivo' => 'directionNav',
|
551 |
+
'flex' => 'directionNav',
|
552 |
+
'responsive' => 'nav'
|
553 |
+
),
|
554 |
+
'default' => true
|
555 |
+
),
|
556 |
+
'hoverPause' => array(
|
557 |
+
'map' => array(
|
558 |
+
'coin' => 'hoverPause',
|
559 |
+
'nivo' => 'pauseOnHover',
|
560 |
+
'flex' => 'pauseOnHover',
|
561 |
+
'responsive' => 'pause'
|
562 |
+
),
|
563 |
+
'default' => true
|
564 |
+
),
|
565 |
+
'theme' => array(
|
566 |
+
'map' => array(
|
567 |
+
'nivo' => 'theme'
|
568 |
+
),
|
569 |
+
'default' => 'dark'
|
570 |
+
),
|
571 |
+
'direction' => array(
|
572 |
+
'map' => array(
|
573 |
+
'flex' => 'direction'
|
574 |
+
),
|
575 |
+
'default' => 'horizontal'
|
576 |
+
),
|
577 |
+
'reverse' => array(
|
578 |
+
'map' => array(
|
579 |
+
'flex' => 'reverse'
|
580 |
+
),
|
581 |
+
'default' => false,
|
582 |
+
),
|
583 |
+
'animationSpeed' => array(
|
584 |
+
'map' => array(
|
585 |
+
'nivo' => 'animSpeed',
|
586 |
+
'flex' => 'animationSpeed',
|
587 |
+
'responsive' => 'speed'
|
588 |
+
),
|
589 |
+
'default' => 600
|
590 |
+
),
|
591 |
+
'prevText' => array(
|
592 |
+
'map' => array(
|
593 |
+
'nivo' => 'prevText',
|
594 |
+
'flex' => 'prevText',
|
595 |
+
'responsive' => 'prevText'
|
596 |
+
),
|
597 |
+
'default' => 'Previous'
|
598 |
+
),
|
599 |
+
'nextText' => array(
|
600 |
+
'map' => array(
|
601 |
+
'nivo' => 'nextText',
|
602 |
+
'flex' => 'nextText',
|
603 |
+
'responsive' => 'nextText'
|
604 |
+
),
|
605 |
+
'default' => 'Next'
|
606 |
+
),
|
607 |
+
'slices' => array(
|
608 |
+
'map' => array(
|
609 |
+
'nivo' => 'slices'
|
610 |
+
),
|
611 |
+
'default' => 15
|
612 |
+
)
|
613 |
+
);
|
614 |
+
|
615 |
+
$options = array();
|
616 |
+
|
617 |
+
foreach ($params as $setting => $map) {
|
618 |
+
if (isset($map['map'][$this->get_setting('type')])) {
|
619 |
+
$optionName = $map['map'][$this->get_setting('type')];
|
620 |
+
|
621 |
+
if (!$optionVal = $this->get_setting($setting)) {
|
622 |
+
$optionVal = $map['default'];
|
623 |
+
}
|
624 |
+
|
625 |
+
if (gettype($map['default']) == 'string') {
|
626 |
+
$options[] = $optionName . ": '" . $optionVal . "'";
|
627 |
+
} else {
|
628 |
+
$options[] = $optionName . ": " . $optionVal;
|
629 |
+
}
|
630 |
+
}
|
631 |
+
}
|
632 |
+
|
633 |
+
return implode(",\n ", $options);;
|
634 |
+
}
|
635 |
+
|
636 |
+
/**
|
637 |
+
* Return the Javascript to kick off the slider. Code is wrapped in a timer
|
638 |
+
* to allow for themes that load jQuery at the bottom of the page.
|
639 |
+
*
|
640 |
+
* @return string javascript
|
641 |
+
*/
|
642 |
+
private function get_inline_javascript($type, $identifier) {
|
643 |
+
$retVal = "\n<script type='text/javascript'>";
|
644 |
+
$retVal .= "\n var " . $identifier . " = function($) {";
|
645 |
+
$retVal .= "\n $('#" . $identifier . "')." . $type . "({ ";
|
646 |
+
$retVal .= "\n " . $this->get_params();
|
647 |
+
$retVal .= "\n });";
|
648 |
+
$retVal .= "\n };";
|
649 |
+
$retVal .= "\n var timer_" . $identifier . " = function() {";
|
650 |
+
$retVal .= "\n if (window.jQuery && jQuery.isReady) {";
|
651 |
+
$retVal .= "\n " . $identifier . "(window.jQuery);";
|
652 |
+
$retVal .= "\n } else {";
|
653 |
+
$retVal .= "\n window.setTimeout(timer_" . $identifier . ", 100);";
|
654 |
+
$retVal .= "\n }";
|
655 |
+
$retVal .= "\n };";
|
656 |
+
$retVal .= "\n timer_" . $identifier . "();";
|
657 |
+
$retVal .= "\n</script>";
|
658 |
+
|
659 |
+
return $retVal;
|
660 |
+
}
|
661 |
+
|
662 |
/**
|
663 |
* Return coin slider markup
|
664 |
*
|
665 |
* @return string coin slider markup.
|
666 |
*/
|
667 |
+
private function get_coin_slider($identifier) {
|
|
|
|
|
668 |
$retVal = "<div id='" . $identifier . "' class='coin-slider'>";
|
669 |
|
670 |
foreach ($this->get_slides() as $slide) {
|
677 |
|
678 |
$retVal .= "</div>";
|
679 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
680 |
return $retVal;
|
681 |
}
|
682 |
+
|
683 |
/**
|
684 |
* Return flexslider markup
|
685 |
*
|
686 |
* @return string flex slider markup.
|
687 |
*/
|
688 |
+
private function get_flex_slider($identifier) {
|
|
|
|
|
689 |
$retVal = "<div id='" . $identifier . "' class='flexslider'><ul class='slides'>";
|
690 |
|
691 |
foreach ($this->get_slides() as $slide) {
|
698 |
}
|
699 |
|
700 |
$retVal .= "</ul></div>";
|
701 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
702 |
return $retVal;
|
703 |
}
|
704 |
|
707 |
*
|
708 |
* @return string responsive slider markup.
|
709 |
*/
|
710 |
+
private function get_responsive_slider($identifier) {
|
|
|
|
|
711 |
$retVal = "<ul id='" . $identifier . "' class='rslides'>";
|
712 |
|
713 |
foreach ($this->get_slides() as $slide) {
|
720 |
|
721 |
$retVal .= "</ul>";
|
722 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
723 |
return $retVal;
|
724 |
}
|
725 |
|
728 |
*
|
729 |
* @return string nivo slider markup.
|
730 |
*/
|
731 |
+
private function get_nivo_slider($identifier) {
|
|
|
|
|
732 |
$retVal = "<div class='slider-wrapper theme-{$this->get_setting('theme')}'>";
|
733 |
$retVal .= "<div class='ribbon'></div>";
|
734 |
$retVal .= "<div id='" . $identifier . "' class='nivoSlider'>";
|
741 |
|
742 |
$retVal .= "</div></div>";
|
743 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
744 |
return $retVal;
|
745 |
}
|
746 |
|
768 |
|
769 |
$this->set_slider($id);
|
770 |
|
771 |
+
$identifier = 'ml_slider_' . rand();
|
772 |
+
|
773 |
// coinslider
|
774 |
if ($this->get_setting('type') == 'coin') {
|
775 |
if ($this->get_setting('printJs') == 'true') {
|
780 |
wp_enqueue_style('ml-slider_coin_slider_css', plugins_url('ml-slider/assets/coinslider/coin-slider-styles.css'));
|
781 |
}
|
782 |
|
783 |
+
$retVal = $this->get_coin_slider($identifier);
|
784 |
+
$retVal .= $this->get_inline_javascript('coinslider', $identifier);
|
785 |
}
|
786 |
|
787 |
// flex
|
794 |
wp_enqueue_style('ml-slider_flex_slider_css', plugins_url('ml-slider/assets/flexslider/flexslider.css'));
|
795 |
}
|
796 |
|
797 |
+
$retVal = $this->get_flex_slider($identifier);
|
798 |
+
$retVal .= $this->get_inline_javascript('flexslider', $identifier);
|
799 |
}
|
800 |
|
801 |
// responsive
|
808 |
wp_enqueue_style('ml-slider_responsive_slides_css', plugins_url('ml-slider/assets/responsiveslides/responsiveslides.css'));
|
809 |
}
|
810 |
|
811 |
+
$retVal = $this->get_responsive_slider($identifier);
|
812 |
+
$retVal .= $this->get_inline_javascript('responsiveSlides', $identifier);
|
813 |
}
|
814 |
|
815 |
// nivo
|
823 |
wp_enqueue_style('ml-slider_nivo_slider_theme_' . $this->get_setting('theme'), plugins_url('ml-slider/assets/nivoslider/themes/' . $this->get_setting('theme') . '/' . $this->get_setting('theme') . '.css'));
|
824 |
}
|
825 |
|
826 |
+
$retVal = $this->get_nivo_slider($identifier);
|
827 |
+
$retVal .= $this->get_inline_javascript('nivoSlider', $identifier);
|
828 |
}
|
829 |
|
830 |
return "<div class='ml-slider ml-slider-{$this->get_setting('type')} {$this->get_setting('cssClass')}'>" . $retVal . "</div>";
|
858 |
}
|
859 |
?>
|
860 |
|
861 |
+
<a href="?page=ml-slider&add=true" id="create_new_tab" class="nav-tab" style='font-size: 13px;'>+</a>
|
862 |
</h2>
|
863 |
|
864 |
<?php
|
904 |
<thead>
|
905 |
<tr>
|
906 |
<th colspan="2">Settings</th>
|
907 |
+
<th>
|
908 |
+
<input type='submit' value='Save' class='alignright button-primary' />
|
909 |
+
<div class='unsaved tooltip' style='display: none;' title='Unsaved Changes'>!</div>
|
910 |
+
</th>
|
911 |
</tr>
|
912 |
</thead>
|
913 |
<tbody>
|
readme.txt
CHANGED
@@ -1,39 +1,46 @@
|
|
1 |
=== Plugin Name ===
|
2 |
Contributors: matchalabs
|
3 |
-
Tags: flexslider,flex,flex slider,nivoslider,nivo,nivo slider,responsiveslides,responsive,
|
4 |
Requires at least: 3.5
|
5 |
Tested up to: 3.5
|
6 |
-
Stable tag: 1.1
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
10 |
4 image sliders in 1! Choose from Nivo Slider, Flex Slider, Coin Slider or Responsive Slides.
|
11 |
|
12 |
== Description ==
|
13 |
-
ML Slider is a clean slideshow management plugin that leaves the heavy lifting to a selection of popular jQuery slider plugins - the choice is yours. ML Slider builds upon standard WordPress functionality wherever possible; slideshows are stored as a custom post type, slides are stored as media
|
14 |
|
15 |
-
|
16 |
|
17 |
-
|
18 |
|
19 |
-
Features:
|
20 |
-
|
21 |
-
* Create unlimited slideshows with unlimited number of slides
|
22 |
* Intuitive administration panel
|
23 |
-
*
|
|
|
24 |
* Add captions to slides
|
25 |
* Add URLs to slides
|
26 |
-
* 18 transition effects
|
27 |
-
* 4 themes (Nivo Slider)
|
28 |
* Reorder slides with drag and drop
|
29 |
-
* Integrated with WordPress media manager
|
30 |
* Create new slides from your Media Library, or upload new images
|
31 |
-
* Responsive (Nivo Slider, Flex Slider, Responsive Slides)
|
32 |
* Mix & Match! Include as many slideshows on the same page as you want
|
33 |
-
* Configure each slideshow with the chosen slider library options
|
34 |
-
* Adjust slider libary options such as: speed, theme, hover pause, width, height
|
35 |
* Option to include your own CSS
|
36 |
* Lightweight, only the bare minimum in terms of JavaScript and CSS is outputted to your website
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
|
38 |
== Installation ==
|
39 |
|
@@ -43,6 +50,16 @@ Features:
|
|
43 |
|
44 |
== Frequently Asked Questions ==
|
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
== Screenshots ==
|
47 |
|
48 |
1. Administration panel - overview
|
@@ -54,6 +71,19 @@ Features:
|
|
54 |
|
55 |
== Changelog ==
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
= 1.1 =
|
58 |
* Improvement: Code refactored
|
59 |
* Fix: hitting [enter] brings up Media Library
|
@@ -64,4 +94,4 @@ Features:
|
|
64 |
* Fix: min version incorrect (should be 3.5)
|
65 |
|
66 |
= 1.0 =
|
67 |
-
* Initial version
|
1 |
=== Plugin Name ===
|
2 |
Contributors: matchalabs
|
3 |
+
Tags: wordpress slider,slider,slides,slideshow,wordpress slideshow,image slider,flexslider,flex,flex slider,nivoslider,nivo,nivo slider,responsiveslides,responsive,responsive slides,coinslider,coin,coin slider,slideshow,carousel,responsive slider,slider plugin,vertical slides,ml slider,image rotator
|
4 |
Requires at least: 3.5
|
5 |
Tested up to: 3.5
|
6 |
+
Stable tag: 1.2.1
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
10 |
4 image sliders in 1! Choose from Nivo Slider, Flex Slider, Coin Slider or Responsive Slides.
|
11 |
|
12 |
== Description ==
|
13 |
+
ML Slider is a clean slideshow management plugin that leaves the heavy lifting to a selection of popular jQuery slider plugins - the choice is yours. ML Slider builds upon standard WordPress functionality wherever possible; slideshows are stored as a custom post type, slides are stored as media files and the relation between the two is stored as taxonomy data.
|
14 |
|
15 |
+
http://www.youtube.com/watch?v=SdPKN7rTfM8
|
16 |
|
17 |
+
ML Slider Features:
|
18 |
|
|
|
|
|
|
|
19 |
* Intuitive administration panel
|
20 |
+
* Create unlimited slideshows with unlimited number of slides
|
21 |
+
* Choose slider library from Nivo Slider, Flex Slider 2, Coin Slider or Responsive Slides (per slideshow)
|
22 |
* Add captions to slides
|
23 |
* Add URLs to slides
|
|
|
|
|
24 |
* Reorder slides with drag and drop
|
|
|
25 |
* Create new slides from your Media Library, or upload new images
|
|
|
26 |
* Mix & Match! Include as many slideshows on the same page as you want
|
|
|
|
|
27 |
* Option to include your own CSS
|
28 |
* Lightweight, only the bare minimum in terms of JavaScript and CSS is outputted to your website
|
29 |
+
* Built in shortcode
|
30 |
+
|
31 |
+
Slider Features:
|
32 |
+
|
33 |
+
* 18 transition effects
|
34 |
+
* 4 themes (Nivo Slider)
|
35 |
+
* Responsive (Nivo Slider, Flex Slider 2, Responsive Slides)
|
36 |
+
* Adjust slider libary options such as: speed, theme, hover pause, width, height
|
37 |
+
|
38 |
+
Read more and thanks to:
|
39 |
+
|
40 |
+
* [http://flexslider.woothemes.com/](http://flexslider.woothemes.com/)
|
41 |
+
* [http://responsive-slides.viljamis.com/](http://responsive-slides.viljamis.com/)
|
42 |
+
* [http://workshop.rs/projects/coin-slider/](http://workshop.rs/projects/coin-slider/)
|
43 |
+
* [http://dev7studios.com/nivo-slider/](http://dev7studios.com/nivo-slider/)
|
44 |
|
45 |
== Installation ==
|
46 |
|
50 |
|
51 |
== Frequently Asked Questions ==
|
52 |
|
53 |
+
= How do I include a slideshow directly in my templates? =
|
54 |
+
|
55 |
+
`<?php echo do_shortcode("[ml-slider id=#]") ?>`
|
56 |
+
|
57 |
+
= Why are some effects/options greyed out? =
|
58 |
+
|
59 |
+
The effects are enabled/disabled depending on which library you have selected.
|
60 |
+
|
61 |
+
For example, flex slider supports the 'Fade' and 'Slide' effect whereas coin slider supports 'Random', 'Swirl', 'Straight' and 'Rain'. Unavailable options are greyed out.
|
62 |
+
|
63 |
== Screenshots ==
|
64 |
|
65 |
1. Administration panel - overview
|
71 |
|
72 |
== Changelog ==
|
73 |
|
74 |
+
= 1.2.1 =
|
75 |
+
* Fix: Number of slides per slideshow limited to WordPress 'blog pages show at most' setting (reported by and thanks to: Kenny)
|
76 |
+
* Fix: Add warning when BMP file is added to slider (reported by and thanks to MadBong)
|
77 |
+
* Fix: Allow images smaller than default thumbnail size to be added to slider (reported by and thanks to: MadBong)
|
78 |
+
|
79 |
+
= 1.2 =
|
80 |
+
* Improvement: Code refactored
|
81 |
+
* Fix: Unable to assign the same image to more than one slider
|
82 |
+
* Fix: JavaScript error when jQuery is loaded in page footer
|
83 |
+
* Improvement: Warning notice when the slider has unsaved changes
|
84 |
+
* Fix: Captions not being escaped (reported by and thanks to: papabeers)
|
85 |
+
* Improvement: Add multiple files to slider from Media Browser
|
86 |
+
|
87 |
= 1.1 =
|
88 |
* Improvement: Code refactored
|
89 |
* Fix: hitting [enter] brings up Media Library
|
94 |
* Fix: min version incorrect (should be 3.5)
|
95 |
|
96 |
= 1.0 =
|
97 |
+
* Initial version
|