Add browser detection for iPad and iPhone/iPod
[bookreader.git] / BookReaderIA / inc / BookReader.inc
index 1b2606f..56a1fd6 100644 (file)
@@ -73,7 +73,7 @@ class BookReader
   {
     // Set title to default if not set
     if (!$title) {
-        $title = 'Bookreader';
+        $title = 'BookReader';
     }
     
     $id = $identifier;
@@ -81,7 +81,12 @@ class BookReader
     // manually update with Launchpad version number at each checkin so that browsers
     // do not use old cached version
     // see https://bugs.launchpad.net/gnubook/+bug/330748
-    $version = "0.9.21";
+    $version = "r25";
+    
+    if (BookReader::getDevHost($server)) {
+        // on dev host - add time to force reload
+        $version .= '_' . time();
+    }
     
     if ("" == $id) {
         echo "No identifier specified!";
@@ -94,6 +99,8 @@ class BookReader
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html>
 <head>
+    <meta name="viewport" content="width=device-width, maximum-scale=1.0" />
+    <meta name="apple-mobile-web-app-capable" content="yes" />
     <title><? echo $title; ?></title>
 <!--[if lte IE 6]>
     <meta http-equiv="refresh" content="2; URL=/bookreader/browserunsupported.php?id=<? echo($id); ?>">
@@ -101,10 +108,13 @@ class BookReader
     <link rel="stylesheet" type="text/css" href="/bookreader/BookReader.css?v=<? echo($version); ?>">
 <? if ($uiMode == "embed") { ?>
     <link rel="stylesheet" type="text/css" href="/bookreader/BookReaderEmbed.css?v=<? echo($version); ?>">
+<? } elseif ($uiMode == "touch") { ?>
+    <link rel="stylesheet" type="text/css" href="/bookreader/touch/BookReaderTouch.css?v=<? echo($version); ?>">
 <? } /* uiMode */ ?>
-    <script src="/includes/jquery-1.3.2.min.js" type="text/javascript"></script>
-        <script type="text/javascript" src="/bookreader/BookReader.js?v=<? echo($version); ?>"></script>
-    <script type="text/javascript" src="/bookreader/jquery.easing.1.3.js"></script>
+    <script src="/includes/jquery-1.4.2.min.js" type="text/javascript"></script>
+    <script type="text/javascript" src="/bookreader/jquery-ui-1.8.1.custom.min.js"></script>
+    <script type="text/javascript" src="/bookreader/dragscrollable.js?v=<? echo($version); ?>"></script>
+    <script type="text/javascript" src="/bookreader/BookReader.js?v=<? echo($version); ?>"></script>
 </head>
 <body style="background-color: #FFFFFF;">
 
@@ -125,6 +135,7 @@ class BookReader
   brConfig["mode"] = 2;
 <? } ?>
 </script>
+<!-- The script included below is dynamically generated JavaScript that includes the book metadata and page image access functions -->
 <script type="text/javascript" src="<? echo($metaURL); ?>"></script>
 
 <? if ($uiMode == 'full') { ?>
@@ -163,22 +174,31 @@ class BookReader
   <?
     exit;
   }
+  
+  // Returns the user part of dev host from URL, or null
+  public static function getDevHost($server)
+  {
+      if (preg_match("/^www-(\w+)/", $_SERVER["SERVER_NAME"], $match)) {
+        return $match[1];
+      }
+      
+      return null;
+  }
 
   
   public static function serverBaseURL($server)
   {
-    // Check if we're on a dev vhost and point to JSIA in the user's public_html
-    // on the datanode
-    if (preg_match("/^www-(\w+)/", $_SERVER["SERVER_NAME"], $match)) {
+      // Check if we're on a dev vhost and point to JSIA in the user's public_html
+      // on the datanode
       // $$$ the remapping isn't totally automatic yet and requires user to
       //     ln -s ~/petabox/www/datanode/BookReader ~/public_html/BookReader
       //     so we enable it only for known hosts
+      $devhost = BookReader::getDevHost($server);
       $devhosts = array('mang', 'testflip', 'rkumar');
-      if (in_array($match[1], $devhosts)) {
-        $server = $server . "/~" . $match[1];
+      if (in_array($devhost, $devhosts)) {
+        $server = $server . "/~" . $devhost;
       }
-    }
-    return $server;
+      return $server;
   }
   
   
@@ -204,5 +224,76 @@ class BookReader
     return $url;
   }
   
+  // Return the URL for the requested /download/$path, or null
+  public static function getURL($path, $item) {
+    // $path should look like {itemId}/{operator}/{filename}
+    // Other operators may be added
+    
+    $parts = preg_split('#/#', $path, 3);
+    if (count($parts) != 3) {
+        return null;
+    }
+    $identifier = $parts[0];
+    $operator = $parts[1];
+    $filename = $parts[2];
+    
+    $serverBaseURL = BookReader::serverBaseURL($item->getServer());
+            
+    switch ($operator) {
+        case 'page':
+            // Find bookId and which page was requested
+            $pathParts = pathinfo($filename);
+            
+            // Look for preview request
+            if (preg_match('/^(.*)_(cover|title|preview)$/', $pathParts['filename'], $matches) === 0) {
+                return null;
+            }
+            $bookId = $matches[1];
+            $page = $matches[2];
+            $query = array(
+                'id' => $identifier,
+                'bookId' => $bookId,
+                'itemPath' => $item->getMainDir(),
+                'server' => $serverBaseURL,
+                'page' => $page,
+            );
+            return 'http://' . $serverBaseURL . '/BookReader/BookReaderPreview.php?' . http_build_query($query, '', '&');
+        
+        default:
+            return null;            
+    }
+      
+    return null; // was not handled
+  }
+  
+  // $$$ Ideally we will not rely on user agent, but for the moment we do
+  public static function paramsFromUserAgent($userAgent) {
+      $browserParams = array(
+          'ipad' => array( 'ui' => 'touch' ),
+          'iphone' => array( 'ui' => 'embed', 'mode' => '1up'),
+      );
+  
+      $browser = BookReader::browserFromUserAgent($userAgent);
+      if ($browser) {
+          return $browserParams[$browser];
+      }
+      return array();
+  }
+  
+  public static function browserFromUserAgent($userAgent) {
+      $browserPatterns = array(
+          'ipad' => '/iPad/',
+          'iphone' => '/iPhone/', // Also cover iPod Touch
+      );
+      
+      foreach ($browserPatterns as $browser => $pattern) {
+          if (preg_match($pattern, $userAgent)) {
+              return $browser;
+          }
+      }
+      return null;
+  }
+  
 }
-  ?>
+
+?>
\ No newline at end of file