From 4910b0666edeeebb18ac9682cb898dba8f22962a Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Thu, 15 Aug 2013 02:57:11 -0400
Subject: [PATCH] Distinguish mobile/tablet/touch devices

---
 program/js/list.js              |    8 ++++----
 program/js/common.js            |    8 ++++++--
 skins/larry/includes/links.html |    2 +-
 program/js/app.js               |    2 +-
 skins/larry/ui.js               |    4 ++++
 5 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 78ac4c6..dedad37 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -1731,7 +1731,7 @@
     if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) {
       row.expando = expando;
       expando.onmousedown = function(e) { return self.expand_message_row(e, uid); };
-      if (bw.mobile) {
+      if (bw.touch) {
         expando.addEventListener('touchend', function(e) {
           if (e.changedTouches.length == 1) {
             self.expand_message_row(e, uid);
diff --git a/program/js/common.js b/program/js/common.js
index de07ec1..afaf916 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -62,7 +62,7 @@
   this.safari = (!this.chrome && (this.agent_lc.indexOf('safari') > 0 || this.agent_lc.indexOf('applewebkit') > 0));
   this.konq = (this.agent_lc.indexOf('konqueror') > 0);
   this.mz = (this.dom && !this.ie && !this.ns && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0);
-  this.iphone = (this.safari && this.agent_lc.indexOf('iphone') > 0);
+  this.iphone = (this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0));
   this.ipad = (this.safari && this.agent_lc.indexOf('ipad') > 0);
   this.opera = window.opera ? true : false;
 
@@ -83,7 +83,9 @@
   if (this.safari && (/;\s+([a-z]{2})-[a-z]{2}\)/.test(this.agent_lc)))
     this.lang = RegExp.$1;
 
-  this.mobile = this.agent_lc.match(/iphone|ipad|ipod|android|blackberry|iemobile|opera mini|opera mobi/);
+  this.tablet = /ipad|android|xoom|sch-i800|playbook|tablet|kindle/i.test(this.agent_lc);
+  this.mobile = /iphone|ipod|blackberry|iemobile|opera mini|opera mobi|mobile/i.test(this.agent_lc);
+  this.touch = this.mobile || this.tablet;
   this.dhtml = ((this.ie4 && this.win) || this.ie5 || this.ie6 || this.ns4 || this.mz);
   this.vml = (this.win && this.ie && this.dom && !this.opera);
   this.pngalpha = (this.mz || (this.opera && this.vendver >= 6) || (this.ie && this.mac && this.vendver >= 5) ||
@@ -127,6 +129,8 @@
 
     if (this.mobile)
       classname += ' mobile';
+    if (this.tablet)
+      classname += ' tablet';
 
     if (document.documentElement)
       document.documentElement.className += classname;
diff --git a/program/js/list.js b/program/js/list.js
index c89c799..76582d1 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -122,7 +122,7 @@
     row.onmousedown = function(e){ return self.drag_row(e, this.uid); };
     row.onmouseup = function(e){ return self.click_row(e, this.uid); };
 
-    if (bw.mobile) {
+    if (bw.touch) {
       row.addEventListener('touchstart', function(e) {
         if (e.touches.length == 1) {
           self.touchmoved = false;
@@ -165,7 +165,7 @@
       $(this.list.tHead).replaceWith($(this.fixed_header).find('thead').clone());
       $(this.list.tHead).find('tr td').attr('style', '');  // remove fixed widths
     }
-    else if (!bw.mobile && this.list.className.indexOf('fixedheader') >= 0) {
+    else if (!bw.touch && this.list.className.indexOf('fixedheader') >= 0) {
       this.init_fixed_header();
     }
 
@@ -429,7 +429,7 @@
     this.drag_mouse_start = rcube_event.get_mouse_pos(e);
     rcube_event.add_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
     rcube_event.add_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
-    if (bw.mobile) {
+    if (bw.touch) {
       rcube_event.add_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
       rcube_event.add_listener({event:'touchend', object:this, method:'drag_mouse_up'});
     }
@@ -1370,7 +1370,7 @@
   rcube_event.remove_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
   rcube_event.remove_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
 
-  if (bw.mobile) {
+  if (bw.touch) {
     rcube_event.remove_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
     rcube_event.remove_listener({event:'touchend', object:this, method:'drag_mouse_up'});
   }
diff --git a/skins/larry/includes/links.html b/skins/larry/includes/links.html
index 5a6c8ca..69e477c 100644
--- a/skins/larry/includes/links.html
+++ b/skins/larry/includes/links.html
@@ -1,5 +1,5 @@
 <meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
-<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
+<meta name="viewport" content="" id="viewport" />
 <link rel="shortcut icon" href="/images/favicon.ico"/>
 <link rel="stylesheet" type="text/css" href="/styles.css" />
 <roundcube:if condition="in_array(env:task, array('mail','addressbook','settings'))" />
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index e5733bd..ae14d81 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -52,6 +52,10 @@
     if (parseInt(minmode) || (minmode === null && $(window).height() < 850)) {
       $(document.body).addClass('minimal');
     }
+
+    if (bw.tablet) {
+      $('#viewport').attr('content', "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0");
+    }
   }
 
 

--
Gitblit v1.9.1