Slimstat Analytics - Version 4.1.7

Version Description

  • [New] Added new column dt_out to our table structure, to capture when a visitor leaves the page. This allows us to measure things like time on page and time on site. Please consider purchasing our Heartbeat add-on to increase this metric's accuracy.
  • [Update] New icon added to our custom font package, and removed unneded font files for faster loading.
  • [Update] Plugin Update Checker version 2.2 is now part of the package.
  • [Fix] Bug preventing the stylesheet from loading on the Settings pages, under certain circumstances.
Download this release

Release Info

Developer coolmann
Plugin Icon 128x128 Slimstat Analytics
Version 4.1.7
Comparing to
See all releases

Code changes from version 4.1.6.3 to 4.1.7

admin/css/fontello.eot DELETED
Binary file
admin/css/fontello.woff DELETED
Binary file
admin/css/slimstat.css CHANGED
@@ -664,4 +664,71 @@
664
  #ui-datepicker-div{display:none;}.ui-datepicker{background-color:#fff;border:1px solid #ccc;width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
665
 
666
  /* Fontello - Custom Icon Fonts for SlimStat | Uses Fontelico (C) 2012 by Fontello project, Elusive (C) 2013 by Aristeides Stathopoulos, Font Awesome (C) 2012 by Dave Gandy | http://www.fontello.com */
