Q2W3 Fixed Widget - Version 2.2

Version Description

  • Now the plugin is able to reflect dynamic page content changes (infinite scroll, ajax basket and other javascript stuff)!!!
  • Added new option to plugin settings: Refresh interval. Recommended values between 250 - 1500 milliseconds. Note: setting have impact on the site performance (client side). If you don't have dynamic content, set Refresh interval
Download this release

Release Info

Developer Max Bond
Plugin Icon 128x128 Q2W3 Fixed Widget
Version 2.2
Comparing to
See all releases

Code changes from version 2.1 to 2.2

js/q2w3-fixed-widget.js CHANGED
@@ -1,75 +1,128 @@
1
- jQuery(window).load(function () {
2
- var margin_top = q2w3_fixed_widgets_margin_top;
3
- var margin_top_accumulate = margin_top;
4
- var margin_bottom = q2w3_fixed_widgets_margin_bottom;
5
- var widget_height = new Array();
6
- for (var i = 0; i < q2w3_fixed_widgets.length; i++) {
7
- widget = jQuery('#' + q2w3_fixed_widgets[i]);
8
- if ( widget.attr('id') ) { // element existsts
9
- widget_height[i] = widget.outerHeight(true);
10
- } else {
11
- widget_height[i] = 0;
 
 
 
 
 
12
  }
13
  }
14
- for (var i = 0; i < q2w3_fixed_widgets.length; i++) {
15
- widget = jQuery('#' + q2w3_fixed_widgets[i]);
16
- if ( widget.attr('id') ) { // element existsts
17
- q2w3_fixed_widget(widget, margin_top, margin_top_accumulate, margin_bottom, widget_height, i);
18
- margin_top_accumulate += widget_height[i];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  }
20
  }
21
- if (jQuery.browser.mozilla || jQuery.browser.opera) { // fixes mozilla, opera page refresh problem
22
- var scroll = jQuery(document).scrollTop();
23
- jQuery(document).scrollTop(0);
24
- jQuery(document).scrollTop(scroll);
 
 
 
 
 
25
  }
26
- });
27
- function q2w3_fixed_widget(widget, margin_top, margin_top_accumulate, margin_bottom, widget_height, i) {
28
- var widget_width = widget.css('width');
29
- var widget_margin = widget.css('margin');
30
- var widget_padding = widget.css('padding');
31
- var parent_height = widget.parent().height();
32
- var update_parent_height = false;
33
- var scroll_border_top = widget.offset().top - margin_top_accumulate;
34
- for (var j = i + 1; j < widget_height.length; j++) {
35
- margin_bottom += widget_height[j];
36
  }
37
- var scroll_border_bottom = jQuery(document).height() - margin_bottom;
38
- var widgets_height_accumulate = 0;
39
- for (var k = i; k >= 0; k--) {
40
- widgets_height_accumulate += widget_height[k];
 
41
  }
42
- jQuery(window).scroll(function (event) {
43
- var scroll_target = jQuery(this).scrollTop() + widgets_height_accumulate + margin_top;
44
- var scroll_delta = scroll_target - scroll_border_bottom + ( jQuery(window).height() - widgets_height_accumulate - margin_top );
45
- if ( scroll_target >= scroll_border_bottom ) { // fixed bottom
46
- if ( !update_parent_height ) { // needed when sidebar is longer then main content
47
- widget.parent().height(parent_height);
48
- update_parent_height = true;
49
- }
50
- widget.css('position', 'fixed');
51
- widget.css('top', '');
52
- widget.css('bottom', scroll_delta);
53
- widget.css('width', widget_width);
54
- widget.css('margin', widget_margin);
55
- widget.css('padding', widget_padding);
56
- } else if ( jQuery(this).scrollTop() >= scroll_border_top ) { // fixed top
57
- if ( !update_parent_height ) { // needed when sidebar is longer then main content
58
- widget.parent().height(parent_height);
59
- update_parent_height = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
- widget.css('position', 'fixed');
62
- widget.css('top', margin_top_accumulate);
63
- widget.css('bottom', '');
64
- widget.css('width', widget_width);
65
- widget.css('margin', widget_margin);
66
- widget.css('padding', widget_padding);
67
- } else { // normal
68
- if ( update_parent_height ) {
69
- widget.parent().removeAttr('style');
70
- update_parent_height = false;
71
- }
72
- widget.css('position', '');
73
- }
74
- });
75
- }
1
+ function q2w3_sidebar(options) {
2
+
3
+ if ( !options.widgets) return false;
4
+
5
+ if ( !options.sidebar) options.sidebar = 'q2w3_default';
6
+
7
+ var widgets = new Array();
8
+
9
+ var window_height = jQuery(window).height();
10
+ var document_height = jQuery(document).height();
11
+
12
+ if ( jQuery.browser.mozilla || jQuery.browser.webkit ) { // fixes Mozilla & Webkit page refresh problem. Not working for IE and Opera
13
+ var sc = jQuery(document).scrollTop()
14
+ if ( sc > 0 ) {
15
+ jQuery(document).scrollTop(0);
16
+ jQuery(document).scrollTop(sc);
17
  }
18
  }
19
+
20
+ function widget(obj, position, offset_top, fixed_margin_top, fixed_margin_bottom, height, next_widgets_height) {
21
+ this.obj = obj;
22
+ this.position = position;
23
+ this.fixed_margin_top = fixed_margin_top;
24
+ this.fixed_margin_bottom = fixed_margin_bottom;
25
+ this.offset_top = offset_top;
26
+ this.height = height;
27
+ this.next_widgets_height = next_widgets_height;
28
+ }
29
+
30
+ var fixed_margin_top = options.margin_top;
31
+
32
+ for ( var i = 0; i < options.widgets.length; i++ ) {
33
+ widget_obj = jQuery('#' + options.widgets[i]);
34
+ if ( widget_obj.attr('id') ) { // element exists
35
+ widgets[i] = new widget();
36
+ widgets[i].obj = widget_obj;
37
+ widgets[i].position = widget_obj.css('position');
38
+ widgets[i].offset_top = widget_obj.offset().top;
39
+ widgets[i].fixed_margin_top = fixed_margin_top;
40
+ widgets[i].height = widget_obj.outerHeight(true);
41
+ widgets[i].fixed_margin_bottom = fixed_margin_top + widgets[i].height;
42
+ fixed_margin_top += widgets[i].height;
43
+ } else {
44
+ widgets[i] = false;
45
  }
46
  }
47
+
48
+ if ( widgets.length < 1 ) return false;
49
+
50
+ for ( var i = 0; i < widgets.length ; i++ ) {
51
+ if (widgets[i]) widgets[i].obj.css('position', '');
52
+ }
53
+
54
+ for ( var i = 0; i < widgets.length ; i++ ) {
55
+ if (widgets[i]) widgets[i].offset_top = widgets[i].obj.offset().top;
56
  }
57
+
58
+ var next_widgets_height = 0;
59
+
60
+ for ( var i = widgets.length - 1; i >= 0; i-- ) {
61
+ if (widgets[i]) {
62
+ widgets[i].next_widgets_height = next_widgets_height;
63
+ widgets[i].fixed_margin_bottom += next_widgets_height;
64
+ next_widgets_height += widgets[i].height;
65
+ if ( widgets[i].position != widgets[i].obj.css('position') ) widgets[i].obj.css('position', widgets[i].position);
66
+ }
67
  }
68
+
69
+ jQuery(window).off('scroll.' + options.sidebar);
70
+
71
+ for ( var i = 0; i < widgets.length; i++ ) {
72
+ if (widgets[i]) fixed_widget(widgets[i]);
73
  }
74
+
75
+ function fixed_widget(widget) {
76
+
77
+ var scroll_position_trigger_top = widget.offset_top - widget.fixed_margin_top;
78
+ var scroll_position_trigger_bottom = document_height - options.margin_bottom;
79
+
80
+ var widget_width = widget.obj.css('width');
81
+ var widget_margin = widget.obj.css('margin');
82
+ var widget_padding = widget.obj.css('padding');
83
+
84
+ var style_applied_top = false;
85
+ var style_applied_bottom = false;
86
+ var style_applied_normal = false;
87
+
88
+ jQuery(window).on('scroll.' + options.sidebar, function (event) {
89
+ var scroll = jQuery(this).scrollTop();
90
+ widget.obj.attr('offset_top', widget.offset_top);
91
+ widget.obj.attr('fixed_margin_top', widget.fixed_margin_top);
92
+ if ( scroll + widget.fixed_margin_bottom >= scroll_position_trigger_bottom ) { // fixed bottom
93
+ if ( !style_applied_bottom ) {
94
+ widget.obj.css('position', 'fixed');
95
+ widget.obj.css('top', '');
96
+ widget.obj.css('width', widget_width);
97
+ widget.obj.css('margin', widget_margin);
98
+ widget.obj.css('padding', widget_padding);
99
+ style_applied_bottom = true;
100
+ style_applied_top = false;
101
+ style_applied_normal = false;
102
+ }
103
+ widget.obj.css('bottom', scroll + window_height + widget.next_widgets_height - scroll_position_trigger_bottom);
104
+ } else if ( scroll >= scroll_position_trigger_top ) { // fixed top
105
+ if ( !style_applied_top ) {
106
+ widget.obj.css('position', 'fixed');
107
+ widget.obj.css('top', widget.fixed_margin_top);
108
+ widget.obj.css('bottom', '');
109
+ widget.obj.css('width', widget_width);
110
+ widget.obj.css('margin', widget_margin);
111
+ widget.obj.css('padding', widget_padding);
112
+ style_applied_top = true;
113
+ style_applied_bottom = false;
114
+ style_applied_normal = false;
115
+ }
116
+ } else { // normal
117
+ if ( !style_applied_normal ) {
118
+ widget.obj.css('position', '');
119
+ style_applied_normal = true;
120
+ style_applied_top = false;
121
+ style_applied_bottom = false;
122
+ }
123
  }
124
+ });
125
+
126
+ }
127
+
128
+ }
 
 
 
 
 
 
 
 
 
 
lang/q2w3-fixed-widget.pot DELETED
@@ -1,15 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: Q2W3 Fixed Widget\n"
4
- "POT-Creation-Date: 2012-12-12 12:20+0400\n"
5
- "PO-Revision-Date: 2012-12-12 12:21+0400\n"
6
- "Last-Translator: \n"
7
- "Language-Team: \n"
8
- "MIME-Version: 1.0\n"
9
- "Content-Type: text/plain; charset=UTF-8\n"
10
- "Content-Transfer-Encoding: 8bit\n"
11
- "X-Generator: Poedit 1.5.4\n"
12
- "X-Poedit-KeywordsList: _;gettext;gettext_noop;__;_e\n"
13
- "X-Poedit-Basepath: .\n"
14
- "X-Poedit-SearchPath-0: c:\\Program Files (x86)\\Zend\\Apache2\\htdocs\\q2w3."
15
- "ru-dev\\wp-content\\plugins\\q2w3-fixed-widget\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lang/ru_RU.mo CHANGED
Binary file
lang/ru_RU.po CHANGED
@@ -1,70 +1,85 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: Q2W3 Fixed Widget\n"
4
- "POT-Creation-Date: 2013-02-02 20:43+0400\n"
5
- "PO-Revision-Date: 2013-02-02 20:43+0400\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "X-Generator: Poedit 1.5.4\n"
12
  "X-Poedit-KeywordsList: _;gettext;gettext_noop;__;_e\n"
13
  "X-Poedit-Basepath: .\n"
14
  "X-Poedit-SearchPath-0: c:\\Program Files (x86)\\Zend\\Apache2\\htdocs\\q2w3."
15
  "ru-dev\\wp-content\\plugins\\q2w3-fixed-widget\n"
16
 
17
  #: c:\Program Files
18
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:121
19
  msgid "Fixed widget"
20
  msgstr "Зафиксировать виджет"
21
 
22
  #: c:\Program Files
23
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:161
24
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:207
25
  msgid "Fixed Widget Options"
26
  msgstr "Фикс. Виджеты"
27
 
28
  #: c:\Program Files
29
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:211
30
  msgid "Settings saved."
31
  msgstr ""
32
 
33
  #: c:\Program Files
34
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:223
35
  msgid "Margin Top:"
36
  msgstr "Верхний отступ:"
37
 
38
  #: c:\Program Files
39
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:223
40
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:225
41
  msgid "px"
42
  msgstr "пикс."
43
 
44
  #: c:\Program Files
45
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:225
46
  msgid "Margin Bottom:"
47
  msgstr "Нижний отступ:"
48
 
49
  #: c:\Program Files
50
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  msgid "Custom HTML IDs (each one on a new line):"
52
  msgstr ""
53
  "HTML-идентификаторы статических виджетов и прочих<br/> нестандартных "
54
  "элементов (каждый на новой строке):"
55
 
56
  #: c:\Program Files
57
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:229
58
  msgid "Disable plugin on phone devices:"
59
  msgstr "Отключить плагин на мобильных:"
60
 
61
  #: c:\Program Files
62
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:231
63
  msgid "Disable plugin on tablet devices:"
64
  msgstr "Отключить плагин на планшетах:"
65
 
66
  #: c:\Program Files
67
- #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:233
68
  msgid "Save Changes"
69
  msgstr ""
70
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: Q2W3 Fixed Widget\n"
4
+ "POT-Creation-Date: 2013-03-12 11:47+0400\n"
5
+ "PO-Revision-Date: 2013-03-12 11:49+0400\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "X-Generator: Poedit 1.5.5\n"
12
  "X-Poedit-KeywordsList: _;gettext;gettext_noop;__;_e\n"
13
  "X-Poedit-Basepath: .\n"
14
  "X-Poedit-SearchPath-0: c:\\Program Files (x86)\\Zend\\Apache2\\htdocs\\q2w3."
15
  "ru-dev\\wp-content\\plugins\\q2w3-fixed-widget\n"
16
 
17
  #: c:\Program Files
18
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:135
19
  msgid "Fixed widget"
20
  msgstr "Зафиксировать виджет"
21
 
22
  #: c:\Program Files
23
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:175
24
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:221
25
  msgid "Fixed Widget Options"
26
  msgstr "Фикс. Виджеты"
27
 
28
  #: c:\Program Files
29
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:225
30
  msgid "Settings saved."
31
  msgstr ""
32
 
33
  #: c:\Program Files
34
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:237
35
  msgid "Margin Top:"
36
  msgstr "Верхний отступ:"
37
 
38
  #: c:\Program Files
39
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:237
40
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:239
41
  msgid "px"
42
  msgstr "пикс."
43
 
44
  #: c:\Program Files
45
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:239
46
  msgid "Margin Bottom:"
47
  msgstr "Нижний отступ:"
48
 
49
  #: c:\Program Files
50
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:241
51
+ msgid "Refresh interval:"
52
+ msgstr "Интервал обновления:"
53
+
54
+ #: c:\Program Files
55
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:241
56
+ msgid "milliseconds"
57
+ msgstr "миллисекунды"
58
+
59
+ #: c:\Program Files
60
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:241
61
+ msgid "Set 0 to disable."
62
+ msgstr "Установите 0, чтобы отключить пересчет параметров"
63
+
64
+ #: c:\Program Files
65
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:243
66
  msgid "Custom HTML IDs (each one on a new line):"
67
  msgstr ""
68
  "HTML-идентификаторы статических виджетов и прочих<br/> нестандартных "
69
  "элементов (каждый на новой строке):"
70
 
71
  #: c:\Program Files
72
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:245
73
  msgid "Disable plugin on phone devices:"
74
  msgstr "Отключить плагин на мобильных:"
75
 
76
  #: c:\Program Files
77
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:247
78
  msgid "Disable plugin on tablet devices:"
79
  msgstr "Отключить плагин на планшетах:"
80
 
81
  #: c:\Program Files
82
+ #: (x86)\Zend\Apache2\htdocs\q2w3.ru-dev\wp-content\plugins\q2w3-fixed-widget/q2w3-fixed-widget.php:249
83
  msgid "Save Changes"
84
  msgstr ""
85
 
q2w3-fixed-widget.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Q2W3 Fixed Widget
4
  Plugin URI: http://www.q2w3.ru/q2w3-fixed-widget-wordpress-plugin/
5
  Description: Fixes positioning of the selected widgets, when the page is scrolled down.
6
  Author: Max Bond
7
- Version: 2.1
8
  Author URI: http://www.q2w3.ru/
9
  */
10
 
@@ -20,7 +20,7 @@ if ( is_admin() ) {
20
 
21
  add_action('admin_menu', array( 'q2w3_fixed_widget', 'admin_init' ));
22
 
23
- } else {
24
 
25
  add_action('template_redirect', array( 'q2w3_fixed_widget', 'init' ));
26
 
@@ -46,7 +46,7 @@ class q2w3_fixed_widget {
46
 
47
  public static function init() {
48
 
49
- wp_enqueue_script('q2w3-fixed-widget', plugin_dir_url( __FILE__ ) . 'js/q2w3-fixed-widget.js', array('jquery'), '2.0', true);
50
 
51
  self::check_custom_ids();
52
 
@@ -102,13 +102,27 @@ class q2w3_fixed_widget {
102
 
103
  $array = implode(',', self::$fixed_widgets);
104
 
105
- echo '<script type="text/javascript">q2w3_fixed_widgets = new Array('. $array .'); q2w3_fixed_widgets_margin_top = '.$options['margin-top'].'; q2w3_fixed_widgets_margin_bottom = '.$options['margin-bottom'].';</script>'.PHP_EOL;
106
-
107
- } else {
108
 
109
- echo '<script type="text/javascript">q2w3_fixed_widgets = new Array(); q2w3_fixed_widgets_margin_top = '.$options['margin-top'].'; q2w3_fixed_widgets_margin_bottom = '.$options['margin-bottom'].';</script>'.PHP_EOL;
 
 
 
 
 
 
110
 
111
- }
 
 
 
 
 
 
 
 
112
 
113
  }
114
 
@@ -168,6 +182,8 @@ class q2w3_fixed_widget {
168
 
169
  $d['margin-bottom'] = 0;
170
 
 
 
171
  return $d;
172
 
173
  }
@@ -176,9 +192,7 @@ class q2w3_fixed_widget {
176
 
177
  $options = get_option(self::ID);
178
 
179
- if (!$options) $options = self::defaults();
180
-
181
- return $options;
182
 
183
  }
184
 
@@ -224,17 +238,21 @@ class q2w3_fixed_widget {
224
 
225
  echo '<p><span style="display: inline-block; width: 100px;">'. __('Margin Bottom:', 'q2w3_fixed_widget') .'</span><input type="text" name="'. self::ID .'[margin-bottom]" value="'. $options['margin-bottom'] .'" style="width: 50px; text-align: center;" />&nbsp;'. __('px', 'q2w3_fixed_widget') .'</p>'.PHP_EOL;
226
 
 
 
227
  echo '<p><span >'. __('Custom HTML IDs (each one on a new line):', 'q2w3_fixed_widget') .'</span><br/><textarea name="'. self::ID .'[custom-ids]" style="width: 320px; height: 120px;">'. $options['custom-ids'] .'</textarea>'.PHP_EOL;
228
 
229
- echo '<p><span style="display: inline-block; width: 195px;">'. __('Disable plugin on phone devices:', 'q2w3_fixed_widget') .'</span><input type="checkbox" name="'. self::ID .'[disable-phone]" value="yes" '. checked('yes', $options['disable-phone'], false) .' />'.PHP_EOL;
230
 
231
- echo '<p><span style="display: inline-block; width: 195px;">'. __('Disable plugin on tablet devices:', 'q2w3_fixed_widget') .'</span><input type="checkbox" name="'. self::ID .'[disable-tablet]" value="yes" '. checked('yes', $options['disable-tablet'], false) .' />'.PHP_EOL;
232
-
233
  echo '<p class="submit"><input type="submit" class="button-primary" value="'. __('Save Changes') .'" /></p>'.PHP_EOL;
234
 
235
  echo '</form>'.PHP_EOL;
 
 
236
 
237
- echo '<div style="position: absolute; top: 50px; right: 20px;"><form action="https://www.paypal.com/cgi-bin/webscr" method="post"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="hosted_button_id" value="Q36H2MHNVVP7U"><input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"></form></div>'.PHP_EOL;
238
 
239
  echo '</div><!-- .wrap -->'.PHP_EOL;
240
 
4
  Plugin URI: http://www.q2w3.ru/q2w3-fixed-widget-wordpress-plugin/
5
  Description: Fixes positioning of the selected widgets, when the page is scrolled down.
6
  Author: Max Bond
7
+ Version: 2.2
8
  Author URI: http://www.q2w3.ru/
9
  */
10
 
20
 
21
  add_action('admin_menu', array( 'q2w3_fixed_widget', 'admin_init' ));
22
 
23
+ } else {
24
 
25
  add_action('template_redirect', array( 'q2w3_fixed_widget', 'init' ));
26
 
46
 
47
  public static function init() {
48
 
49
+ wp_enqueue_script('q2w3-fixed-widget', plugin_dir_url( __FILE__ ) . 'js/q2w3-fixed-widget.js', array('jquery'), '2.2');
50
 
51
  self::check_custom_ids();
52
 
102
 
103
  $array = implode(',', self::$fixed_widgets);
104
 
105
+ echo '<script type="text/javascript">'.PHP_EOL;
106
+
107
+ echo 'jQuery(document).ready(function(){'.PHP_EOL;
108
 
109
+ echo ' var q2w3_sidebar_options = { "sidebar" : "q2w3_default", "margin_top" : '. $options['margin-top'] .', "margin_bottom" : '. $options['margin-bottom'] .', "widgets" : ['. $array .'] }'.PHP_EOL;
110
+
111
+ if ( $options['refresh-interval'] > 0 ) {
112
+
113
+ echo ' setInterval(function () { q2w3_sidebar(q2w3_sidebar_options); }, '. $options['refresh-interval'] .');'.PHP_EOL;
114
+
115
+ } else {
116
 
117
+ echo ' q2w3_sidebar(q2w3_sidebar_options);'.PHP_EOL;
118
+
119
+ }
120
+
121
+ echo '});'.PHP_EOL;
122
+
123
+ echo '</script>'.PHP_EOL;
124
+
125
+ }
126
 
127
  }
128
 
182
 
183
  $d['margin-bottom'] = 0;
184
 
185
+ $d['refresh-interval'] = 1000;
186
+
187
  return $d;
188
 
189
  }
192
 
193
  $options = get_option(self::ID);
194
 
195
+ return array_merge(self::defaults(), $options);
 
 
196
 
197
  }
198
 
238
 
239
  echo '<p><span style="display: inline-block; width: 100px;">'. __('Margin Bottom:', 'q2w3_fixed_widget') .'</span><input type="text" name="'. self::ID .'[margin-bottom]" value="'. $options['margin-bottom'] .'" style="width: 50px; text-align: center;" />&nbsp;'. __('px', 'q2w3_fixed_widget') .'</p>'.PHP_EOL;
240
 
241
+ echo '<p><span style="display: inline-block; width: 100px;">'. __('Refresh interval:', 'q2w3_fixed_widget') .'</span><input type="text" name="'. self::ID .'[refresh-interval]" value="'. $options['refresh-interval'] .'" style="width: 50px; text-align: center;" />&nbsp;'. __('milliseconds', 'q2w3_fixed_widget') .' / '. __('Set 0 to disable.', 'q2w3_fixed_widget') .'</p>'.PHP_EOL;
242
+
243
  echo '<p><span >'. __('Custom HTML IDs (each one on a new line):', 'q2w3_fixed_widget') .'</span><br/><textarea name="'. self::ID .'[custom-ids]" style="width: 320px; height: 120px;">'. $options['custom-ids'] .'</textarea>'.PHP_EOL;
244
 
245
+ echo '<p><span style="display: inline-block; width: 195px;">'. __('Disable plugin on phone devices:', 'q2w3_fixed_widget') .'</span><input type="checkbox" name="'. self::ID .'[disable-phone]" value="yes" '. checked('yes', $options['disable-phone'], false) .' /></p>'.PHP_EOL;
246
 
247
+ echo '<p><span style="display: inline-block; width: 195px;">'. __('Disable plugin on tablet devices:', 'q2w3_fixed_widget') .'</span><input type="checkbox" name="'. self::ID .'[disable-tablet]" value="yes" '. checked('yes', $options['disable-tablet'], false) .' /></p>'.PHP_EOL;
248
+
249
  echo '<p class="submit"><input type="submit" class="button-primary" value="'. __('Save Changes') .'" /></p>'.PHP_EOL;
250
 
251
  echo '</form>'.PHP_EOL;
252
+
253
+ echo '<br/>'.PHP_EOL;
254
 
255
+ echo '<p><form action="https://www.paypal.com/cgi-bin/webscr" method="post"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="hosted_button_id" value="Q36H2MHNVVP7U"><input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"></form></p>'.PHP_EOL;
256
 
257
  echo '</div><!-- .wrap -->'.PHP_EOL;
258
 
q2w3-mobile-detect.php CHANGED
@@ -29,11 +29,12 @@
29
  * @link Official page: http://mobiledetect.net
30
  * GitHub Repository: https://github.com/serbanghita/Mobile-Detect
31
  * Google Code Old Page: http://code.google.com/p/php-mobile-detect/
 
32
  */
33
 
34
  class Q2W3_Mobile_Detect {
35
 
36
- protected $scriptVersion = '2.5.4';
37
 
38
  // External info.
39
  protected $userAgent = null;
@@ -47,14 +48,14 @@ class Q2W3_Mobile_Detect {
47
 
48
  // List of mobile devices (phones)
49
  protected $phoneDevices = array(
50
- 'iPhone' => '(iPhone.*Mobile|iPod|iTunes)',
51
- 'BlackBerry' => 'BlackBerry|rim[0-9]+',
52
  'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6425|001HT|Inspire 4G',
53
  'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile',
54
  // @todo: Is 'Dell Streak' a tablet or a phone? ;)
55
  'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
56
  'Motorola' => 'Motorola|\bDroid\b.*Build|DROIDX|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT909|XT910|XT912|XT928',
57
- 'Samsung' => 'Samsung|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9300 |GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-P6810|GT-P7100|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N8010',
58
  'Sony' => 'sony|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i',
59
  'Asus' => 'Asus.*Galaxy',
60
  'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex.
@@ -64,27 +65,33 @@ class Q2W3_Mobile_Detect {
64
  'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
65
  // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
66
  'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
67
- 'GenericPhone' => 'PDA;|PPC;|SAGEM|mmp|pocket|psp|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|wap|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser|LG-P500'
 
 
 
 
68
  );
69
  // List of tablet devices.
70
  protected $tabletDevices = array(
71
- 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
72
  'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
73
  'NexusTablet' => '^.*Android.*Nexus(((?:(?!Mobile))|(?:(\s(7|10).+))).)*$',
 
74
  // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/
75
  'Kindle' => 'Kindle|Silk.*Accelerated',
76
- 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|GT-P1000|GT-P1010|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P6810|GT-P7501',
 
77
  'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200',
78
  'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
79
- 'AsusTablet' => 'Transformer|TF101',
80
  'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNTV250A|LogicPD Zoom2',
81
  // @ref: http://www.acer.ro/ac/ro/RO/content/drivers
82
  // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
83
- 'AcerTablet' => 'Android.*\b(A100|A101|A200|A500|A501|A510|A700|A701|W500|W500P|W501|W501P|G100|G100W)\b',
84
  // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
85
  // @ref: http://us.toshiba.com/tablets/tablet-finder
86
  // @ref: http://www.toshiba.co.jp/regza/tablet/
87
  'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)',
 
 
88
  'YarvikTablet' => 'Android.*(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468)',
89
  'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
90
  'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT',
@@ -93,9 +100,11 @@ class Q2W3_Mobile_Detect {
93
  // @reference: http://en.wikipedia.org/wiki/NOVO7
94
  'AinolTablet' => 'NOVO7|Novo7Aurora|Novo7Basic|NOVO7PALADIN',
95
  // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
96
- 'SonyTablet' => 'Sony Tablet|Sony Tablet S',
 
 
97
  // @ref: db + http://www.cube-tablet.com/buy-products.html
98
- 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)',
99
  // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001
100
  'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
101
  // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
@@ -112,12 +121,24 @@ class Q2W3_Mobile_Detect {
112
  // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
113
  // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
114
  'HuaweiTablet' => 'MediaPad|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
115
- 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|ViewPad7|LG-V909|MID7015|BNTV250A|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|hp-tablet',
 
 
 
 
 
 
 
 
 
 
 
 
116
  );
117
  // List of mobile Operating Systems.
118
  protected $operatingSystems = array(
119
  'AndroidOS' => 'Android',
120
- 'BlackBerryOS' => 'blackberry|rim tablet os',
121
  'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
122
  'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
123
  // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
@@ -126,8 +147,7 @@ class Q2W3_Mobile_Detect {
126
  // http://wifeng.cn/?r=blog&a=view&id=106
127
  // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
128
  'WindowsPhoneOS' => 'Windows Phone OS|XBLWP7|ZuneWP7',
129
- 'iOS' => 'iphone|ipod|ipad',
130
- 'FlashLiteOS' => '',
131
  // http://en.wikipedia.org/wiki/MeeGo
132
  // @todo: research MeeGo in UAs
133
  'MeeGoOS' => 'MeeGo',
@@ -161,12 +181,15 @@ class Q2W3_Mobile_Detect {
161
  'DiigoBrowser' => 'DiigoBrowser',
162
  // http://www.puffinbrowser.com/index.php
163
  'Puffin' => 'Puffin',
 
 
164
  // @reference: http://en.wikipedia.org/wiki/Minimo
165
  // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
166
  'GenericBrowser' => 'NokiaBrowser|OviBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision'
167
  );
168
  // Utilities.
169
  protected $utilities = array(
 
170
  'WebKit' => '(webkit)[ /]([\w.]+)',
171
  'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit',
172
  'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2',
@@ -764,4 +787,4 @@ class Q2W3_Mobile_Detect {
764
  }
765
 
766
 
767
- }
29
  * @link Official page: http://mobiledetect.net
30
  * GitHub Repository: https://github.com/serbanghita/Mobile-Detect
31
  * Google Code Old Page: http://code.google.com/p/php-mobile-detect/
32
+ * @version 2.5.7
33
  */
34
 
35
  class Q2W3_Mobile_Detect {
36
 
37
+ protected $scriptVersion = '2.5.7';
38
 
39
  // External info.
40
  protected $userAgent = null;
48
 
49
  // List of mobile devices (phones)
50
  protected $phoneDevices = array(
51
+ 'iPhone' => '\biPhone.*Mobile|\biPod|\biTunes',
52
+ 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
53
  'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6425|001HT|Inspire 4G',
54
  'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile',
55
  // @todo: Is 'Dell Streak' a tablet or a phone? ;)
56
  'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
57
  'Motorola' => 'Motorola|\bDroid\b.*Build|DROIDX|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT909|XT910|XT912|XT928',
58
+ 'Samsung' => 'Samsung|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9300 |GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-P6810|GT-P7100|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N8010',
59
  'Sony' => 'sony|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i',
60
  'Asus' => 'Asus.*Galaxy',
61
  'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex.
65
  'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
66
  // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
67
  'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
68
+ // Added simvalley mobile just for fun. They have some interesting devices.
69
+ // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
70
+ 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
71
+ // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
72
+ 'GenericPhone' => 'Tapatalk|PDA;|PPC;|SAGEM|mmp|pocket|psp|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|wap|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser|LG-P500'
73
  );
74
  // List of tablet devices.
75
  protected $tabletDevices = array(
 
76
  'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
77
  'NexusTablet' => '^.*Android.*Nexus(((?:(?!Mobile))|(?:(\s(7|10).+))).)*$',
78
+ 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1010|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P6810|GT-P7501',
79
  // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/
80
  'Kindle' => 'Kindle|Silk.*Accelerated',
81
+ 'AsusTablet' => 'Transformer|TF101',
82
+ 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
83
  'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200',
84
  'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
 
85
  'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNTV250A|LogicPD Zoom2',
86
  // @ref: http://www.acer.ro/ac/ro/RO/content/drivers
87
  // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
88
+ 'AcerTablet' => 'Android.*\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71)\b',
89
  // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
90
  // @ref: http://us.toshiba.com/tablets/tablet-finder
91
  // @ref: http://www.toshiba.co.jp/regza/tablet/
92
  'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)',
93
+ // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
94
+ 'LGTablet' => '\bL-06C|LG-V900|LG-V909',
95
  'YarvikTablet' => 'Android.*(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468)',
96
  'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
97
  'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT',
100
  // @reference: http://en.wikipedia.org/wiki/NOVO7
101
  'AinolTablet' => 'NOVO7|Novo7Aurora|Novo7Basic|NOVO7PALADIN',
102
  // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
103
+ // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
104
+ // @ref: http://www.sony.jp/support/tablet/
105
+ 'SonyTablet' => 'Sony Tablet|Sony Tablet S|SGPT12|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT211|SGPT213|EBRD1101|EBRD1102|EBRD1201',
106
  // @ref: db + http://www.cube-tablet.com/buy-products.html
107
+ 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
108
  // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001
109
  'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
110
  // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
121
  // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
122
  // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
123
  'HuaweiTablet' => 'MediaPad|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
124
+ // Nec or Medias Tab
125
+ 'NecTablet' => '\bN-06D|\bN-08D',
126
+ // Broncho Tablets: http://www.broncho.cn/ (hard to find)
127
+ 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
128
+ // @ref: http://versusuk.com/support.html
129
+ 'VersusTablet' => 'TOUCHPAD.*[78910]',
130
+ // @ref: http://www.zync.in/index.php/our-products/tablet-phablets
131
+ 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
132
+ // @ref: https://www.nabitablet.com/
133
+ 'NabiTablet' => 'Android.*\bNabi',
134
+ // @note: Avoid detecting 'PLAYSTATION 3' as mobile.
135
+ 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
136
+ 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|ViewPad7|MID7015|BNTV250A|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|hp-tablet',
137
  );
138
  // List of mobile Operating Systems.
139
  protected $operatingSystems = array(
140
  'AndroidOS' => 'Android',
141
+ 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
142
  'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
143
  'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
144
  // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
147
  // http://wifeng.cn/?r=blog&a=view&id=106
148
  // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
149
  'WindowsPhoneOS' => 'Windows Phone OS|XBLWP7|ZuneWP7',
150
+ 'iOS' => '\biPhone.*Mobile|\biPod|\biPad',
 
151
  // http://en.wikipedia.org/wiki/MeeGo
152
  // @todo: research MeeGo in UAs
153
  'MeeGoOS' => 'MeeGo',
181
  'DiigoBrowser' => 'DiigoBrowser',
182
  // http://www.puffinbrowser.com/index.php
183
  'Puffin' => 'Puffin',
184
+ // @ref: http://mercury-browser.com/index.html
185
+ 'Mercury' => '\bMercury\b',
186
  // @reference: http://en.wikipedia.org/wiki/Minimo
187
  // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
188
  'GenericBrowser' => 'NokiaBrowser|OviBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision'
189
  );
190
  // Utilities.
191
  protected $utilities = array(
192
+ 'TV' => 'SonyDTV115', // experimental
193
  'WebKit' => '(webkit)[ /]([\w.]+)',
194
  'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit',
195
  'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2',
787
  }
788
 
789
 
790
+ }
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: sidebar, widget, scroll, fixed, floating, sticky, russian, q2w3
5
  Requires at least: 3.0
6
  Tested up to: 3.5.1
7
- Stable tag: 2.1
8
 
9
  Fixes positioning of the selected widgets, when the page is scrolled down.
10
 
@@ -14,9 +14,9 @@ Enable "Fixed widget" option in widget settings (see [screenshot](http://wordpre
14
 
15
  There is no problem to "Fix" (or "Stick") more than one widget in a single sidebar.
16
 
17
- On plugin settings page (Appearance -> Fixed Widget Options) you can customize top and bottom margins (see last two screenshots for description).
18
 
19
- Form version 2.1 you can define custom widget IDs and disable plugin on mobile devices.
20
  Mobile detection is based on [Mobile-Detect project](https://github.com/serbanghita/Mobile-Detect/).
21
 
22
  [Watch the demo](http://store.places-finder.com/cp-ajax-post-load).
@@ -32,6 +32,8 @@ Note two. The plugin is not working with all themes. Theme requirements:
32
  * Widgets must have unique IDs (see FAQ).
33
  * No JavaScript errors
34
 
 
 
35
  == Installation ==
36
 
37
  1. Follow standard WordPress plugin installation procedure
@@ -53,6 +55,10 @@ There are several reasons:
53
 
54
  Make sure you have updated plugin to version 2.x. Go to WP admin area, Appearance -> Fixed Widget Options. Here you can define top and bottom margins. Set bottom margin value >= footer height. Check the result.
55
 
 
 
 
 
56
  == Screenshots ==
57
 
58
  1. Widget with enabled "Fixed widget" option
@@ -67,6 +73,11 @@ Make sure you have updated plugin to version 2.x. Go to WP admin area, Appearanc
67
 
68
  == Changelog ==
69
 
 
 
 
 
 
70
  = 2.1 =
71
  * New option to define custom widget IDs for static sidebars and etc.
72
  * New option to disable plugin on mobile devices.
4
  Tags: sidebar, widget, scroll, fixed, floating, sticky, russian, q2w3
5
  Requires at least: 3.0
6
  Tested up to: 3.5.1
7
+ Stable tag: 2.2
8
 
9
  Fixes positioning of the selected widgets, when the page is scrolled down.
10
 
14
 
15
  There is no problem to "Fix" (or "Stick") more than one widget in a single sidebar.
16
 
17
+ New in version 2.2. Now the plugin is able to reflect dynamic page content changes (infinite scroll, ajax basket and other javascript stuff)!!!
18
 
19
+ New in version 2.1. Added option to disable plugin on mobile devices.
20
  Mobile detection is based on [Mobile-Detect project](https://github.com/serbanghita/Mobile-Detect/).
21
 
22
  [Watch the demo](http://store.places-finder.com/cp-ajax-post-load).
32
  * Widgets must have unique IDs (see FAQ).
33
  * No JavaScript errors
34
 
35
+ In some cases theme CSS changes required.
36
+
37
  == Installation ==
38
 
39
  1. Follow standard WordPress plugin installation procedure
55
 
56
  Make sure you have updated plugin to version 2.x. Go to WP admin area, Appearance -> Fixed Widget Options. Here you can define top and bottom margins. Set bottom margin value >= footer height. Check the result.
57
 
58
+ = What does Refresh Interval option? =
59
+
60
+ This option defines (in milliseconds, 1 sec = 1000 ms) how often plugin recalculates sticky widgets parameters. Required by sites with dynamic content (infinite scroll, image lazy load and other javascript stuff). The option have impact on the site performance (client side). Recommended values: 250 - 1500 milliseconds. If you don't have dynamic content, set Refresh interval = 0.
61
+
62
  == Screenshots ==
63
 
64
  1. Widget with enabled "Fixed widget" option
73
 
74
  == Changelog ==
75
 
76
+ = 2.2 =
77
+ * Now the plugin is able to reflect dynamic page content changes (infinite scroll, ajax basket and other javascript stuff)!!!
78
+ * Added new option to plugin settings: Refresh interval. Recommended values between 250 - 1500 milliseconds. Note: setting have impact on the site performance (client side). If you don't have dynamic content, set Refresh interval = 0.
79
+ * Mobile Detect class updated to version 2.5.7
80
+
81
  = 2.1 =
82
  * New option to define custom widget IDs for static sidebars and etc.
83
  * New option to disable plugin on mobile devices.
screenshot-2.jpg CHANGED
Binary file