667
- @font-face{font-family:slimstat;src:url(fontello.eot),url(fontello.eot#iefix) format('embedded-opentype'),url(fontello.svg#fontello) format('svg'),url(fontello.woff) format('woff'),url(fontello.ttf) format('truetype');font-weight:400;font-style:normal}[class*=" slimstat-font-"]:before,[class^="slimstat-font-"]:before{font-family:slimstat;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;}.header [class*=" slimstat-font-"]:before,.header [class^="slimstat-font-"]:before{font-size:16px}.slimstat-font-spin1:before{content:'\e800'}.slimstat-font-clock:before{content:'\e801'}.slimstat-font-search:before{content:'\e802'}.slimstat-font-cancel:before{content:'\e803'}.slimstat-font-download:before{content:'\e804'}.slimstat-font-upload:before{content:'\e805'}.slimstat-font-download-cloud:before{content:'\e806'}.slimstat-font-upload-cloud:before{content:'\e807'}.slimstat-font-location-1:before{content:'\e808'}.slimstat-font-arrows-cw-1:before{content:'\e809'}.slimstat-font-login:before{content:'\e80a'}.slimstat-font-logout:before{content:'\e80b'}.slimstat-font-angle-left:before{content:'\e80c'}.slimstat-font-angle-right:before{content:'\e80d'}.slimstat-font-angle-double-left:before{content:'\e80e'}.slimstat-font-angle-double-right:before{content:'\e80f'}.slimstat-font-arrows-cw:before{content:'\e810'}.slimstat-font-doc:before{content:'\e811'}.slimstat-font-spin3:before{content:'\e812'}.slimstat-font-edit:before{content:'\e813'}.slimstat-font-gauge:before{content:'\e814'}.animate-spin{-moz-animation:spin 3s infinite linear;-o-animation:spin 3s infinite linear;-webkit-animation:spin 3s infinite linear;animation:spin 3s infinite linear;display:inline-block}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
664
  #ui-datepicker-div{display:none;}.ui-datepicker{background-color:#fff;border:1px solid #ccc;width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
665
 
666
  /* Fontello - Custom Icon Fonts for SlimStat | Uses Fontelico (C) 2012 by Fontello project, Elusive (C) 2013 by Aristeides Stathopoulos, Font Awesome (C) 2012 by Dave Gandy | http://www.fontello.com */
667
+ @font-face {
668
+ font-family: 'slimstat';
669
+ src: url('slimstat.eot?37610477');
670
+ src: url('slimstat.eot?37610477#iefix') format('embedded-opentype'),
671
+ url('slimstat.svg?37610477#fontello') format('svg');
672
+ font-weight: normal;
673
+ font-style: normal;
674
+ }
675
+ @font-face {
676
+ font-family: 'slimstat';
677
+ src: url('data:application/octet-stream;base64,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') format('woff'),
678
+ url('data:application/octet-stream;base64,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') format('truetype');
679
+ }
680
+
681
+ [class^="slimstat-font-"]:before, [class*=" slimstat-font-"]:before {
682
+ font-family: "slimstat";
683
+ font-style: normal;
684
+ font-weight: normal;
685
+ speak: none;
686
+
687
+ display: inline-block;
688
+ text-decoration: inherit;
689
+ width: 1em;
690
+ margin-right: .2em;
691
+ text-align: center;
692
+ /* opacity: .8; */
693
+
694
+ /* For safety - reset parent styles, that can break glyph codes*/
695
+ font-variant: normal;
696
+ text-transform: none;
697
+
698
+ /* fix buttons height, for twitter bootstrap */
699
+ line-height: 1em;
700
+
701
+ /* Animation center compensation - margins should be symmetric */
702
+ /* remove if not needed */
703
+ margin-left: .2em;
704
+
705
+ /* you can be more comfortable with increased icons size */
706
+ /* font-size: 120%; */
707
+
708
+ /* Uncomment for 3D effect */
709
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
710
+ }
711
+ .slimstat-font-spin1:before { content: '\e800'; } /* '' */
712
+ .slimstat-font-clock:before { content: '\e801'; } /* '' */
713
+ .slimstat-font-search:before { content: '\e802'; } /* '' */
714
+ .slimstat-font-cancel:before { content: '\e803'; } /* '' */
715
+ .slimstat-font-download:before { content: '\e804'; } /* '' */
716
+ .slimstat-font-upload:before { content: '\e805'; } /* '' */
717
+ .slimstat-font-download-cloud:before { content: '\e806'; } /* '' */
718
+ .slimstat-font-upload-cloud:before { content: '\e807'; } /* '' */
719
+ .slimstat-font-location-1:before { content: '\e808'; } /* '' */
720
+ .slimstat-font-arrows-cw-1:before { content: '\e809'; } /* '' */
721
+ .slimstat-font-login:before { content: '\e80a'; } /* '' */
722
+ .slimstat-font-logout:before { content: '\e80b'; } /* '' */
723
+ .slimstat-font-angle-left:before { content: '\e80c'; } /* '' */
724
+ .slimstat-font-angle-right:before { content: '\e80d'; } /* '' */
725
+ .slimstat-font-angle-double-left:before { content: '\e80e'; } /* '' */
726
+ .slimstat-font-angle-double-right:before { content: '\e80f'; } /* '' */
727
+ .slimstat-font-arrows-cw:before { content: '\e810'; } /* '' */
728
+ .slimstat-font-doc:before { content: '\e811'; } /* '' */
729
+ .slimstat-font-spin3:before { content: '\e812'; } /* '' */
730
+ .slimstat-font-edit:before { content: '\e813'; } /* '' */
731
+ .slimstat-font-gauge:before { content: '\e814'; } /* '' */
732
+ .slimstat-font-stopwatch:before { content: '\e815'; } /* '' */
733
+
734
+ .animate-spin{-moz-animation:spin 3s infinite linear;-o-animation:spin 3s infinite linear;-webkit-animation:spin 3s infinite linear;animation:spin 3s infinite linear;display:inline-block}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
admin/css/{fontello.ttf → slimstat.eot} RENAMED
Binary file
admin/css/{fontello.svg → slimstat.svg} RENAMED
@@ -1,32 +1,32 @@
1
- <?xml version="1.0" standalone="no"?>
2
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
- <svg xmlns="http://www.w3.org/2000/svg">
4
- <metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
5
- <defs>
6
- <font id="fontello" horiz-adv-x="1000" >
7
- <font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
8
- <missing-glyph horiz-adv-x="1000" />
9
- <glyph glyph-name="spin1" unicode="&#xe800;" d="m496 850c-176 0-331-90-421-226-18-27-33-55-46-85-12-29-21-60-28-92 0 0 0-1 0-1l0 0 0 0c0-1 0-2 0-2 0-7 5-12 11-12l101 0c5 0 10 4 11 9 29 113 109 206 214 253 20 10 41 17 63 23 31 7 62 11 95 11l0 0 0 0 0 0c25 0 50-2 74-7 5-1 10-2 14-3 6-1 10-3 14-4l0 0c5-1 11 1 13 6l51 87c0 0 1 1 1 2 2 6-1 13-7 15-22 7-43 13-65 17-5 1-9 1-13 2-27 5-54 7-82 7l0 0 0 0z m327-114c-5 0-9-2-11-6l-50-87c-3-4-2-10 2-14 29-29 54-63 73-101 4-7 7-14 11-22 19-46 30-97 30-151l0 0 0 0c0-77-22-149-62-209-7-11-15-23-24-34-9-10-18-20-28-30l0 0 0 0 0 0c-4-4-5-10-2-14l50-87c0-1 1-2 2-3 4-5 11-5 16-1 58 52 104 117 134 190 6 14 11 29 15 44 14 46 21 94 21 144 0 108-34 209-92 291-11 16-23 31-37 46-13 14-26 28-41 41l0 0c-1 1-1 1-2 1-2 1-4 2-5 2z m-811-468l0 0c-1 0-2 0-3 0-6-1-10-8-9-14 34-166 149-302 302-366 30-12 61-21 93-28 32-6 66-10 100-10l0 0 0 0c40 0 79 5 117 14 7 1 14 3 22 5 6 2 13 5 20 7 1 0 2 1 3 1 6 3 8 10 4 16l-50 87c-3 5-8 7-13 6-14-4-28-7-42-9-3-1-6-1-8-2-18-2-35-3-53-3l0 0 0 0c-128 0-242 63-311 160-1 0-1 0-1 0-13 19-25 40-35 61-10 21-18 43-24 65-1 6-6 10-11 10l-101 0z" horiz-adv-x="1000" />
10
- <glyph glyph-name="clock" unicode="&#xe801;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
11
- <glyph glyph-name="search" unicode="&#xe802;" d="m643 386q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
12
- <glyph glyph-name="cancel" unicode="&#xe803;" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
13
- <glyph glyph-name="download" unicode="&#xe804;" d="m714 100q0 15-10 25t-25 11-26-11-10-25 10-25 26-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
14
- <glyph glyph-name="upload" unicode="&#xe805;" d="m714 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m143 0q0 14-10 25t-26 10-25-10-10-25 10-26 25-10 26 10 10 26z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" />
15
- <glyph glyph-name="download-cloud" unicode="&#xe806;" d="m714 332q0 8-5 13t-13 5h-125v196q0 8-5 13t-12 5h-108q-7 0-12-5t-5-13v-196h-125q-8 0-13-5t-5-13q0-8 5-13l196-196q5-5 13-5t13 5l196 196q5 6 5 13z m357-125q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
16
- <glyph glyph-name="upload-cloud" unicode="&#xe807;" d="m714 368q0 8-5 13l-196 196q-5 5-13 5t-13-5l-196-196q-5-6-5-13 0-8 5-13t13-5h125v-196q0-8 5-13t12-5h108q7 0 12 5t5 13v196h125q8 0 13 5t5 13z m357-161q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
17
- <glyph glyph-name="location-1" unicode="&#xe808;" d="m429 493q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m142 0q0-61-18-100l-203-432q-9-18-27-29t-37-11-38 11-26 29l-204 432q-18 39-18 100 0 118 84 202t202 84 202-84 83-202z" horiz-adv-x="571.4" />
18
- <glyph glyph-name="arrows-cw-1" unicode="&#xe809;" d="m0-150l0 402 402 0-160-160q108-107 258-107 125 0 222 75t130 192l138 0q-35-173-173-288t-317-114q-207 0-353 146z m10 598q35 174 173 288t317 114q207 0 354-146l146 146 0-402-402 0 160 160q-108 107-258 107-125 0-222-75t-130-192l-138 0z" horiz-adv-x="1000" />
19
- <glyph glyph-name="login" unicode="&#xe80a;" d="m661 350q0-14-11-25l-303-304q-11-10-26-10t-25 10-10 25v161h-250q-15 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 10 25t25 10 26-10l303-304q11-10 11-25z m196 196v-392q0-67-47-114t-114-47h-178q-7 0-13 5t-5 13q0 2-1 11t0 15 2 13 5 11 12 3h178q37 0 63 27t27 63v392q0 37-27 63t-63 27h-174t-6 0-6 2-5 3-4 5-1 8q0 2-1 11t0 15 2 13 5 11 12 3h178q67 0 114-47t47-114z" horiz-adv-x="857.1" />
20
- <glyph glyph-name="logout" unicode="&#xe80b;" d="m357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
21
- <glyph glyph-name="angle-left" unicode="&#xe80c;" d="m350 546q0-7-6-12l-219-220 219-219q6-6 6-13t-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13z" horiz-adv-x="357.1" />
22
- <glyph glyph-name="angle-right" unicode="&#xe80d;" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z" horiz-adv-x="357.1" />
23
- <glyph glyph-name="angle-double-left" unicode="&#xe80e;" d="m350 82q0-7-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13z m214 0q0-7-5-13l-28-28q-6-5-13-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q6 6 13 6t13-6l28-28q5-5 5-13t-5-12l-220-220 220-219q5-6 5-13z" horiz-adv-x="571.4" />
24
- <glyph glyph-name="angle-double-right" unicode="&#xe80f;" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z m214 0q0-7-5-13l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13z" horiz-adv-x="571.4" />
25
- <glyph glyph-name="arrows-cw" unicode="&#xe810;" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
26
- <glyph glyph-name="doc" unicode="&#xe811;" d="m71-7h572v428h-232q-23 0-38 16t-16 38v232h-286v-714z m358 500h209q-5 16-12 23l-175 174q-6 7-22 13v-210z m285-18v-500q0-22-15-38t-38-16h-607q-23 0-38 16t-16 38v750q0 22 16 38t38 16h357q22 0 49-12t42-26l174-175q16-15 27-42t11-49z" horiz-adv-x="714.3" />
27
- <glyph glyph-name="spin3" unicode="&#xe812;" d="m494 850c-266 0-483-210-494-472-1-19 13-20 13-20l84 0c16 0 19 10 19 18 10 199 176 358 378 358 107 0 205-45 273-118l-58-57c-11-12-11-27 5-31l247-50c21-5 46 11 37 44l-58 227c-2 9-16 22-29 13l-65-60c-89 91-214 148-352 148z m409-508c-16 0-19-10-19-18-10-199-176-358-377-358-108 0-205 45-274 118l59 57c10 12 10 27-5 31l-248 50c-21 5-46-11-37-44l58-227c2-9 16-22 30-13l64 60c89-91 214-148 353-148 265 0 482 210 493 473 1 18-13 19-13 19l-84 0z" horiz-adv-x="1000" />
28
- <glyph glyph-name="edit" unicode="&#xe813;" d="m0 154v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114z m357-18v160l375 375 161-160-375-375h-161z m54 107h53v-54h32l64 65-85 85-64-65v-31z m116 134q9-9 18 0l196 196q9 9 0 18t-18 0l-196-196q-9-9 0-18z m241 330l51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38l-51-52z" horiz-adv-x="1000" />
29
- <glyph glyph-name="gauge" unicode="&#xe814;" d="m0 207q0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269z m71 0q0-29 21-50t51-21 50 21 21 50-21 51-50 21-51-21-21-51z m108 250q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m217-330q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55z m33 437q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m250-107q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m107-250q0-29 21-50t50-21 51 21 21 50-21 51-51 21-50-21-21-51z" horiz-adv-x="1000" />
30
- </font>
31
- </defs>
32
  </svg>
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Copyright (C) 2015 by original authors @ fontello.com</metadata>
5
+ <defs>
6
+ <font id="fontello" horiz-adv-x="1000" >
7
+ <font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
8
+ <missing-glyph horiz-adv-x="1000" />
9
+ <glyph glyph-name="clock" unicode="&#xe801;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
10
+ <glyph glyph-name="search" unicode="&#xe802;" d="m643 386q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
11
+ <glyph glyph-name="cancel" unicode="&#xe803;" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
12
+ <glyph glyph-name="download" unicode="&#xe804;" d="m714 100q0 15-10 25t-25 11-26-11-10-25 10-25 26-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
13
+ <glyph glyph-name="upload" unicode="&#xe805;" d="m714 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m143 0q0 14-10 25t-26 10-25-10-10-25 10-26 25-10 26 10 10 26z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" />
14
+ <glyph glyph-name="download-cloud" unicode="&#xe806;" d="m714 332q0 8-5 13t-13 5h-125v196q0 8-5 13t-12 5h-108q-7 0-12-5t-5-13v-196h-125q-8 0-13-5t-5-13q0-8 5-13l196-196q5-5 13-5t13 5l196 196q5 6 5 13z m357-125q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
15
+ <glyph glyph-name="upload-cloud" unicode="&#xe807;" d="m714 368q0 8-5 13l-196 196q-5 5-13 5t-13-5l-196-196q-5-6-5-13 0-8 5-13t13-5h125v-196q0-8 5-13t12-5h108q7 0 12 5t5 13v196h125q8 0 13 5t5 13z m357-161q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
16
+ <glyph glyph-name="location-1" unicode="&#xe808;" d="m429 493q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m142 0q0-61-18-100l-203-432q-9-18-27-29t-37-11-38 11-26 29l-204 432q-18 39-18 100 0 118 84 202t202 84 202-84 83-202z" horiz-adv-x="571.4" />
17
+ <glyph glyph-name="arrows-cw-1" unicode="&#xe809;" d="m0-150l0 402 402 0-160-160q108-107 258-107 125 0 222 75t130 192l138 0q-35-173-173-288t-317-114q-207 0-353 146z m10 598q35 174 173 288t317 114q207 0 354-146l146 146 0-402-402 0 160 160q-108 107-258 107-125 0-222-75t-130-192l-138 0z" horiz-adv-x="1000" />
18
+ <glyph glyph-name="login" unicode="&#xe80a;" d="m661 350q0-14-11-25l-303-304q-11-10-26-10t-25 10-10 25v161h-250q-15 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 10 25t25 10 26-10l303-304q11-10 11-25z m196 196v-392q0-67-47-114t-114-47h-178q-7 0-13 5t-5 13q0 2-1 11t0 15 2 13 5 11 12 3h178q37 0 63 27t27 63v392q0 37-27 63t-63 27h-174t-6 0-6 2-5 3-4 5-1 8q0 2-1 11t0 15 2 13 5 11 12 3h178q67 0 114-47t47-114z" horiz-adv-x="857.1" />
19
+ <glyph glyph-name="logout" unicode="&#xe80b;" d="m357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
20
+ <glyph glyph-name="angle-left" unicode="&#xe80c;" d="m350 546q0-7-6-12l-219-220 219-219q6-6 6-13t-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13z" horiz-adv-x="357.1" />
21
+ <glyph glyph-name="angle-right" unicode="&#xe80d;" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z" horiz-adv-x="357.1" />
22
+ <glyph glyph-name="angle-double-left" unicode="&#xe80e;" d="m350 82q0-7-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13z m214 0q0-7-5-13l-28-28q-6-5-13-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q6 6 13 6t13-6l28-28q5-5 5-13t-5-12l-220-220 220-219q5-6 5-13z" horiz-adv-x="571.4" />
23
+ <glyph glyph-name="angle-double-right" unicode="&#xe80f;" d="m332 314q0-7-6-13l-260-260q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l260-260q6-5 6-13z m214 0q0-7-5-13l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13z" horiz-adv-x="571.4" />
24
+ <glyph glyph-name="arrows-cw" unicode="&#xe810;" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
25
+ <glyph glyph-name="doc" unicode="&#xe811;" d="m71-7h572v428h-232q-23 0-38 16t-16 38v232h-286v-714z m358 500h209q-5 16-12 23l-175 174q-6 7-22 13v-210z m285-18v-500q0-22-15-38t-38-16h-607q-23 0-38 16t-16 38v750q0 22 16 38t38 16h357q22 0 49-12t42-26l174-175q16-15 27-42t11-49z" horiz-adv-x="714.3" />
26
+ <glyph glyph-name="spin4" unicode="&#xe812;" d="m498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" />
27
+ <glyph glyph-name="edit" unicode="&#xe813;" d="m0 154v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114z m357-18v160l375 375 161-160-375-375h-161z m54 107h53v-54h32l64 65-85 85-64-65v-31z m116 134q9-9 18 0l196 196q9 9 0 18t-18 0l-196-196q-9-9 0-18z m241 330l51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38l-51-52z" horiz-adv-x="1000" />
28
+ <glyph glyph-name="gauge" unicode="&#xe814;" d="m0 207q0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269z m71 0q0-29 21-50t51-21 50 21 21 50-21 51-50 21-51-21-21-51z m108 250q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m217-330q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55z m33 437q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m250-107q0-29 21-50t50-21 51 21 20 50-20 51-51 21-50-21-21-51z m107-250q0-29 21-50t50-21 51 21 21 50-21 51-51 21-50-21-21-51z" horiz-adv-x="1000" />
29
+ <glyph glyph-name="stopwatch" unicode="&#xe815;" d="m855 537q83-117 83-265 0-194-138-331t-331-138-331 138-138 331q0 180 120 313t298 152l0 1-2 3 0 51-51 0q-21 0-37 16t-15 37 15 36 37 16l208 0q21 0 36-16t16-36-16-37-36-16l-52 0 0-51-1-1 0-3q156-17 270-125 1 1 3 4t3 5l27 26q15 15 36 15t37-15 15-37-15-37l-26-26q-5-5-15-10z m-386-630q151 0 258 107t107 258-107 258-258 106-258-106-107-258 107-258 258-107z m52 416l104 0q21 0 37-15t16-36-16-37-37-15l-156 0q-21 0-37 15t-16 37l0 156q0 22 16 37t37 15 37-15 15-37l0-105z m-52 262q129 0 220-92t92-221-92-221-220-92-221 92-92 221 92 221 221 92z m0-574q107 0 184 77t76 184-76 184-184 76-184-76-76-184 76-184 184-77z" horiz-adv-x="938" />
30
+ </font>
31
+ </defs>
32
  </svg>
admin/js/slimstat.admin.js CHANGED
@@ -208,7 +208,7 @@ var SlimStatAdmin = {
208
  else{
209
  report_id = 'slim_p7_02';
210
  data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
211
- jQuery('#'+report_id+' .inside').html('<p class="loading"></p>');
212
  SlimStatAdmin.refresh_report(report_id, data);
213
 
214
  window.clearTimeout(refresh_handle);
@@ -225,7 +225,7 @@ var SlimStatAdmin = {
225
  data[filters_input[i]['name']] = filters_input[i]['value'];
226
  }
227
 
228
- jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin1 animate-spin"></i></p>');
229
 
230
  jQuery.post(ajaxurl, data, function(response){
231
  if (report_id.indexOf('_01') > 0){
208
  else{
209
  report_id = 'slim_p7_02';
210
  data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
211
+ jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
212
  SlimStatAdmin.refresh_report(report_id, data);
213
 
214
  window.clearTimeout(refresh_handle);
225
  data[filters_input[i]['name']] = filters_input[i]['value'];
226
  }
227
 
228
+ jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
229
 
230
  jQuery.post(ajaxurl, data, function(response){
231
  if (report_id.indexOf('_01') > 0){
admin/update-checker/debug-bar-panel.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if ( !class_exists('PluginUpdateCheckerPanel') && class_exists('Debug_Bar_Panel') ) {
4
 
5
  /**
6
  * A Debug Bar panel for the plugin update checker.
1
  <?php
2
 
3
+ if ( !class_exists('PluginUpdateCheckerPanel', false) && class_exists('Debug_Bar_Panel', false) ) {
4
 
5
  /**
6
  * A Debug Bar panel for the plugin update checker.
admin/update-checker/debug-bar-plugin.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if ( !class_exists('PucDebugBarPlugin') ) {
3
 
4
  class PucDebugBarPlugin {
5
  /** @var PluginUpdateChecker */
@@ -23,7 +23,7 @@ class PucDebugBarPlugin {
23
  */
24
  public function addDebugBarPanel($panels) {
25
  require_once dirname(__FILE__) . '/debug-bar-panel.php';
26
- if ( current_user_can('update_plugins') && class_exists('PluginUpdateCheckerPanel') ) {
27
  $panels[] = new PluginUpdateCheckerPanel($this->updateChecker);
28
  }
29
  return $panels;
1
  <?php
2
+ if ( !class_exists('PucDebugBarPlugin', false) ) {
3
 
4
  class PucDebugBarPlugin {
5
  /** @var PluginUpdateChecker */
23
  */
24
  public function addDebugBarPanel($panels) {
25
  require_once dirname(__FILE__) . '/debug-bar-panel.php';
26
+ if ( current_user_can('update_plugins') && class_exists('PluginUpdateCheckerPanel', false) ) {
27
  $panels[] = new PluginUpdateCheckerPanel($this->updateChecker);
28
  }
29
  return $panels;
admin/update-checker/github-checker.php CHANGED
@@ -1,8 +1,8 @@
1
  <?php
2
 
3
- if ( !class_exists('PucGitHubChecker_2_0') ):
4
 
5
- class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
6
  /**
7
  * @var string GitHub username.
8
  */
@@ -57,7 +57,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
57
  * @return PluginInfo
58
  */
59
  public function requestInfo($unusedQueryArgs = array()) {
60
- $info = new PluginInfo_2_0();
61
  $info->filename = $this->pluginFile;
62
  $info->slug = $this->slug;
63
  $info->sections = array();
@@ -94,6 +94,8 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
94
 
95
  if ( empty($info->download_url) ) {
96
  $info->download_url = $this->buildArchiveDownloadUrl($ref);
 
 
97
  }
98
 
99
  //Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata
@@ -254,7 +256,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
254
  * @return string
255
  */
256
  protected function parseMarkdown($markdown) {
257
- if ( !class_exists('Parsedown') ) {
258
  require_once(dirname(__FILE__) . '/vendor/Parsedown.php');
259
  }
260
 
@@ -375,7 +377,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
375
  * Copy plugin metadata from a file header to a PluginInfo object.
376
  *
377
  * @param array $fileHeader
378
- * @param PluginInfo_2_0 $pluginInfo
379
  */
380
  protected function setInfoFromHeader($fileHeader, $pluginInfo) {
381
  $headerToPropertyMap = array(
@@ -406,7 +408,7 @@ class PucGitHubChecker_2_0 extends PluginUpdateChecker_2_0 {
406
  }
407
 
408
  protected function parseReadme($content) {
409
- if ( !class_exists('PucReadmeParser') ) {
410
  require_once(dirname(__FILE__) . '/vendor/readme-parser.php');
411
  }
412
  $parser = new PucReadmeParser();
1
  <?php
2
 
3
+ if ( !class_exists('PucGitHubChecker_2_2', false) ):
4
 
5
+ class PucGitHubChecker_2_2 extends PluginUpdateChecker_2_2 {
6
  /**
7
  * @var string GitHub username.
8
  */
57
  * @return PluginInfo
58
  */
59
  public function requestInfo($unusedQueryArgs = array()) {
60
+ $info = new PluginInfo_2_2();
61
  $info->filename = $this->pluginFile;
62
  $info->slug = $this->slug;
63
  $info->sections = array();
94
 
95
  if ( empty($info->download_url) ) {
96
  $info->download_url = $this->buildArchiveDownloadUrl($ref);
97
+ } else if ( !empty($this->accessToken) ) {
98
+ $info->download_url = add_query_arg('access_token', $this->accessToken, $info->download_url);
99
  }
100
 
101
  //Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata
256
  * @return string
257
  */
258
  protected function parseMarkdown($markdown) {
259
+ if ( !class_exists('Parsedown', false) ) {
260
  require_once(dirname(__FILE__) . '/vendor/Parsedown.php');
261
  }
262
 
377
  * Copy plugin metadata from a file header to a PluginInfo object.
378
  *
379
  * @param array $fileHeader
380
+ * @param PluginInfo_2_2 $pluginInfo
381
  */
382
  protected function setInfoFromHeader($fileHeader, $pluginInfo) {
383
  $headerToPropertyMap = array(
408
  }
409
 
410
  protected function parseReadme($content) {
411
+ if ( !class_exists('PucReadmeParser', false) ) {
412
  require_once(dirname(__FILE__) . '/vendor/readme-parser.php');
413
  }
414
  $parser = new PucReadmeParser();
admin/update-checker/plugin-update-checker.php CHANGED
@@ -1,23 +1,23 @@
1
  <?php
2
  /**
3
- * Plugin Update Checker Library 2.0.0
4
  * http://w-shadow.com/
5
  *
6
  * Copyright 2015 Janis Elsts
7
- * Released under the MIT license. See license.txt for details.
8
  */
9
 
10
- if ( !class_exists('PluginUpdateChecker_2_0') ):
11
 
12
  /**
13
  * A custom plugin update checker.
14
  *
15
  * @author Janis Elsts
16
  * @copyright 2015
17
- * @version 2.0
18
  * @access public
19
  */
20
- class PluginUpdateChecker_2_0 {
21
  public $metadataUrl = ''; //The URL of the plugin's metadata file.
22
  public $pluginAbsolutePath = ''; //Full path of the main plugin file.
23
  public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins.
@@ -36,6 +36,8 @@ class PluginUpdateChecker_2_0 {
36
  private $debugBarPlugin = null;
37
  private $cachedInstalledVersion = null;
38
 
 
 
39
  /**
40
  * Class constructor.
41
  *
@@ -149,6 +151,11 @@ class PluginUpdateChecker_2_0 {
149
 
150
  //Rename the update directory to be the same as the existing directory.
151
  add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3);
 
 
 
 
 
152
  }
153
 
154
  /**
@@ -223,7 +230,7 @@ class PluginUpdateChecker_2_0 {
223
  //Try to parse the response
224
  $pluginInfo = null;
225
  if ( !is_wp_error($result) && isset($result['response']['code']) && ($result['response']['code'] == 200) && !empty($result['body']) ){
226
- $pluginInfo = PluginInfo_2_0::fromJson($result['body'], $this->debugMode);
227
  $pluginInfo->filename = $this->pluginFile;
228
  $pluginInfo->slug = $this->slug;
229
  } else if ( $this->debugMode ) {
@@ -256,7 +263,7 @@ class PluginUpdateChecker_2_0 {
256
  if ( $pluginInfo == null ){
257
  return null;
258
  }
259
- return PluginUpdate_2_0::fromPluginInfo($pluginInfo);
260
  }
261
 
262
  /**
@@ -419,7 +426,7 @@ class PluginUpdateChecker_2_0 {
419
  }
420
 
421
  if ( !empty($state) && isset($state->update) && is_object($state->update) ){
422
- $state->update = PluginUpdate_2_0::fromObject($state->update);
423
  }
424
  return $state;
425
  }
@@ -531,8 +538,8 @@ class PluginUpdateChecker_2_0 {
531
  * GitHub and other repositories provide ZIP downloads, but they often use directory names like
532
  * "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder.
533
  *
534
- * @param string $source
535
- * @param string $remoteSource
536
  * @param WP_Upgrader $upgrader
537
  * @return string|WP_Error
538
  */
@@ -551,33 +558,33 @@ class PluginUpdateChecker_2_0 {
551
  if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) {
552
  $pluginFile = $skin->plugin;
553
  }
554
- } elseif ( $upgrader->skin instanceof Bulk_Plugin_Upgrader_Skin ) {
555
- //This case is tricky because Bulk_Plugin_Upgrader_Skin doesn't actually store the plugin
556
  //filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can
557
  //do is compare those headers to the headers of installed plugins.
558
- if ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) {
559
- if ( !function_exists('get_plugins') ){
560
- require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
561
- }
562
-
563
- $installedPlugins = get_plugins();
564
- $matches = array();
565
- foreach($installedPlugins as $pluginBasename => $headers) {
566
- $diff1 = array_diff_assoc($headers, $skin->plugin_info);
567
- $diff2 = array_diff_assoc($skin->plugin_info, $headers);
568
- if ( empty($diff1) && empty($diff2) ) {
569
- $matches[] = $pluginBasename;
570
- }
571
- }
572
 
573
- //It's possible (though very unlikely) that there could be two plugins with identical
574
- //headers. In that case, we can't unambiguously identify the plugin that's being upgraded.
575
- if ( count($matches) !== 1 ) {
576
- return $source;
 
 
 
577
  }
 
578
 
579
- $pluginFile = reset($matches);
 
 
 
580
  }
 
 
 
 
581
  }
582
 
583
  //If WordPress is upgrading anything other than our plugin, leave the directory name unchanged.
@@ -592,6 +599,26 @@ class PluginUpdateChecker_2_0 {
592
  }
593
  $correctedSource = trailingslashit($remoteSource) . $pluginDirectoryName . '/';
594
  if ( $source !== $correctedSource ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
595
  $upgrader->skin->feedback(sprintf(
596
  'Renaming %s to %s&#8230;',
597
  '<span class="code">' . basename($source) . '</span>',
@@ -612,6 +639,32 @@ class PluginUpdateChecker_2_0 {
612
  return $source;
613
  }
614
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615
 
616
  /**
617
  * Get the details of the currently available update, if any.
@@ -825,8 +878,9 @@ class PluginUpdateChecker_2_0 {
825
  * Initialize the update checker Debug Bar plugin/add-on thingy.
826
  */
827
  public function initDebugBarPanel() {
828
- if ( class_exists('Debug_Bar') ) {
829
- require_once dirname(__FILE__) . '/debug-bar-plugin.php';
 
830
  $this->debugBarPlugin = new PucDebugBarPlugin($this);
831
  }
832
  }
@@ -834,17 +888,17 @@ class PluginUpdateChecker_2_0 {
834
 
835
  endif;
836
 
837
- if ( !class_exists('PluginInfo_2_0') ):
838
 
839
  /**
840
  * A container class for holding and transforming various plugin metadata.
841
  *
842
  * @author Janis Elsts
843
  * @copyright 2015
844
- * @version 2.0
845
  * @access public
846
  */
847
- class PluginInfo_2_0 {
848
  //Most fields map directly to the contents of the plugin's info.json file.
849
  //See the relevant docs for a description of their meaning.
850
  public $name;
@@ -865,6 +919,7 @@ class PluginInfo_2_0 {
865
  public $rating;
866
  public $num_ratings;
867
  public $downloaded;
 
868
  public $last_updated;
869
 
870
  public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything.
@@ -924,7 +979,7 @@ class PluginInfo_2_0 {
924
  //as those returned by the native WordPress.org API. These can be assigned directly.
925
  $sameFormat = array(
926
  'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice',
927
- 'num_ratings', 'downloaded', 'homepage', 'last_updated',
928
  );
929
  foreach($sameFormat as $field){
930
  if ( isset($this->$field) ) {
@@ -964,17 +1019,17 @@ class PluginInfo_2_0 {
964
 
965
  endif;
966
 
967
- if ( !class_exists('PluginUpdate_2_0') ):
968
 
969
  /**
970
  * A simple container class for holding information about an available update.
971
  *
972
  * @author Janis Elsts
973
  * @copyright 2015
974
- * @version 2.0
975
  * @access public
976
  */
977
- class PluginUpdate_2_0 {
978
  public $id = 0;
979
  public $slug;
980
  public $version;
@@ -996,7 +1051,7 @@ class PluginUpdate_2_0 {
996
  //Since update-related information is simply a subset of the full plugin info,
997
  //we can parse the update JSON as if it was a plugin info string, then copy over
998
  //the parts that we care about.
999
- $pluginInfo = PluginInfo_2_0::fromJson($json, $triggerErrors);
1000
  if ( $pluginInfo != null ) {
1001
  return self::fromPluginInfo($pluginInfo);
1002
  } else {
@@ -1080,7 +1135,7 @@ class PluginUpdate_2_0 {
1080
 
1081
  endif;
1082
 
1083
- if ( !class_exists('PucFactory') ):
1084
 
1085
  /**
1086
  * A factory that builds instances of other classes from this library.
@@ -1172,23 +1227,23 @@ endif;
1172
  require_once(dirname(__FILE__) . '/github-checker.php');
1173
 
1174
  //Register classes defined in this file with the factory.
1175
- PucFactory::addVersion('PluginUpdateChecker', 'PluginUpdateChecker_2_0', '2.0');
1176
- PucFactory::addVersion('PluginUpdate', 'PluginUpdate_2_0', '2.0');
1177
- PucFactory::addVersion('PluginInfo', 'PluginInfo_2_0', '2.0');
1178
- PucFactory::addVersion('PucGitHubChecker', 'PucGitHubChecker_2_0', '2.0');
1179
 
1180
  /**
1181
  * Create non-versioned variants of the update checker classes. This allows for backwards
1182
  * compatibility with versions that did not use a factory, and it simplifies doc-comments.
1183
  */
1184
- if ( !class_exists('PluginUpdateChecker') ) {
1185
- class PluginUpdateChecker extends PluginUpdateChecker_2_0 { }
1186
  }
1187
 
1188
- if ( !class_exists('PluginUpdate') ) {
1189
- class PluginUpdate extends PluginUpdate_2_0 {}
1190
  }
1191
 
1192
- if ( !class_exists('PluginInfo') ) {
1193
- class PluginInfo extends PluginInfo_2_0 {}
1194
  }
1
  <?php
2
  /**
3
+ * Plugin Update Checker Library 2.2.0
4
  * http://w-shadow.com/
5
  *
6
  * Copyright 2015 Janis Elsts
7
+ * Released under the MIT license. See license.txt for details.
8
  */
9
 
10
+ if ( !class_exists('PluginUpdateChecker_2_2', false) ):
11
 
12
  /**
13
  * A custom plugin update checker.
14
  *
15
  * @author Janis Elsts
16
  * @copyright 2015
17
+ * @version 2.2
18
  * @access public
19
  */
20
+ class PluginUpdateChecker_2_2 {
21
  public $metadataUrl = ''; //The URL of the plugin's metadata file.
22
  public $pluginAbsolutePath = ''; //Full path of the main plugin file.
23
  public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins.
36
  private $debugBarPlugin = null;
37
  private $cachedInstalledVersion = null;
38
 
39
+ private $upgradedPluginFile = null; //The plugin that is currently being upgraded by WordPress.
40
+
41
  /**
42
  * Class constructor.
43
  *
151
 
152
  //Rename the update directory to be the same as the existing directory.
153
  add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3);
154
+
155
+ //Keep track of which plugin WordPress is currently upgrading.
156
+ add_filter('upgrader_pre_install', array($this, 'setUpgradedPlugin'), 10, 2);
157
+ add_filter('upgrader_post_install', array($this, 'clearUpgradedPlugin'), 10, 1);
158
+ add_action('upgrader_process_complete', array($this, 'clearUpgradedPlugin'), 10, 1);
159
  }
160
 
161
  /**
230
  //Try to parse the response
231
  $pluginInfo = null;
232
  if ( !is_wp_error($result) && isset($result['response']['code']) && ($result['response']['code'] == 200) && !empty($result['body']) ){
233
+ $pluginInfo = PluginInfo_2_2::fromJson($result['body'], $this->debugMode);
234
  $pluginInfo->filename = $this->pluginFile;
235
  $pluginInfo->slug = $this->slug;
236
  } else if ( $this->debugMode ) {
263
  if ( $pluginInfo == null ){
264
  return null;
265
  }
266
+ return PluginUpdate_2_2::fromPluginInfo($pluginInfo);
267
  }
268
 
269
  /**
426
  }
427
 
428
  if ( !empty($state) && isset($state->update) && is_object($state->update) ){
429
+ $state->update = PluginUpdate_2_2::fromObject($state->update);
430
  }
431
  return $state;
432
  }
538
  * GitHub and other repositories provide ZIP downloads, but they often use directory names like
539
  * "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder.
540
  *
541
+ * @param string $source The directory to copy to /wp-content/plugins. Usually a subdirectory of $remoteSource.
542
+ * @param string $remoteSource WordPress has extracted the update to this directory.
543
  * @param WP_Upgrader $upgrader
544
  * @return string|WP_Error
545
  */
558
  if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) {
559
  $pluginFile = $skin->plugin;
560
  }
561
+ } elseif ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) {
562
+ //This case is tricky because Bulk_Plugin_Upgrader_Skin (etc) doesn't actually store the plugin
563
  //filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can
564
  //do is compare those headers to the headers of installed plugins.
565
+ if ( !function_exists('get_plugins') ){
566
+ require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
567
+ }
 
 
 
 
 
 
 
 
 
 
 
568
 
569
+ $installedPlugins = get_plugins();
570
+ $matches = array();
571
+ foreach($installedPlugins as $pluginBasename => $headers) {
572
+ $diff1 = array_diff_assoc($headers, $skin->plugin_info);
573
+ $diff2 = array_diff_assoc($skin->plugin_info, $headers);
574
+ if ( empty($diff1) && empty($diff2) ) {
575
+ $matches[] = $pluginBasename;
576
  }
577
+ }
578
 
579
+ //It's possible (though very unlikely) that there could be two plugins with identical
580
+ //headers. In that case, we can't unambiguously identify the plugin that's being upgraded.
581
+ if ( count($matches) !== 1 ) {
582
+ return $source;
583
  }
584
+
585
+ $pluginFile = reset($matches);
586
+ } elseif ( !empty($this->upgradedPluginFile) ) {
587
+ $pluginFile = $this->upgradedPluginFile;
588
  }
589
 
590
  //If WordPress is upgrading anything other than our plugin, leave the directory name unchanged.
599
  }
600
  $correctedSource = trailingslashit($remoteSource) . $pluginDirectoryName . '/';
601
  if ( $source !== $correctedSource ) {
602
+ //The update archive should contain a single directory that contains the rest of plugin files. Otherwise,
603
+ //WordPress will try to copy the entire working directory ($source == $remoteSource). We can't rename
604
+ //$remoteSource because that would break WordPress code that cleans up temporary files after update.
605
+ $sourceFiles = $wp_filesystem->dirlist($remoteSource);
606
+ if ( is_array($sourceFiles) ) {
607
+ $sourceFiles = array_keys($sourceFiles);
608
+ $firstFilePath = trailingslashit($remoteSource) . $sourceFiles[0];
609
+
610
+ if ( (count($sourceFiles) > 1) || (!$wp_filesystem->is_dir($firstFilePath)) ) {
611
+ return new WP_Error(
612
+ 'puc-incorrect-directory-structure',
613
+ sprintf(
614
+ 'The directory structure of the update is incorrect. All plugin files should be inside ' .
615
+ 'a directory named <span class="code">%s</span>, not at the root of the ZIP file.',
616
+ htmlentities($this->slug)
617
+ )
618
+ );
619
+ }
620
+ }
621
+
622
  $upgrader->skin->feedback(sprintf(
623
  'Renaming %s to %s&#8230;',
624
  '<span class="code">' . basename($source) . '</span>',
639
  return $source;
640
  }
641
 
642
+ /**
643
+ * @access private
644
+ *
645
+ * @param mixed $input
646
+ * @param array $hookExtra
647
+ * @return mixed Returns $input unaltered.
648
+ */
649
+ public function setUpgradedPlugin($input, $hookExtra) {
650
+ if (!empty($hookExtra['plugin']) && is_string($hookExtra['plugin'])) {
651
+ $this->upgradedPluginFile = $hookExtra['plugin'];
652
+ } else {
653
+ $this->upgradedPluginFile = null;
654
+ }
655
+ return $input;
656
+ }
657
+
658
+ /**
659
+ * @access private
660
+ *
661
+ * @param mixed $input
662
+ * @return mixed Returns $input unaltered.
663
+ */
664
+ public function clearUpgradedPlugin($input = null) {
665
+ $this->upgradedPluginFile = null;
666
+ return $input;
667
+ }
668
 
669
  /**
670
  * Get the details of the currently available update, if any.
878
  * Initialize the update checker Debug Bar plugin/add-on thingy.
879
  */
880
  public function initDebugBarPanel() {
881
+ $debugBarPlugin = dirname(__FILE__) . '/debug-bar-plugin.php';
882
+ if ( class_exists('Debug_Bar', false) && file_exists($debugBarPlugin) ) {
883
+ require_once $debugBarPlugin;
884
  $this->debugBarPlugin = new PucDebugBarPlugin($this);
885
  }
886
  }
888
 
889
  endif;
890
 
891
+ if ( !class_exists('PluginInfo_2_2', false) ):
892
 
893
  /**
894
  * A container class for holding and transforming various plugin metadata.
895
  *
896
  * @author Janis Elsts
897
  * @copyright 2015
898
+ * @version 2.2
899
  * @access public
900
  */
901
+ class PluginInfo_2_2 {
902
  //Most fields map directly to the contents of the plugin's info.json file.
903
  //See the relevant docs for a description of their meaning.
904
  public $name;
919
  public $rating;
920
  public $num_ratings;
921
  public $downloaded;
922
+ public $active_installs;
923
  public $last_updated;
924
 
925
  public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything.
979
  //as those returned by the native WordPress.org API. These can be assigned directly.
980
  $sameFormat = array(
981
  'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice',
982
+ 'num_ratings', 'downloaded', 'active_installs', 'homepage', 'last_updated',
983
  );
984
  foreach($sameFormat as $field){
985
  if ( isset($this->$field) ) {
1019
 
1020
  endif;
1021
 
1022
+ if ( !class_exists('PluginUpdate_2_2', false) ):
1023
 
1024
  /**
1025
  * A simple container class for holding information about an available update.
1026
  *
1027
  * @author Janis Elsts
1028
  * @copyright 2015
1029
+ * @version 2.2
1030
  * @access public
1031
  */
1032
+ class PluginUpdate_2_2 {
1033
  public $id = 0;
1034
  public $slug;
1035
  public $version;
1051
  //Since update-related information is simply a subset of the full plugin info,
1052
  //we can parse the update JSON as if it was a plugin info string, then copy over
1053
  //the parts that we care about.
1054
+ $pluginInfo = PluginInfo_2_2::fromJson($json, $triggerErrors);
1055
  if ( $pluginInfo != null ) {
1056
  return self::fromPluginInfo($pluginInfo);
1057
  } else {
1135
 
1136
  endif;
1137
 
1138
+ if ( !class_exists('PucFactory', false) ):
1139
 
1140
  /**
1141
  * A factory that builds instances of other classes from this library.
1227
  require_once(dirname(__FILE__) . '/github-checker.php');
1228
 
1229
  //Register classes defined in this file with the factory.
1230
+ PucFactory::addVersion('PluginUpdateChecker', 'PluginUpdateChecker_2_2', '2.2');
1231
+ PucFactory::addVersion('PluginUpdate', 'PluginUpdate_2_2', '2.2');
1232
+ PucFactory::addVersion('PluginInfo', 'PluginInfo_2_2', '2.2');
1233
+ PucFactory::addVersion('PucGitHubChecker', 'PucGitHubChecker_2_2', '2.2');
1234
 
1235
  /**
1236
  * Create non-versioned variants of the update checker classes. This allows for backwards
1237
  * compatibility with versions that did not use a factory, and it simplifies doc-comments.
1238
  */
1239
+ if ( !class_exists('PluginUpdateChecker', false) ) {
1240
+ class PluginUpdateChecker extends PluginUpdateChecker_2_2 { }
1241
  }
1242
 
1243
+ if ( !class_exists('PluginUpdate', false) ) {
1244
+ class PluginUpdate extends PluginUpdate_2_2 {}
1245
  }
1246
 
1247
+ if ( !class_exists('PluginInfo', false) ) {
1248
+ class PluginInfo extends PluginInfo_2_2 {}
1249
  }
admin/update-checker/vendor/readme-parser.php CHANGED
@@ -237,7 +237,7 @@ Class PucReadmeParser {
237
  $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE
238
 
239
  if ( $markdown ) { // Parse markdown.
240
- if ( !class_exists('Parsedown') ) {
241
  require_once(dirname(__FILE__) . '/Parsedown.php');
242
  }
243
  $instance = Parsedown::instance();
237
  $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE
238
 
239
  if ( $markdown ) { // Parse markdown.
240
+ if ( !class_exists('Parsedown', false) ) {
241
  require_once(dirname(__FILE__) . '/Parsedown.php');
242
  }
243
  $instance = Parsedown::instance();
admin/view/right-now.php CHANGED
@@ -53,7 +53,7 @@ else {
53
  if ($gethostbyaddr != $host_by_ip && !empty($gethostbyaddr)) $host_by_ip .= ', '.$gethostbyaddr;
54
  }
55
 
56
- $results[$i]['dt'] = date_i18n(wp_slimstat::$options['date_format'].' '.wp_slimstat::$options['time_format'], $results[$i]['dt'], true);
57
 
58
  // Print visit header?
59
  if ($i == 0 || $results[$i-1]['visit_id'] != $results[$i]['visit_id'] || ($results[$i]['visit_id'] == 0 && ($results[$i-1]['ip'] != $results[$i]['ip'] || $results[$i-1]['browser'] != $results[$i]['browser'] || $results[$i-1]['platform'] != $results[$i]['platform']))){
@@ -136,11 +136,18 @@ else {
136
  echo "<p class='header$highlight_row'>{$results[$i]['country']} $browser_filtered $platform_filtered $browser_type_filtered $ip_address $other_ip_address $notes <span class='plugins'>$plugins</span> $screen_resolution</p>";
137
  }
138
 
 
139
  $performance = '';
140
  if ( !$is_dashboard && ( !empty( $results[ $i ][ 'server_latency' ] ) || !empty( $results[ $i ][ 'page_performance' ] ) ) ) {
141
  $performance = "<i class='slimstat-font-gauge spaced' title='".__('Server Latency and Page Speed in milliseconds','wp-slimstat')."'></i> ".__('SL','wp-slimstat').": {$results[$i]['server_latency']} / ".__('PS','wp-slimstat').": {$results[$i]['page_performance']}";
142
  }
143
 
 
 
 
 
 
 
144
  // Permalink: find post title, if available
145
  $parse_url = parse_url(get_site_url(empty($results[$i]['blog_id'])?1:$results[$i]['blog_id']));
146
  $base_host = $parse_url['host'];
@@ -179,9 +186,7 @@ else {
179
  $results[$i]['referer'] = $results[$i][ 'outbound_resource' ] = $results[$i][ 'content_type' ] = '';
180
  }
181
 
182
- $results[$i]['dt'] = "<i class='spaced slimstat-font-clock' title='".__('Date and Time','wp-slimstat')."'></i> {$results[$i]['dt']}";
183
-
184
- echo "<p>{$results[$i]['resource']} <span class='details'>{$results[$i]['searchterms']} {$results[$i]['referer']} {$results[$i]['outbound_resource']} {$results[$i]['content_type']} $performance {$results[$i]['dt']} {$delete_row}</span></p>";
185
  }
186
 
187
  // Pagination
53
  if ($gethostbyaddr != $host_by_ip && !empty($gethostbyaddr)) $host_by_ip .= ', '.$gethostbyaddr;
54
  }
55
 
56
+ $date_time = "<i class='spaced slimstat-font-clock' title='".__( 'Date and Time', 'wp-slimstat' )."'></i> " . date_i18n( wp_slimstat::$options[ 'date_format' ] . ' ' . wp_slimstat::$options[ 'time_format' ], $results[ $i ][ 'dt' ], true );
57
 
58
  // Print visit header?
59
  if ($i == 0 || $results[$i-1]['visit_id'] != $results[$i]['visit_id'] || ($results[$i]['visit_id'] == 0 && ($results[$i-1]['ip'] != $results[$i]['ip'] || $results[$i-1]['browser'] != $results[$i]['browser'] || $results[$i-1]['platform'] != $results[$i]['platform']))){
136
  echo "<p class='header$highlight_row'>{$results[$i]['country']} $browser_filtered $platform_filtered $browser_type_filtered $ip_address $other_ip_address $notes <span class='plugins'>$plugins</span> $screen_resolution</p>";
137
  }
138
 
139
+ // Server Latency and Page Speed
140
  $performance = '';
141
  if ( !$is_dashboard && ( !empty( $results[ $i ][ 'server_latency' ] ) || !empty( $results[ $i ][ 'page_performance' ] ) ) ) {
142
  $performance = "<i class='slimstat-font-gauge spaced' title='".__('Server Latency and Page Speed in milliseconds','wp-slimstat')."'></i> ".__('SL','wp-slimstat').": {$results[$i]['server_latency']} / ".__('PS','wp-slimstat').": {$results[$i]['page_performance']}";
143
  }
144
 
145
+ // Time on page
146
+ $time_on_page = '';
147
+ if ( !$is_dashboard && !empty( $results[ $i ][ 'dt_out' ] ) ) {
148
+ $time_on_page = "<i class='slimstat-font-stopwatch spaced' title='" . __( 'Time spent on this page in seconds', 'wp-slimstat' ) . "'></i> " . date( 'i:s', $results[ $i ][ 'dt_out' ] - $results[ $i ][ 'dt' ] );
149
+ }
150
+
151
  // Permalink: find post title, if available
152
  $parse_url = parse_url(get_site_url(empty($results[$i]['blog_id'])?1:$results[$i]['blog_id']));
153
  $base_host = $parse_url['host'];
186
  $results[$i]['referer'] = $results[$i][ 'outbound_resource' ] = $results[$i][ 'content_type' ] = '';
187
  }
188
 
189
+ echo "<p>{$results[$i]['resource']} <span class='details'>$time_on_page {$results[$i]['searchterms']} {$results[$i]['referer']} {$results[$i]['outbound_resource']} {$results[$i]['content_type']} $performance $date_time {$delete_row}</span></p>";
 
 
190
  }
191
 
192
  // Pagination
admin/view/wp-slimstat-db.php CHANGED
@@ -79,7 +79,8 @@ class wp_slimstat_db {
79
  'interval' => array( __( 'days', 'wp-slimstat' ), 'int' ),
80
  'interval_hours' => array( __( 'hours', 'wp-slimstat' ), 'int' ),
81
  'interval_minutes' => array( __( 'minutes', 'wp-slimstat' ), 'int' ),
82
- 'dt' => array( __( 'Unix Timestamp', 'wp-slimstat' ), 'int' ),
 
83
 
84
  // Other columns
85
  'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
79
  'interval' => array( __( 'days', 'wp-slimstat' ), 'int' ),
80
  'interval_hours' => array( __( 'hours', 'wp-slimstat' ), 'int' ),
81
  'interval_minutes' => array( __( 'minutes', 'wp-slimstat' ), 'int' ),
82
+ 'dt' => array( __( 'Timestamp', 'wp-slimstat' ), 'int' ),
83
+ 'dt_out' => array( __( 'Exit Timestamp', 'wp-slimstat' ), 'int' ),
84
 
85
  // Other columns
86
  'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
admin/view/wp-slimstat-reports.php CHANGED
@@ -835,7 +835,7 @@ class wp_slimstat_reports {
835
 
836
  public static function report_header( $_report_id = '' ) {
837
  $header_classes = !empty( self::$reports_info[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports_info[ $_report_id ][ 'classes' ] ) : '';
838
- $header_buttons = '<div class="slimstat-header-buttons">'.apply_filters('slimstat_report_header_buttons', '<a class="button-ajax refresh slimstat-font-spin3" title="'.__('Refresh','wp-slimstat').'" href="'.self::fs_url().'"></a>', $_report_id).'</div>';
839
  $header_tooltip = !empty( self::$reports_info[ $_report_id ][ 'tooltip' ] ) ? "<i class='slimstat-tooltip-trigger corner'></i><span class='slimstat-tooltip-content'>".self::$reports_info[ $_report_id ][ 'tooltip' ]."</span>" : '';
840
 
841
  echo "<div class='postbox $header_classes' id='$_report_id'>$header_buttons<h3 class='hndle'>".self::$reports_info[ $_report_id ][ 'title' ]." $header_tooltip</h3><div class='inside' id='{$_report_id}_inside'>";
@@ -1351,45 +1351,45 @@ class wp_slimstat_reports {
1351
  $total_human_visits = wp_slimstat_db::count_records( 'visit_id', 'visit_id > 0 AND browser_type <> 1' );
1352
  $results = array();
1353
 
1354
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) >= 0 AND max(dt) - min(dt) <= 30' );
1355
  $average_time = 30 * $count_results;
1356
  $results[ 0 ][ 'metric' ] = __( '0 - 30 seconds', 'wp-slimstat' );
1357
  $results[ 0 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1358
  $results[ 0 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1359
 
1360
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 30 AND max(dt) - min(dt) <= 60' );
1361
  $average_time += 60 * $count_results;
1362
  $results[ 1 ][ 'metric' ] = __( '31 - 60 seconds', 'wp-slimstat' );
1363
  $results[ 1 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1364
  $results[ 1 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1365
 
1366
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 60 AND max(dt) - min(dt) <= 180' );
1367
  $average_time += 180 * $count_results;
1368
  $results[ 2 ][ 'metric' ] = __( '1 - 3 minutes', 'wp-slimstat' );
1369
  $results[ 2 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1370
  $results[ 2 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1371
 
1372
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 180 AND max(dt) - min(dt) <= 300' );
1373
  $average_time += 300 * $count_results;
1374
  $results[ 3 ][ 'metric' ] = __( '3 - 5 minutes', 'wp-slimstat' );
1375
  $results[ 3 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1376
  $results[ 3 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1377
 
1378
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 300 AND max(dt) - min(dt) <= 420' );
1379
  $average_time += 420 * $count_results;
1380
  $results[ 4 ][ 'metric' ] = __( '5 - 7 minutes', 'wp-slimstat' );
1381
  $results[ 4 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1382
  $results[ 4 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1383
 
1384
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 420 AND max(dt) - min(dt) <= 600' );
1385
  $average_time += 600* $count_results;
1386
  $results[ 5 ][ 'metric' ] = __( '7 - 10 minutes', 'wp-slimstat' );
1387
  $results[ 5 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1388
  $results[ 5 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1389
 
1390
- $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'max(dt) - min(dt) > 600' );
1391
  $average_time += 900 * $count_results;
1392
- $results[ 6 ][ 'metric' ] = __( 'More than minutes', 'wp-slimstat' );
1393
  $results[ 6 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1394
  $results[ 6 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1395
 
@@ -1401,7 +1401,7 @@ class wp_slimstat_reports {
1401
  $average_time = '0:00';
1402
  }
1403
 
1404
- $results[ 7 ][ 'metric' ] = __( 'Average time on site', 'wp-slimstat' );
1405
  $results[ 7 ][ 'value' ] = $average_time;
1406
  $results[ 7 ][ 'details' ] = '';
1407
 
835
 
836
  public static function report_header( $_report_id = '' ) {
837
  $header_classes = !empty( self::$reports_info[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports_info[ $_report_id ][ 'classes' ] ) : '';
838
+ $header_buttons = '<div class="slimstat-header-buttons">'.apply_filters('slimstat_report_header_buttons', '<a class="button-ajax refresh slimstat-font-arrows-cw" title="'.__('Refresh','wp-slimstat').'" href="'.self::fs_url().'"></a>', $_report_id).'</div>';
839
  $header_tooltip = !empty( self::$reports_info[ $_report_id ][ 'tooltip' ] ) ? "<i class='slimstat-tooltip-trigger corner'></i><span class='slimstat-tooltip-content'>".self::$reports_info[ $_report_id ][ 'tooltip' ]."</span>" : '';
840
 
841
  echo "<div class='postbox $header_classes' id='$_report_id'>$header_buttons<h3 class='hndle'>".self::$reports_info[ $_report_id ][ 'title' ]." $header_tooltip</h3><div class='inside' id='{$_report_id}_inside'>";
1351
  $total_human_visits = wp_slimstat_db::count_records( 'visit_id', 'visit_id > 0 AND browser_type <> 1' );
1352
  $results = array();
1353
 
1354
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', ' GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) >= 0 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 30' );
1355
  $average_time = 30 * $count_results;
1356
  $results[ 0 ][ 'metric' ] = __( '0 - 30 seconds', 'wp-slimstat' );
1357
  $results[ 0 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1358
  $results[ 0 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1359
 
1360
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 30 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 60' );
1361
  $average_time += 60 * $count_results;
1362
  $results[ 1 ][ 'metric' ] = __( '31 - 60 seconds', 'wp-slimstat' );
1363
  $results[ 1 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1364
  $results[ 1 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1365
 
1366
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 60 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 180' );
1367
  $average_time += 180 * $count_results;
1368
  $results[ 2 ][ 'metric' ] = __( '1 - 3 minutes', 'wp-slimstat' );
1369
  $results[ 2 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1370
  $results[ 2 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1371
 
1372
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 180 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 300' );
1373
  $average_time += 300 * $count_results;
1374
  $results[ 3 ][ 'metric' ] = __( '3 - 5 minutes', 'wp-slimstat' );
1375
  $results[ 3 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1376
  $results[ 3 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1377
 
1378
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 300 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 420' );
1379
  $average_time += 420 * $count_results;
1380
  $results[ 4 ][ 'metric' ] = __( '5 - 7 minutes', 'wp-slimstat' );
1381
  $results[ 4 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1382
  $results[ 4 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1383
 
1384
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 420 AND GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) <= 600' );
1385
  $average_time += 600* $count_results;
1386
  $results[ 5 ][ 'metric' ] = __( '7 - 10 minutes', 'wp-slimstat' );
1387
  $results[ 5 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1388
  $results[ 5 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1389
 
1390
+ $count_results = wp_slimstat_db::count_records_having( 'visit_id', 'visit_id > 0 AND browser_type <> 1', 'GREATEST( MAX( dt ), MAX( dt_out ) ) - MIN( dt ) > 600' );
1391
  $average_time += 900 * $count_results;
1392
+ $results[ 6 ][ 'metric' ] = __( 'More than 10 minutes', 'wp-slimstat' );
1393
  $results[ 6 ][ 'value' ] = ( $total_human_visits > 0 ) ? number_format( ( 100 * $count_results / $total_human_visits ), 2, wp_slimstat_db::$formats[ 'decimal' ], wp_slimstat_db::$formats[ 'thousand' ] ) : 0;
1394
  $results[ 6 ][ 'details' ] = __( 'Hits', 'wp-slimstat' ) . ": $count_results";
1395
 
1401
  $average_time = '0:00';
1402
  }
1403
 
1404
+ $results[ 7 ][ 'metric' ] = __( 'Average visit duration', 'wp-slimstat' );
1405
  $results[ 7 ][ 'value' ] = $average_time;
1406
  $results[ 7 ][ 'details' ] = '';
1407
 
admin/wp-slimstat-admin.php CHANGED
@@ -11,7 +11,7 @@ class wp_slimstat_admin{
11
  */
12
  public static function init(){
13
  if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
14
- self::$admin_notice = "It looks like it was yesterday that we launched version 4.0 and the new database structure, but it's already been five months. Now that our core infrastructure is stable enough, we are starting to imagine all the new features that can implement: membership tracking, beautiful charts, and of course new reports. If you would like to suggest a new feature, please <a href='http://support.wp-slimstat.com' target='_blank'>feel free to contact us</a>.";
15
  self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
16
  }
17
  else {
@@ -122,8 +122,8 @@ class wp_slimstat_admin{
122
  add_action('admin_enqueue_scripts', array(__CLASS__, 'wp_slimstat_stylesheet_icon'));
123
 
124
  // Update the table structure and options, if needed
125
- if (!empty(wp_slimstat::$options['version']) && wp_slimstat::$options['version'] != wp_slimstat::$version){
126
- add_action('admin_init', array(__CLASS__, 'update_tables_and_options'));
127
  }
128
  }
129
 
@@ -264,7 +264,9 @@ class wp_slimstat_admin{
264
 
265
  outbound_resource VARCHAR(2048) DEFAULT NULL,
266
 
 
267
  dt INT(10) UNSIGNED DEFAULT 0,
 
268
  CONSTRAINT PRIMARY KEY (id),
269
  INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
270
  ) COLLATE utf8_general_ci $use_innodb";
@@ -383,7 +385,9 @@ class wp_slimstat_admin{
383
 
384
  outbound_resource VARCHAR(2048) DEFAULT NULL,
385
 
 
386
  dt INT(10) UNSIGNED DEFAULT 0,
 
387
  CONSTRAINT PRIMARY KEY (id),
388
  INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
389
  ) COLLATE utf8_general_ci $use_innodb", $GLOBALS['wpdb']->prefix.'slim_stats_4', $my_wpdb );
@@ -514,7 +518,7 @@ class wp_slimstat_admin{
514
  // --- Updates for version 4.1.3 ---
515
  if (version_compare(wp_slimstat::$options['version'], '4.1.3', '<')){
516
  // Change column type to add IPv6 support
517
- $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD ip_temp VARCHAR(39) DEFAULT NULL AFTER id, ADD other_ip_temp VARCHAR(39) DEFAULT NULL AFTER id" );
518
  $my_wpdb->query( "UPDATE {$GLOBALS['wpdb']->prefix}slim_stats SET ip_temp = INET_NTOA(ip), other_ip_temp = INET_NTOA(other_ip)" );
519
  $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE ip ip_num INT UNSIGNED DEFAULT 0" );
520
  $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE other_ip other_ip_num INT UNSIGNED DEFAULT 0" );
@@ -523,6 +527,12 @@ class wp_slimstat_admin{
523
  }
524
  // --- END: Updates for version 4.1.3 ---
525
 
 
 
 
 
 
 
526
  // Now we can update the version stored in the database
527
  wp_slimstat::$options['version'] = wp_slimstat::$version;
528
 
@@ -682,10 +692,12 @@ class wp_slimstat_admin{
682
  $minimum_capability = wp_slimstat::$options['capability_can_admin'];
683
  }
684
 
685
- $new_entry = add_submenu_page(null, __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
686
  if (wp_slimstat::$options['use_separate_menu'] == 'yes'){
687
  $new_entry = add_submenu_page('wp-slim-view-1', __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
688
  }
 
 
 
689
 
690
  // Load styles and Javascript needed to make the reports look nice and interactive
691
  add_action('load-'.$new_entry, array(__CLASS__, 'wp_slimstat_stylesheet'));
11
  */
12
  public static function init(){
13
  if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
14
+ self::$admin_notice = "Last time we asked our users to send us suggestions on what they would like us to focus on. Fabian came up with a great idea: free premium add-ons for reviewing Slimstat. We liked it so much that we decided to extend it to all our users: write a review and get a $50 coupon (to be used on our store). Just follow these three easy steps: [1] send us your website URL so that we can approve your request; [2] write a review and leave it online for at least two weeks; [3] send us a link to your review and earn a $50 discount code. What are you waiting for?";
15
  self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
16
  }
17
  else {
122
  add_action('admin_enqueue_scripts', array(__CLASS__, 'wp_slimstat_stylesheet_icon'));
123
 
124
  // Update the table structure and options, if needed
125
+ if ( !empty( wp_slimstat::$options[ 'version' ] ) && wp_slimstat::$options[ 'version' ] != wp_slimstat::$version ) {
126
+ add_action( 'admin_init', array(__CLASS__, 'update_tables_and_options' ) );
127
  }
128
  }
129
 
264
 
265
  outbound_resource VARCHAR(2048) DEFAULT NULL,
266
 
267
+ dt_out INT(10) UNSIGNED DEFAULT 0,
268
  dt INT(10) UNSIGNED DEFAULT 0,
269
+
270
  CONSTRAINT PRIMARY KEY (id),
271
  INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
272
  ) COLLATE utf8_general_ci $use_innodb";
385
 
386
  outbound_resource VARCHAR(2048) DEFAULT NULL,
387
 
388
+ dt_out INT(10) UNSIGNED DEFAULT 0,
389
  dt INT(10) UNSIGNED DEFAULT 0,
390
+
391
  CONSTRAINT PRIMARY KEY (id),
392
  INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
393
  ) COLLATE utf8_general_ci $use_innodb", $GLOBALS['wpdb']->prefix.'slim_stats_4', $my_wpdb );
518
  // --- Updates for version 4.1.3 ---
519
  if (version_compare(wp_slimstat::$options['version'], '4.1.3', '<')){
520
  // Change column type to add IPv6 support
521
+ $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD ip_temp VARCHAR(39) DEFAULT NULL AFTER outbound_resource, ADD other_ip_temp VARCHAR(39) DEFAULT NULL AFTER id" );
522
  $my_wpdb->query( "UPDATE {$GLOBALS['wpdb']->prefix}slim_stats SET ip_temp = INET_NTOA(ip), other_ip_temp = INET_NTOA(other_ip)" );
523
  $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE ip ip_num INT UNSIGNED DEFAULT 0" );
524
  $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats CHANGE other_ip other_ip_num INT UNSIGNED DEFAULT 0" );
527
  }
528
  // --- END: Updates for version 4.1.3 ---
529
 
530
+ // --- Updates for version 4.1.7 ---
531
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.7', '<' ) ) {
532
+ // Change column type to add IPv6 support
533
+ $my_wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD dt_out INT(10) UNSIGNED DEFAULT 0 AFTER outbound_resource" );
534
+ }
535
+
536
  // Now we can update the version stored in the database
537
  wp_slimstat::$options['version'] = wp_slimstat::$version;
538
 
692
  $minimum_capability = wp_slimstat::$options['capability_can_admin'];
693
  }
694
 
 
695
  if (wp_slimstat::$options['use_separate_menu'] == 'yes'){
696
  $new_entry = add_submenu_page('wp-slim-view-1', __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
697
  }
698
+ else {
699
+ $new_entry = add_submenu_page(null, __('Settings','wp-slimstat'), __('Settings','wp-slimstat'), $minimum_capability, 'wp-slim-config', array(__CLASS__, 'wp_slimstat_include_config'));
700
+ }
701
 
702
  // Load styles and Javascript needed to make the reports look nice and interactive
703
  add_action('load-'.$new_entry, array(__CLASS__, 'wp_slimstat_stylesheet'));
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
5
  Requires at least: 3.8
6
  Tested up to: 4.3
7
- Stable tag: 4.1.6.3
8
 
9
  == Description ==
10
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
@@ -59,11 +59,15 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
59
 
60
  == Changelog ==
61
 
62
- = 4.1.6.3 =
63
- * [New] Polish localization added. Thank you, [DFactory Team](https://www.dfactory.eu/)
64
- * [Update] Renamed two reports to avoid conflicts with similarly named widgets on WP's main dashboard (thank you, Romain)
65
- * [Fix] Bug affecting the admin bar: permissions to display the link to just administrators were not being honored (thank you, Nils)
 
66
 
 
 
 
67
 
68
  = 4.1.6.2 =
69
  * [Note] Yep, our team is active even in August, while sunbathing somewhere on the US East Coast.
4
  Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
5
  Requires at least: 3.8
6
  Tested up to: 4.3
7
+ Stable tag: 4.1.7
8
 
9
  == Description ==
10
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
59
 
60
  == Changelog ==
61
 
62
+ = 4.1.7 =
63
+ * [New] Added new column dt_out to our table structure, to capture when a visitor leaves the page. This allows us to measure things like time on page and time on site. Please consider purchasing our [Heartbeat](http://www.wp-slimstat.com/downloads/heartbeat/) add-on to increase this metric's accuracy.
64
+ * [Update] New icon added to our custom font package, and removed unneded font files for faster loading.
65
+ * [Update] [Plugin Update Checker](https://github.com/YahnisElsts/plugin-update-checker) version 2.2 is now part of the package.
66
+ * [Fix] Bug preventing the stylesheet from loading on the Settings pages, under certain circumstances.
67
 
68
+ = 4.1.6.3 =
69
+ * [New] Polish localization added. Thank you, [DFactory Team](https://www.dfactory.eu/).
70
+ * [Fix] Bug affecting the admin bar: permissions to display the link to just administrators were not being honored. (thank you, Nils)
71
 
72
  = 4.1.6.2 =
73
  * [Note] Yep, our team is active even in August, while sunbathing somewhere on the US East Coast.
wp-slimstat.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP Slimstat
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
- Version: 4.1.6.3
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  */
@@ -11,7 +11,7 @@ Author URI: http://www.wp-slimstat.com/
11
  if ( !empty( wp_slimstat::$options ) ) return true;
12
 
13
  class wp_slimstat {
14
- public static $version = '4.1.6.3';
15
  public static $options = array();
16
 
17
  public static $wpdb = '';
@@ -138,6 +138,9 @@ class wp_slimstat {
138
  // ID of the pageview to update
139
  self::$stat[ 'id' ] = abs( intval( self::$data_js[ 'id' ] ) );
140
 
 
 
 
141
  // Are we tracking an outbound click?
142
  if (!empty(self::$data_js['res'])){
143
  $outbound_resource = strip_tags( trim( base64_decode( self::$data_js[ 'res' ] ) ) );
3
  Plugin Name: WP Slimstat
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
+ Version: 4.1.7
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  */
11
  if ( !empty( wp_slimstat::$options ) ) return true;
12
 
13
  class wp_slimstat {
14
+ public static $version = '4.1.7';
15
  public static $options = array();
16
 
17
  public static $wpdb = '';
138
  // ID of the pageview to update
139
  self::$stat[ 'id' ] = abs( intval( self::$data_js[ 'id' ] ) );
140
 
141
+ // Visitor is still on this page, record the timestamp in the corresponding field
142
+ self::$stat['dt_out'] = date_i18n( 'U' );
143
+
144
  // Are we tracking an outbound click?
145
  if (!empty(self::$data_js['res'])){
146
  $outbound_resource = strip_tags( trim( base64_decode( self::$data_js[ 'res' ] ) ) );